feat: improve twitter crawler (#186)

This commit is contained in:
Guido García 2021-03-07 21:01:31 +01:00 committed by GitHub
parent 12f4c5a03c
commit 863ad1b13f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 1635 additions and 303 deletions

View File

@ -33,6 +33,10 @@ const filenameToData = (f) => ({
"_data/general.json",
];
const twitterSummary = JSON.parse(
fs.readFileSync(`_data/twitter/summary.json`, "utf8")
);
const all = files
.map(filenameToData)
.map(({ file, id }) => ({
@ -47,6 +51,7 @@ const filenameToData = (f) => ({
url: web.url,
name: web.name,
twitter: web.twitter,
twitter_mentions: twitterSummary[web.twitter] || 0,
tags: web.tags,
}))
)

View File

@ -23,6 +23,14 @@ jobs:
- name: Request Twitter stats
env:
TWITTER_API_KEY: ${{ secrets.TWITTER_API_KEY }}
TWITTER_API_SECRET: ${{ secrets.TWITTER_API_SECRET }}
TWITTER_BEARER_TOKEN: ${{ secrets.TWITTER_BEARER_TOKEN }}
run: npm run twitter:search
- name: Update Twitter summary
run: npm run twitter:summary
# The resulting commit will not trigger another GitHub Actions Workflow run.
# This is due to limitations set by GitHub.
- uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Update information about twitter results

View File

@ -0,0 +1,6 @@
{
"meta": {
"result_count": 0
},
"_headers": {}
}

View File

@ -0,0 +1,6 @@
{
"meta": {
"result_count": 0
},
"_headers": {}
}

View File

@ -0,0 +1,852 @@
{
"data": [
{
"text": "RT @PucelaBits: Los 'Pepito Grillo' de la ciberseguridad de las webs públicas españolas.\n\nGracias @CdelCastilloM por la difusión del trabaj…",
"entities": {
"mentions": [
{
"start": 3,
"end": 14,
"username": "PucelaBits"
},
{
"start": 98,
"end": 112,
"username": "CdelCastilloM"
}
],
"annotations": [
{
"start": 21,
"end": 33,
"probability": 0.8465,
"type": "Person",
"normalized_text": "Pepito Grillo"
}
]
},
"id": "1366887578448891905"
},
{
"text": "RT @PucelaBits: Los 'Pepito Grillo' de la ciberseguridad de las webs públicas españolas.\n\nGracias @CdelCastilloM por la difusión del trabaj…",
"entities": {
"mentions": [
{
"start": 3,
"end": 14,
"username": "PucelaBits"
},
{
"start": 98,
"end": 112,
"username": "CdelCastilloM"
}
],
"annotations": [
{
"start": 21,
"end": 33,
"probability": 0.8465,
"type": "Person",
"normalized_text": "Pepito Grillo"
}
]
},
"id": "1366877019947102212"
},
{
"text": "Hola @PresiCan\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/6TxS5GqDIW\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 200,
"end": 210,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 14,
"username": "PresiCan"
},
{
"start": 216,
"end": 227,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 175,
"end": 198,
"url": "https://t.co/6TxS5GqDIW",
"expanded_url": "https://websegura.pucelabits.org/ranking/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/ranking/?pk_ca…"
}
]
},
"id": "1366849538938593287"
},
{
"text": "Hola @salutcat\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/tmegb1En1W\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 200,
"end": 210,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 14,
"username": "salutcat"
},
{
"start": 216,
"end": 227,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 175,
"end": 198,
"url": "https://t.co/tmegb1En1W",
"expanded_url": "https://websegura.pucelabits.org/w/lamevasalut!gencat!cat/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/w/lamevasalut!…",
"images": [
{
"url": "https://pbs.twimg.com/news_img/1366791851487985670/3GGBL7QN?format=png&name=orig",
"width": 320,
"height": 320
},
{
"url": "https://pbs.twimg.com/news_img/1366791851487985670/3GGBL7QN?format=png&name=150x150",
"width": 150,
"height": 150
}
],
"status": 200,
"title": "lamevasalut.gencat.cat - Observatorio de seguridad web",
"description": "¿Cómo de seguras son las webs de nuestros organismos públicos?",
"unwound_url": "https://websegura.pucelabits.org/w/lamevasalut!gencat!cat/?pk_campaign=HazseloSaber&pk_source=twitter"
}
]
},
"id": "1366791850930167812"
},
{
"text": "Hola @mitmagob\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/C3iZZONRHR\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 200,
"end": 210,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 14,
"username": "mitmagob"
},
{
"start": 216,
"end": 227,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 175,
"end": 198,
"url": "https://t.co/C3iZZONRHR",
"expanded_url": "https://websegura.pucelabits.org/w/www!mitma!gob!es/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/w/www!mitma!go…"
}
]
},
"id": "1366791405520232452"
},
{
"text": "RT @PucelaBits: Los 'Pepito Grillo' de la ciberseguridad de las webs públicas españolas.\n\nGracias @CdelCastilloM por la difusión del trabaj…",
"entities": {
"mentions": [
{
"start": 3,
"end": 14,
"username": "PucelaBits"
},
{
"start": 98,
"end": 112,
"username": "CdelCastilloM"
}
],
"annotations": [
{
"start": 21,
"end": 33,
"probability": 0.8465,
"type": "Person",
"normalized_text": "Pepito Grillo"
}
]
},
"id": "1366773463751475204"
},
{
"text": "RT @PucelaBits: Los 'Pepito Grillo' de la ciberseguridad de las webs públicas españolas.\n\nGracias @CdelCastilloM por la difusión del trabaj…",
"entities": {
"mentions": [
{
"start": 3,
"end": 14,
"username": "PucelaBits"
},
{
"start": 98,
"end": 112,
"username": "CdelCastilloM"
}
],
"annotations": [
{
"start": 21,
"end": 33,
"probability": 0.8464,
"type": "Person",
"normalized_text": "Pepito Grillo"
}
]
},
"id": "1366771264023576577"
},
{
"text": "Los 'Pepito Grillo' de la ciberseguridad de las webs públicas españolas.\n\nGracias @CdelCastilloM por la difusión del trabajo de #websegura\n\nhttps://t.co/uc62A11bXC",
"entities": {
"hashtags": [
{
"start": 128,
"end": 138,
"tag": "websegura"
}
],
"mentions": [
{
"start": 82,
"end": 96,
"username": "CdelCastilloM"
}
],
"annotations": [
{
"start": 5,
"end": 17,
"probability": 0.7644,
"type": "Person",
"normalized_text": "Pepito Grillo"
}
],
"urls": [
{
"start": 140,
"end": 163,
"url": "https://t.co/uc62A11bXC",
"expanded_url": "https://www.eldiario.es/tecnologia/tres-ingenieros-pepito-grillo-ciberseguridad-webs-publicas-espanolas_1_7252835.html",
"display_url": "eldiario.es/tecnologia/tre…"
}
]
},
"id": "1366770302504620035"
},
{
"text": "Hola @CERESfnmt\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/dBpsy9JW4T\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 201,
"end": 211,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 15,
"username": "CERESfnmt"
},
{
"start": 217,
"end": 228,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 176,
"end": 199,
"url": "https://t.co/dBpsy9JW4T",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
]
},
"id": "1366741979896381443"
},
{
"text": "Hola @Defensagob\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/dBpsy9JW4T\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 202,
"end": 212,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 16,
"username": "Defensagob"
},
{
"start": 218,
"end": 229,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 177,
"end": 200,
"url": "https://t.co/dBpsy9JW4T",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
]
},
"id": "1366741948455931904"
},
{
"text": "Hola @dominiospuntoes\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/dBpsy9JW4T\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 207,
"end": 217,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 21,
"username": "dominiospuntoes"
},
{
"start": 223,
"end": 234,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 182,
"end": 205,
"url": "https://t.co/dBpsy9JW4T",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
]
},
"id": "1366741926226112518"
},
{
"text": "Hola @boegob\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/dBpsy9JW4T\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 198,
"end": 208,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 12,
"username": "boegob"
},
{
"start": 214,
"end": 225,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 173,
"end": 196,
"url": "https://t.co/dBpsy9JW4T",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
]
},
"id": "1366741902599536643"
},
{
"text": "Hola @AEPD_es\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/dBpsy9JW4T\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 199,
"end": 209,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 13,
"username": "AEPD_es"
},
{
"start": 215,
"end": 226,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 174,
"end": 197,
"url": "https://t.co/dBpsy9JW4T",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
]
},
"id": "1366741884635348995"
},
{
"text": "Hola @policia\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/dBpsy9JW4T\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 199,
"end": 209,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 13,
"username": "policia"
},
{
"start": 215,
"end": 226,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 174,
"end": 197,
"url": "https://t.co/dBpsy9JW4T",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
]
},
"id": "1366741836690321410"
},
{
"text": "Hola @justiciagob\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/dBpsy9JW4T\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 203,
"end": 213,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 17,
"username": "justiciagob"
},
{
"start": 219,
"end": 230,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 178,
"end": 201,
"url": "https://t.co/dBpsy9JW4T",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
]
},
"id": "1366741816775761924"
},
{
"text": "Hola @LaRedIRIS\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/dBpsy9JW4T\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 201,
"end": 211,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 15,
"username": "LaRedIRIS"
},
{
"start": 217,
"end": 228,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 176,
"end": 199,
"url": "https://t.co/dBpsy9JW4T",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
]
},
"id": "1366741745648750592"
},
{
"text": "Hola @redpuntoes\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/dBpsy9JW4T\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 202,
"end": 212,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 16,
"username": "redpuntoes"
},
{
"start": 218,
"end": 229,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 177,
"end": 200,
"url": "https://t.co/dBpsy9JW4T",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
]
},
"id": "1366741722219356163"
},
{
"text": "Hola @educaciongob\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/dBpsy9JW4T\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 204,
"end": 214,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 18,
"username": "educaciongob"
},
{
"start": 220,
"end": 231,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 179,
"end": 202,
"url": "https://t.co/dBpsy9JW4T",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
]
},
"id": "1366741675461246978"
},
{
"text": "Hola @datosgob\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/dBpsy9JW4T\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 200,
"end": 210,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 14,
"username": "datosgob"
},
{
"start": 216,
"end": 227,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 175,
"end": 198,
"url": "https://t.co/dBpsy9JW4T",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
]
},
"id": "1366741644876386306"
},
{
"text": "Hola @DGTes\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/dBpsy9JW4T\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 197,
"end": 207,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 11,
"username": "DGTes"
},
{
"start": 213,
"end": 224,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 172,
"end": 195,
"url": "https://t.co/dBpsy9JW4T",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
]
},
"id": "1366741588706283521"
},
{
"text": "Hola @Congreso_Es\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/dBpsy9JW4T\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 203,
"end": 213,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 17,
"username": "Congreso_Es"
},
{
"start": 219,
"end": 230,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 178,
"end": 201,
"url": "https://t.co/dBpsy9JW4T",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
]
},
"id": "1366741470070394886"
},
{
"text": "Hola @culturagob\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/dBpsy9JW4T\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 202,
"end": 212,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 16,
"username": "culturagob"
},
{
"start": 218,
"end": 229,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 177,
"end": 200,
"url": "https://t.co/dBpsy9JW4T",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
]
},
"id": "1366741439732981767"
},
{
"text": "Hola @AppRadarCovid\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/dBpsy9JW4T\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 205,
"end": 215,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 19,
"username": "AppRadarCovid"
},
{
"start": 221,
"end": 232,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 180,
"end": 203,
"url": "https://t.co/dBpsy9JW4T",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
]
},
"id": "1366741409059979267"
},
{
"text": "Hola @guardiacivil\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/dBpsy9JW4T\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 204,
"end": 214,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 18,
"username": "guardiacivil"
},
{
"start": 220,
"end": 231,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 179,
"end": 202,
"url": "https://t.co/dBpsy9JW4T",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
]
},
"id": "1366741382589796356"
},
{
"text": "Hola @empleo_SEPE\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/dBpsy9JW4T\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 203,
"end": 213,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 17,
"username": "empleo_SEPE"
},
{
"start": 219,
"end": 230,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 178,
"end": 201,
"url": "https://t.co/dBpsy9JW4T",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
]
},
"id": "1366741349714849798"
}
],
"meta": {
"newest_id": "1366887578448891905",
"oldest_id": "1366741349714849798",
"result_count": 25
},
"_headers": {}
}

View File

@ -0,0 +1,97 @@
{
"data": [
{
"entities": {
"urls": [
{
"start": 28,
"end": 51,
"url": "https://t.co/xPBTePkmPF",
"expanded_url": "https://paper.li/legalconsultech/1559749692?edition_id=1a66f0d0-7bf5-11eb-a45b-fa163e392b9f",
"display_url": "paper.li/legalconsultec…",
"images": [
{
"url": "https://pbs.twimg.com/news_img/1367019507840081920/-j8tOWT6?format=jpg&name=orig",
"width": 982,
"height": 468
},
{
"url": "https://pbs.twimg.com/news_img/1367019507840081920/-j8tOWT6?format=jpg&name=150x150",
"width": 150,
"height": 150
}
],
"status": 200,
"title": "La Agencia Española de Protección de Datos investigará a la EMT de Valencia",
"description": "lasprovincias.es El órgano admite la reclamación del grupo municipal popular tras el dictamen de Antifraude y la auditoría de ciberseguridad",
"unwound_url": "https://paper.li/legalconsultech/1559749692?edition_id=1a66f0d0-7bf5-11eb-a45b-fa163e392b9f"
}
],
"mentions": [
{
"start": 11,
"end": 27,
"username": "legalconsultech"
},
{
"start": 69,
"end": 80,
"username": "gsantosgim"
},
{
"start": 81,
"end": 90,
"username": "Fbiurrun"
}
],
"hashtags": [
{
"start": 91,
"end": 106,
"tag": "ciberseguridad"
},
{
"start": 107,
"end": 117,
"tag": "websegura"
}
]
},
"id": "1367019506753757185",
"text": "News Brief @Legalconsultech\nhttps://t.co/xPBTePkmPF Destacamos hoy a @gsantosgim @Fbiurrun #ciberseguridad #websegura"
},
{
"entities": {
"annotations": [
{
"start": 21,
"end": 33,
"probability": 0.8465,
"type": "Person",
"normalized_text": "Pepito Grillo"
}
],
"mentions": [
{
"start": 3,
"end": 14,
"username": "PucelaBits"
},
{
"start": 98,
"end": 112,
"username": "CdelCastilloM"
}
]
},
"id": "1366902381791875075",
"text": "RT @PucelaBits: Los 'Pepito Grillo' de la ciberseguridad de las webs públicas españolas.\n\nGracias @CdelCastilloM por la difusión del trabaj…"
}
],
"meta": {
"newest_id": "1367019506753757185",
"oldest_id": "1366902381791875075",
"result_count": 2
},
"_headers": {}
}

View File

@ -0,0 +1,260 @@
{
"data": [
{
"id": "1367427731265355776",
"entities": {
"mentions": [
{
"start": 3,
"end": 12,
"username": "nukeador"
}
],
"hashtags": [
{
"start": 106,
"end": 116,
"tag": "websegura"
}
]
},
"text": "RT @nukeador: Más y más organismos poniéndose las pilas en seguridad gracias al trabajo de visibilidad de #websegura 😍"
},
{
"id": "1367427372539142146",
"entities": {
"mentions": [
{
"start": 5,
"end": 21,
"username": "AyuntamientoVLL"
},
{
"start": 223,
"end": 234,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 182,
"end": 205,
"url": "https://t.co/TvPkRfzQSY",
"expanded_url": "https://websegura.pucelabits.org/p/valladolid/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/p/valladolid/?…"
}
],
"hashtags": [
{
"start": 207,
"end": 217,
"tag": "websegura"
}
]
},
"text": "Hola @AyuntamientoVLL\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/TvPkRfzQSY\n\n#websegura /vía @PucelaBits"
},
{
"id": "1367424111601934336",
"entities": {
"mentions": [
{
"start": 5,
"end": 18,
"username": "guardiacivil"
},
{
"start": 220,
"end": 231,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 179,
"end": 202,
"url": "https://t.co/LjZ9GiziNG",
"expanded_url": "https://websegura.pucelabits.org/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/?pk_campaign=H…"
}
],
"hashtags": [
{
"start": 204,
"end": 214,
"tag": "websegura"
}
]
},
"text": "Hola @guardiacivil\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/LjZ9GiziNG\n\n#websegura /vía @PucelaBits"
},
{
"id": "1367423942978338821",
"entities": {
"mentions": [
{
"start": 5,
"end": 11,
"username": "Renfe"
},
{
"start": 213,
"end": 224,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 172,
"end": 195,
"url": "https://t.co/8C2xgMoVE8",
"expanded_url": "https://websegura.pucelabits.org/w/www!renfe!com/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/w/www!renfe!co…"
}
],
"hashtags": [
{
"start": 197,
"end": 207,
"tag": "websegura"
}
]
},
"text": "Hola @Renfe\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/8C2xgMoVE8\n\n#websegura /vía @PucelaBits"
},
{
"id": "1367422949121282056",
"entities": {
"urls": [
{
"start": 105,
"end": 128,
"url": "https://t.co/EHUBCoqKua",
"expanded_url": "https://twitter.com/PucelaBits/status/1367422034859466765",
"display_url": "twitter.com/PucelaBits/sta…"
}
],
"hashtags": [
{
"start": 92,
"end": 102,
"tag": "websegura"
}
]
},
"text": "Más y más organismos poniéndose las pilas en seguridad gracias al trabajo de visibilidad de #websegura 😍 https://t.co/EHUBCoqKua"
},
{
"id": "1367422639745204224",
"entities": {
"annotations": [
{
"start": 36,
"end": 51,
"probability": 0.9004,
"type": "Organization",
"normalized_text": "Policía Nacional"
}
],
"mentions": [
{
"start": 3,
"end": 14,
"username": "PucelaBits"
},
{
"start": 53,
"end": 61,
"username": "policia"
}
]
},
"text": "RT @PucelaBits: 🎉 Enhorabuena a la Policía Nacional (@policia) por mejorar la seguridad de su web.\n\nPasan de una C+ a una B, entrando en la…"
},
{
"id": "1367422514746560512",
"entities": {
"annotations": [
{
"start": 20,
"end": 35,
"probability": 0.887,
"type": "Organization",
"normalized_text": "Policía Nacional"
}
],
"mentions": [
{
"start": 37,
"end": 45,
"username": "policia"
}
],
"urls": [
{
"start": 148,
"end": 171,
"url": "https://t.co/bA38cRQub9",
"expanded_url": "https://websegura.pucelabits.org/w/www!policia!es/",
"display_url": "websegura.pucelabits.org/w/www!policia!…"
},
{
"start": 212,
"end": 235,
"url": "https://t.co/4oUVZNM2zV",
"expanded_url": "https://twitter.com/PucelaBits/status/1367422514746560512/photo/1",
"display_url": "pic.twitter.com/4oUVZNM2zV"
}
],
"hashtags": [
{
"start": 201,
"end": 211,
"tag": "websegura"
}
]
},
"text": "🎉 Enhorabuena a la Policía Nacional (@policia) por mejorar la seguridad de su web.\n\nPasan de una C+ a una B, entrando en la lista de webs seguras.\n\nhttps://t.co/bA38cRQub9\n\nSeguimos empujando para una #websegura https://t.co/4oUVZNM2zV"
},
{
"id": "1367410387319160833",
"entities": {
"mentions": [
{
"start": 5,
"end": 13,
"username": "MAECgob"
},
{
"start": 215,
"end": 226,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 174,
"end": 197,
"url": "https://t.co/GrNTQAEc8Y",
"expanded_url": "https://websegura.pucelabits.org/w/www!exteriores!gob!es/?pk_campaign=WebDelDia&pk_source=twitter",
"display_url": "websegura.pucelabits.org/w/www!exterior…"
}
],
"hashtags": [
{
"start": 199,
"end": 209,
"tag": "websegura"
}
]
},
"text": "Hola @MAECgob\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/GrNTQAEc8Y\n\n#websegura /vía @PucelaBits"
}
],
"meta": {
"newest_id": "1367427731265355776",
"oldest_id": "1367410387319160833",
"result_count": 8
},
"_headers": {}
}

View File

@ -0,0 +1,110 @@
{
"data": [
{
"text": "Hola @aytocifuentes\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/7B5TIWZ99D\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 205,
"end": 215,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 19,
"username": "aytocifuentes"
},
{
"start": 221,
"end": 232,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 180,
"end": 203,
"url": "https://t.co/7B5TIWZ99D",
"expanded_url": "https://websegura.pucelabits.org/p/guadalajara/?pk_campaign=HazseloSaber&pk_source=twitter",
"display_url": "websegura.pucelabits.org/p/guadalajara/…",
"images": [
{
"url": "https://pbs.twimg.com/news_img/1367911787018981383/w0bE8iTg?format=png&name=orig",
"width": 320,
"height": 320
},
{
"url": "https://pbs.twimg.com/news_img/1367911787018981383/w0bE8iTg?format=png&name=150x150",
"width": 150,
"height": 150
}
],
"status": 200,
"title": "Guadalajara - Observatorio de seguridad web",
"description": "¿Cómo de seguras son las webs de nuestros organismos públicos?",
"unwound_url": "https://websegura.pucelabits.org/p/guadalajara/?pk_campaign=HazseloSaber&pk_source=twitter"
}
]
},
"id": "1367911785588793348"
},
{
"text": "Hola @MAECgob\n\n🔒 La seguridad de vuestra web y usuarios puede ser comprometida si no actualizáis vuestras conexiones seguras (HTTPS).\n⚠ ¡Por favor, revisadlo cuanto antes!\n\nhttps://t.co/GrNTQAEc8Y\n\n#websegura /vía @PucelaBits",
"entities": {
"hashtags": [
{
"start": 199,
"end": 209,
"tag": "websegura"
}
],
"mentions": [
{
"start": 5,
"end": 13,
"username": "MAECgob"
},
{
"start": 215,
"end": 226,
"username": "PucelaBits"
}
],
"urls": [
{
"start": 174,
"end": 197,
"url": "https://t.co/GrNTQAEc8Y",
"expanded_url": "https://websegura.pucelabits.org/w/www!exteriores!gob!es/?pk_campaign=WebDelDia&pk_source=twitter",
"display_url": "websegura.pucelabits.org/w/www!exterior…",
"images": [
{
"url": "https://pbs.twimg.com/news_img/1367410391354142721/DuGb06aV?format=png&name=orig",
"width": 320,
"height": 320
},
{
"url": "https://pbs.twimg.com/news_img/1367410391354142721/DuGb06aV?format=png&name=150x150",
"width": 150,
"height": 150
}
],
"status": 200,
"title": "www.exteriores.gob.es - Observatorio de seguridad web",
"description": "¿Cómo de seguras son las webs de nuestros organismos públicos?",
"unwound_url": "https://websegura.pucelabits.org/w/www!exteriores!gob!es/?pk_campaign=WebDelDia&pk_source=twitter"
}
]
},
"id": "1367890556240728067"
}
],
"meta": {
"newest_id": "1367911785588793348",
"oldest_id": "1367890556240728067",
"result_count": 2
},
"_headers": {}
}

View File

@ -0,0 +1,25 @@
{
"PresiCan": 1,
"salutcat": 1,
"mitmagob": 1,
"CERESfnmt": 1,
"Defensagob": 1,
"dominiospuntoes": 1,
"boegob": 1,
"AEPD_es": 1,
"policia": 1,
"justiciagob": 1,
"LaRedIRIS": 1,
"redpuntoes": 1,
"educaciongob": 1,
"datosgob": 1,
"DGTes": 1,
"Congreso_Es": 1,
"culturagob": 1,
"AppRadarCovid": 1,
"guardiacivil": 2,
"empleo_SEPE": 1,
"AyuntamientoVLL": 1,
"Renfe": 1,
"aytocifuentes": 1
}

View File

@ -12,7 +12,14 @@
<ul>
<li><strong>Nombre:</strong> {{ web.name }}</li>
<li><strong>Dirección:</strong> <a href="https://{{ web.url }}">{{ web.url }}</a></li>
{% if web.twitter %}<li><strong>Twitter:</strong> <a href="https://twitter.com/{{ web.twitter }}">@{{ web.twitter }}</a></li>{% endif %}
{% if web.twitter %}
<li>
<strong>Twitter:</strong> <a href="https://twitter.com/{{ web.twitter }}">@{{ web.twitter }}</a>
{% if web.twitter_mentions > 0 %}
<em>({{ web.twitter_mentions }} menciones)</em>
{% endif %}
</li>
{% endif %}
{% if type %}
<li><strong>Ubicación:</strong> <a href="/{{ type }}/{{ parent }}">{{ location.name }}</a></li>
{% endif %}

71
crawler/twitter-search.js Normal file
View File

@ -0,0 +1,71 @@
/**
* Fichero con utilidades para realizar búsquedas en Twitter por hashtag #websegura.
* Permite buscar los resultados de un día concreto, estableciendo la variable de entorno HOW_MANY_DAYS_AGO.
* Guarda los resultados devueltos por el API de Twitter en crudo en _data/twitter/histroy para poder hacer
* un análisis con ellos.
*/
const Twitter = require('twitter-lite');
const fs = require('fs/promises');
if (!process.env.TWITTER_BEARER_TOKEN) {
console.error("Required environment variable not set TWITTER_BEARER_TOKEN");
process.exit(1);
}
async function results(daysAgo = 0) {
const client = new Twitter({
version: "2",
extension: false, // must be set to false for v2 endpoints
bearer_token: process.env.TWITTER_BEARER_TOKEN
});
const midnight = new Date();
midnight.setUTCHours(0,0,0,0);
const end = new Date(midnight - 1000 * 60 * 60 * 24 * daysAgo);
const start = new Date(end - 1000 * 60 * 60 * 24);
try {
console.log(`Request Twitter info from ${start.toISOString()} to ${end.toISOString()}`);
// Twitter API reference
// see https://developer.twitter.com/en/docs/twitter-api/tweets/search/api-reference
// XXX This code assumes we won't have more than 100 tweets with hashtag #websegura per day.
// We need to improve this code adding pagination when needed.
const tweets = await client.get("tweets/search/recent", {
"query": "#websegura",
"max_results": 100, // max = 100
"tweet.fields": "entities",
"start_time": start.toISOString(),
"end_time": end.toISOString()
});
// useful for debugging purposes only
// console.log(JSON.stringify(tweets, null, 2));
dumpRateLimitInfo(tweets);
const fileName = end.toISOString();
await fs.writeFile(`_data/twitter/history/${fileName}.json`, JSON.stringify(tweets, null, 2));
} catch (e) {
console.error('Not able to retrieve and store Twitter API results', e.errors ? JSON.stringify(e.errors) : e);
}
}
function dumpRateLimitInfo(response) {
console.log(`Rate: ${response._headers.get('x-rate-limit-remaining')} / ${response._headers.get('x-rate-limit-limit')}`);
const delta = (response._headers.get('x-rate-limit-reset') * 1000) - Date.now()
console.log(`Reset: ${Math.ceil(delta / 1000 / 60)} minutes`);
}
const HOW_MANY_DAYS_AGO = process.env.HOW_MANY_DAYS_AGO || 1; // 1 = yesterday
if (HOW_MANY_DAYS_AGO > 7) {
console.error("Twitter API does not support searching for tweets older than one week");
process.exit(1);
}
results(HOW_MANY_DAYS_AGO).catch(err => {
console.error(err);
process.exit(1);
});

View File

@ -0,0 +1,59 @@
const fs = require("fs");
const glob = require("fast-glob");
const PUCELABITS_TWITTER_USERNAME = "PucelaBits";
function getTwitterHistoryFiles() {
return glob.sync("_data/twitter/history/*.json");
}
/**
* Recorre los ficheros del histórico de Twitter para devolver
* un mapa de correspondencias entre sitio -> total_num_tweets
*/
async function summarize() {
console.log("Building Twitter summary");
const summary = getTwitterHistoryFiles()
.map(file => JSON.parse(fs.readFileSync(file)))
.flatMap(toUsernames)
.filter(x => !!x)
.reduce(countDuplicates, {});
console.log(summary);
fs.writeFileSync('_data/twitter/summary.json', JSON.stringify(summary, null, 2));
}
/**
* Filtra los tweets validos y devuelve un array donde cada elemento es el nombre de
* usuario de Twitter referenciado. Si hay varios, se queda con el primero que encuentra.
*/
function toUsernames(dailyTwitterResults) {
return dailyTwitterResults
.data?.filter(containsValidReference)
.map(tweet => tweet.entities.mentions.find(x => x.username !== PUCELABITS_TWITTER_USERNAME).username)
}
// https://stackoverflow.com/a/43530199/12388
function countDuplicates(obj, num) {
obj[num] = (++obj[num] || 1);
return obj;
}
/**
* Determina si un tweet tiene una referencia válida a websegura y forma
* parte de la campaña de difusión de la web. Así no se tienen en cuenta
* apariciones del hashtag "websegura" en otros contextos.
*/
function containsValidReference(tweet) {
const valid =
tweet.entities.hashtags?.some(x => x.tag === "websegura") &&
tweet.entities.mentions?.some(x => x.username.toLowerCase() === PUCELABITS_TWITTER_USERNAME.toLowerCase()) &&
tweet.entities.urls?.some(x => x.expanded_url.indexOf("HazseloSaber") >= 0);
return valid;
}
summarize().catch(err => {
console.error(err);
process.exit(1);
});

View File

@ -1,3 +0,0 @@
// TODO
console.log(process.env.TWITTER_API_KEY);

415
package-lock.json generated
View File

@ -13,8 +13,9 @@
"ava": "^3.15.0",
"axios": "^0.21.1",
"bottleneck": "^2.19.5",
"fast-glob": "^3.2.4",
"sass": "^1.32.5"
"fast-glob": "^3.2.5",
"sass": "^1.32.8",
"twitter-lite": "^1.1.0"
}
},
"node_modules/@11ty/dependency-tree": {
@ -67,10 +68,6 @@
},
"engines": {
"node": ">=8"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/11ty"
}
},
"node_modules/@babel/code-frame": {
@ -443,9 +440,6 @@
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/anymatch": {
@ -664,9 +658,6 @@
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/ava/node_modules/chalk": {
@ -680,9 +671,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/ava/node_modules/chalk/node_modules/ansi-styles": {
@ -695,9 +683,6 @@
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/ava/node_modules/cliui": {
@ -728,9 +713,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/ava/node_modules/globby": {
@ -748,9 +730,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/ava/node_modules/is-path-cwd": {
@ -802,9 +781,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/ava/node_modules/rimraf": {
@ -817,9 +793,6 @@
},
"bin": {
"rimraf": "bin.js"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/ava/node_modules/slash": {
@ -843,9 +816,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/ava/node_modules/wrap-ansi/node_modules/ansi-styles": {
@ -858,9 +828,6 @@
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/ava/node_modules/y18n": {
@ -964,21 +931,7 @@
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
"dev": true
},
"node_modules/base64id": {
"version": "1.0.0",
@ -1062,9 +1015,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/boxen/node_modules/camelcase": {
@ -1074,9 +1024,6 @@
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/boxen/node_modules/chalk": {
@ -1090,9 +1037,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/boxen/node_modules/type-fest": {
@ -1102,9 +1046,6 @@
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/boxen/node_modules/wrap-ansi": {
@ -1119,9 +1060,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/brace-expansion": {
@ -1237,9 +1175,6 @@
"dev": true,
"dependencies": {
"graceful-fs": "^4.1.6"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/bs-recipes": {
@ -1259,20 +1194,6 @@
"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
@ -1321,9 +1242,6 @@
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cacheable-request/node_modules/lowercase-keys": {
@ -1474,9 +1392,6 @@
"dev": true,
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cli-cursor": {
@ -1498,9 +1413,6 @@
"dev": true,
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cli-truncate": {
@ -1514,9 +1426,6 @@
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cliui": {
@ -1783,9 +1692,16 @@
"version": "2.6.12",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
"deprecated": "core-js@<3 is no longer maintained and not recommended for usage due to the number of issues. Please, upgrade your dependencies to the actual version of core-js@3.",
"dev": true
},
"node_modules/cross-fetch": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz",
"integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==",
"dev": true,
"hasInstallScript": true
"dependencies": {
"node-fetch": "2.6.1"
}
},
"node_modules/crypto-random-string": {
"version": "2.0.0",
@ -1827,11 +1743,6 @@
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/decamelize": {
@ -2040,7 +1951,6 @@
"resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz",
"integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==",
"dev": true,
"hasInstallScript": true,
"engines": {
"node": ">=0.10.0"
}
@ -2058,9 +1968,6 @@
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sindresorhus/emittery?sponsor=1"
}
},
"node_modules/emoji-regex": {
@ -2164,18 +2071,6 @@
"dev": true,
"engines": {
"node": ">=8.3.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": "^5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
},
"node_modules/engine.io-parser": {
@ -2331,9 +2226,9 @@
"dev": true
},
"node_modules/fast-glob": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
"integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
"version": "3.2.5",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
"integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
"dev": true,
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
@ -2348,9 +2243,9 @@
}
},
"node_modules/fastq": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz",
"integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==",
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz",
"integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==",
"dev": true,
"dependencies": {
"reusify": "^1.0.4"
@ -2366,9 +2261,6 @@
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/fill-range": {
@ -2434,19 +2326,8 @@
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz",
"integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==",
"dev": true,
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/fresh": {
@ -2483,7 +2364,6 @@
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz",
"integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==",
"dev": true,
"hasInstallScript": true,
"optional": true,
"os": [
"darwin"
@ -2534,9 +2414,6 @@
},
"engines": {
"node": "*"
},
"funding": {
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/glob-parent": {
@ -2561,9 +2438,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/global-dirs/node_modules/ini": {
@ -2757,9 +2631,6 @@
"dev": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-yarn": {
@ -2838,21 +2709,7 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
"dev": true
},
"node_modules/ignore": {
"version": "5.1.8",
@ -3017,9 +2874,6 @@
"dev": true,
"dependencies": {
"has": "^1.0.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-error": {
@ -3088,9 +2942,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-installed-globally/node_modules/is-path-inside": {
@ -3118,9 +2969,6 @@
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/is-number": {
@ -3208,9 +3056,6 @@
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-relative": {
@ -3368,9 +3213,6 @@
"dev": true,
"dependencies": {
"graceful-fs": "^4.1.6"
},
"optionalDependencies": {
"graceful-fs": "^4.1.6"
}
},
"node_modules/jstransformer": {
@ -3527,9 +3369,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
"node_modules/localtunnel/node_modules/y18n": {
@ -3615,9 +3454,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/longest": {
@ -3649,9 +3485,9 @@
}
},
"node_modules/luxon": {
"version": "1.25.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-1.25.0.tgz",
"integrity": "sha512-hEgLurSH8kQRjY6i4YLey+mcKVAWXbDNlZRmM6AgWDJ1cY3atl8Ztf5wEY7VBReFbmGnwQPz7KYJblL8B2k0jQ==",
"version": "1.26.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-1.26.0.tgz",
"integrity": "sha512-+V5QIQ5f6CDXQpWNICELwjwuHdqeJM1UenlZWx5ujcRMc9venvluCjFb4t5NYLhb6IhkbMVOxzVuOqkgMxee2A==",
"dev": true,
"engines": {
"node": "*"
@ -3667,9 +3503,6 @@
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/make-dir/node_modules/semver": {
@ -3737,9 +3570,6 @@
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/maximatch": {
@ -3816,9 +3646,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sindresorhus/mem?sponsor=1"
}
},
"node_modules/merge2": {
@ -3982,6 +3809,15 @@
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true
},
"node_modules/node-fetch": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
"dev": true,
"engines": {
"node": "4.x || >=6.0.0"
}
},
"node_modules/nopt": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
@ -4052,11 +3888,14 @@
},
"engines": {
"node": ">= 6.9.0"
},
"optionalDependencies": {
"chokidar": "^3.3.0"
}
},
"node_modules/oauth-1.0a": {
"version": "2.2.6",
"resolved": "https://registry.npmjs.org/oauth-1.0a/-/oauth-1.0a-2.2.6.tgz",
"integrity": "sha512-6bkxv3N4Gu5lty4viIcIAnq5GbxECviMBeKR3WX/q87SPQ8E8aursPZUtsXDnxCs787af09WPRBLqYrf/lwoYQ==",
"dev": true
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@ -4103,9 +3942,6 @@
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/onetime/node_modules/mimic-fn": {
@ -4152,9 +3988,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/ora/node_modules/chalk": {
@ -4168,9 +4001,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/p-cancelable": {
@ -4201,9 +4031,6 @@
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-finally": {
@ -4225,9 +4052,6 @@
},
"engines": {
"node": ">=6"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-locate": {
@ -4252,9 +4076,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/p-timeout": {
@ -4426,9 +4247,6 @@
"dev": true,
"engines": {
"node": ">=8.6"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/pify": {
@ -4551,9 +4369,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/portscanner": {
@ -4862,6 +4677,12 @@
"node": ">=0.6"
}
},
"node_modules/queue-microtask": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz",
"integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==",
"dev": true
},
"node_modules/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@ -4929,9 +4750,6 @@
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/read-pkg/node_modules/type-fest": {
@ -5067,9 +4885,6 @@
"dependencies": {
"is-core-module": "^2.1.0",
"path-parse": "^1.0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/resolve-cwd": {
@ -5178,24 +4993,13 @@
}
},
"node_modules/run-parallel": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz",
"integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==",
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
"dependencies": {
"queue-microtask": "^1.2.2"
}
},
"node_modules/rx": {
"version": "4.1.0",
@ -5228,9 +5032,9 @@
"dev": true
},
"node_modules/sass": {
"version": "1.32.5",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.32.5.tgz",
"integrity": "sha512-kU1yJ5zUAmPxr7f3q0YXTAd1oZjSR1g3tYyv+xu0HZSl5JiNOaE987eiz7wCUvbm4I9fGWGU2TgApTtcP4GMNQ==",
"version": "1.32.8",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.32.8.tgz",
"integrity": "sha512-Sl6mIeGpzjIUZqvKnKETfMf0iDAswD9TNlv13A7aAF3XZlRPMq4VvJWBC2N2DXbp94MQVdNSFG6LfF/iOXrPHQ==",
"dev": true,
"dependencies": {
"chokidar": ">=2.0.0 <4.0.0"
@ -5400,9 +5204,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/serialize-error/node_modules/type-fest": {
@ -5412,9 +5213,6 @@
"dev": true,
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/serve-index": {
@ -5862,21 +5660,7 @@
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true,
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
"dev": true
},
"node_modules/string-width": {
"version": "4.2.0",
@ -6167,6 +5951,16 @@
"node": ">=0.10.0"
}
},
"node_modules/twitter-lite": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/twitter-lite/-/twitter-lite-1.1.0.tgz",
"integrity": "sha512-v37I0zyYXjn3/zdm/ii+1RiBFZ2SCB3wLl1N5nfW8TUqoNDYBR66oXBFbQavKEvjg5WqcTUzNhAhe6FkgylPsw==",
"dev": true,
"dependencies": {
"cross-fetch": "^3.0.0",
"oauth-1.0a": "^2.2.4"
}
},
"node_modules/type-fest": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",
@ -6288,9 +6082,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/yeoman/update-notifier?sponsor=1"
}
},
"node_modules/update-notifier/node_modules/chalk": {
@ -6304,9 +6095,6 @@
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/url-parse-lax": {
@ -7949,6 +7737,15 @@
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
"dev": true
},
"cross-fetch": {
"version": "3.0.6",
"resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.0.6.tgz",
"integrity": "sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ==",
"dev": true,
"requires": {
"node-fetch": "2.6.1"
}
},
"crypto-random-string": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
@ -8267,8 +8064,7 @@
"version": "7.4.2",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz",
"integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==",
"dev": true,
"requires": {}
"dev": true
}
}
},
@ -8379,9 +8175,9 @@
"dev": true
},
"fast-glob": {
"version": "3.2.4",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz",
"integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==",
"version": "3.2.5",
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz",
"integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==",
"dev": true,
"requires": {
"@nodelib/fs.stat": "^2.0.2",
@ -8393,9 +8189,9 @@
}
},
"fastq": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz",
"integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==",
"version": "1.11.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz",
"integrity": "sha512-7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==",
"dev": true,
"requires": {
"reusify": "^1.0.4"
@ -9387,9 +9183,9 @@
}
},
"luxon": {
"version": "1.25.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-1.25.0.tgz",
"integrity": "sha512-hEgLurSH8kQRjY6i4YLey+mcKVAWXbDNlZRmM6AgWDJ1cY3atl8Ztf5wEY7VBReFbmGnwQPz7KYJblL8B2k0jQ==",
"version": "1.26.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-1.26.0.tgz",
"integrity": "sha512-+V5QIQ5f6CDXQpWNICELwjwuHdqeJM1UenlZWx5ujcRMc9venvluCjFb4t5NYLhb6IhkbMVOxzVuOqkgMxee2A==",
"dev": true
},
"make-dir": {
@ -9633,6 +9429,12 @@
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true
},
"node-fetch": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
"dev": true
},
"nopt": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
@ -9686,6 +9488,12 @@
"commander": "^5.1.0"
}
},
"oauth-1.0a": {
"version": "2.2.6",
"resolved": "https://registry.npmjs.org/oauth-1.0a/-/oauth-1.0a-2.2.6.tgz",
"integrity": "sha512-6bkxv3N4Gu5lty4viIcIAnq5GbxECviMBeKR3WX/q87SPQ8E8aursPZUtsXDnxCs787af09WPRBLqYrf/lwoYQ==",
"dev": true
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@ -10323,6 +10131,12 @@
"integrity": "sha1-HPyyXBCpsrSDBT/zn138kjOQjP4=",
"dev": true
},
"queue-microtask": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz",
"integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==",
"dev": true
},
"range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@ -10578,10 +10392,13 @@
}
},
"run-parallel": {
"version": "1.1.10",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz",
"integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==",
"dev": true
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
"dev": true,
"requires": {
"queue-microtask": "^1.2.2"
}
},
"rx": {
"version": "4.1.0",
@ -10611,9 +10428,9 @@
"dev": true
},
"sass": {
"version": "1.32.5",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.32.5.tgz",
"integrity": "sha512-kU1yJ5zUAmPxr7f3q0YXTAd1oZjSR1g3tYyv+xu0HZSl5JiNOaE987eiz7wCUvbm4I9fGWGU2TgApTtcP4GMNQ==",
"version": "1.32.8",
"resolved": "https://registry.npmjs.org/sass/-/sass-1.32.8.tgz",
"integrity": "sha512-Sl6mIeGpzjIUZqvKnKETfMf0iDAswD9TNlv13A7aAF3XZlRPMq4VvJWBC2N2DXbp94MQVdNSFG6LfF/iOXrPHQ==",
"dev": true,
"requires": {
"chokidar": ">=2.0.0 <4.0.0"
@ -11403,6 +11220,16 @@
"integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=",
"dev": true
},
"twitter-lite": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/twitter-lite/-/twitter-lite-1.1.0.tgz",
"integrity": "sha512-v37I0zyYXjn3/zdm/ii+1RiBFZ2SCB3wLl1N5nfW8TUqoNDYBR66oXBFbQavKEvjg5WqcTUzNhAhe6FkgylPsw==",
"dev": true,
"requires": {
"cross-fetch": "^3.0.0",
"oauth-1.0a": "^2.2.4"
}
},
"type-fest": {
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz",

View File

@ -11,7 +11,8 @@
"crawl:analyze": "node crawler/analyze.js",
"crawl:results": "node crawler/results.js",
"crawl": "npm run crawl:analyze && sleep 60 && npm run crawl:results",
"twitter:search": "node crawler/twitter.js",
"twitter:search": "node crawler/twitter-search.js",
"twitter:summary": "node crawler/twitter-summary.js",
"test": "ava"
},
"repository": {
@ -29,8 +30,9 @@
"ava": "^3.15.0",
"axios": "^0.21.1",
"bottleneck": "^2.19.5",
"fast-glob": "^3.2.4",
"sass": "^1.32.5"
"fast-glob": "^3.2.5",
"sass": "^1.32.8",
"twitter-lite": "^1.1.0"
},
"ava": {
"files": [