
Artefact de recherche et serveur MCP qui audite les préoccupations de sécurité et de confidentialité des bots Discord tiers via une analyse à grande échelle des avis, un étiquetage par LLM et une taxonomie de 31 thèmes.
Article : Kofi Ampomah et Tu Le. Measuring Users' Security and Privacy Concerns About Third-Party Community Bots on Discord. Network and Distributed System Security (NDSS) Symposium 2027. https://dx.doi.org/10.14722/ndss.2027.230535
Évaluateurs d'artefacts : commencez par
ARTIFACT-EVALUATION.md. Il associe chaque affirmation de l'article à la commande exacte qui la reproduit, liste les sorties et temps d'exécution attendus, et précise quels composants sont hors périmètre.
Ce dépôt contient le code source du pipeline BotLens, qui analyse les préoccupations de sécurité et de confidentialité (S&P) dans les bots communautaires tiers sur Discord au moyen d'une analyse de reviews à grande échelle et d'un audit des métadonnées. Le pipeline traite 183 142 reviews d'utilisateurs portant sur 23 102 bots collectés depuis Top.gg, identifie 8 832 reviews comme pertinentes pour la S&P — soit un rendement observé du pipeline de 4,82 % — et les rattache à une taxonomie S&P de 31 thèmes.
BotLens/
├── README.md # This file
├── ARTIFACT-EVALUATION.md # Claim → command → expected output
├── LICENSE # See License below
├── CITATION.cff # How to cite (also used by Zenodo)
├── botlens-ndss-data.zip # The data; unpack to data/ (see Data below)
├── requirements-lock.txt # Exact versions used for the paper
├── requirements.txt # Looser version bounds
│
├── config/ # Pipeline configuration
│ ├── __init__.py
│ ├── settings.py # Paths, model params, thresholds
│ └── taxonomy.py # 31-theme S&P taxonomy (single source of truth)
│
├── scrapers/ # Data collection scripts
│ ├── topgg_metadata_scraper.py # Bot metadata scraper (Top.gg pages)
│ ├── topgg_reviews_scraper.py # Bot review scraper (Top.gg reviews)
│ └── discord_server_scanner.py # Server bot scanner — OUT OF SCOPE, see below
│
├── scripts/ # Pipeline stages + analysis
│ ├── stage0_preprocess.py # Merge, clean, detect language, translate
│ ├── stage1_llm_labeling.py # Binary S&P classification via Ollama
│ ├── stage1b_active_learning.py # Active learning loop
│ ├── stage2_prepare_data.py # Train/val/test splits with balancing
│ ├── stage3_finetune_deberta.py # Fine-tune DeBERTa-v3-large classifier
│ ├── stage4_classify_all.py # Classify all 183K reviews
│ ├── stage5_theme_assignment.py # Assign 31-theme taxonomy themes
│ ├── stage6_emotion_classification.py # GoEmotions → Ekman-style groups
│ ├── stage7_analysis.py # Sec. IV-A: SPRR, TPR, per-tag/per-bot tables
│ ├── stage8_visualizations.py # Figs. 2–9
│ ├── rq3_permissions_metadata.py # RQ3 (Sec. IV-D): statistics + Figs. 10–14, 18
│ ├── language_affective_analysis.py # Appendix B: Fig. 17
│ ├── experiment_labeling_pct.py # Labeling-budget experiment (10–45%)
│ ├── create_irr_sheets.py # Inter-rater reliability labeling sheets
│ ├── compute_kappa.py # Cohen's kappa (Sec. III-C3)
│ ├── check_langs.py # Language distribution (Table IV; needs raw crawl)
│ └── prep_30pct_for_al.py # Prepare labels for active learning
│
├── tests/
│ └── test_smoke.py # Fast integrity checks, no data required
│
└── mcp_server/ # BotLens MCP server (Sec. V)
├── server.py # The six tools of Sec. V-B2 (+ internal helpers)
├── example_client.py # MCP SDK client reproducing Use Cases 1 and 2
└── benchmark_latency.py # Sec. V-D latency session
Chaque figure générée par les scripts porte le nom du numéro de figure de son article
(figures/fig02_sprr_over_time.png correspond à la Fig. 2, et ainsi de suite). Les scripts produisent
exactement les figures de l'article : Figs. 2–14, 17 et 18. La Fig. 1 est le schéma
du pipeline et les Figs. 15–16 sont des captures d'écran de l'interface du rapport BotLens.
L'artefact est publié à l'adresse https://github.com/ua-spectral/BotLens. Chaque version GitHub est archivée de façon permanente sur Zenodo avec un DOI ; le DOI est indiqué dans l'annexe de l'artefact de l'article et sur la page de version du dépôt.
Les données sont fournies dans le dépôt sous la forme de botlens-ndss-data.zip (41 Mo ; un fichier
se décompresse en 515 Mo, au-delà de la limite par fichier de GitHub). Décompressez-le une fois, à la
racine du dépôt :
python -m zipfile -e botlens-ndss-data.zip .
Cela crée data/ à côté de config/ ; rien d'autre ne doit être téléchargé. L'arborescence est la suivante :
BotLens/
└── data/
├── processed/
│ ├── all_reviews_classified.csv # 183,142 rows — required by the MCP server
│ ├── privacy_reviews_full.csv # 8,832 S&P reviews w/ themes + affect
│ ├── bot_metadata_cleaned.csv # 23,102 bots (Table I, MCP fallback)
│ ├── train.csv / val.csv / test.csv
│ └── label_map.json
├── results/ # Tables behind the paper's numbers
├── reference_figures/ # Our output of every generated figure
└── irr/ # Annotator workbooks (Sec. III-C3)
Vérifiez l'intégrité avec sha256sum -c SHA256SUMS.txt depuis l'intérieur de data/.
data/README.md décrit chaque fichier.
| Étape | Script | Description | Sortie clé |
|---|---|---|---|
| 0 | stage0_preprocess.py | Fusion des avis + métadonnées, détection de langue, Argos Translate | data/raw/reviews.csv |
| 1 | stage1_llm_labeling.py | Classification binaire S&P par Ollama/Llama 3 8B | phase1_binary_labels.csv |
| 1b | stage1b_active_learning.py | Échantillonnage par incertitude + étiquettes par vote majoritaire | Jeu d'entraînement amélioré |
| 2 | stage2_prepare_data.py | Filtrage par confiance, sous-échantillonnage 5:1, découpages stratifiés | train/val/test.csv |
| 3 | stage3_finetune_deberta.py | Réglage fin de DeBERTa-v3-large (F1 = 0,938 à 30 % d'étiquetage) | best_model/ |
| 4 | stage4_classify_all.py | Inférence par lots sur les 183 142 avis | all_reviews_classified.csv |
| 5 | stage5_theme_assignment.py | Ollama attribue les thèmes de la taxonomie à 31 thèmes | privacy_reviews_themed.csv |
| 6 | stage6_emotion_classification.py | GoEmotions (RoBERTa) → 8 groupes d'affects | privacy_reviews_full.csv |
| 7 | stage7_analysis.py | SPRR, TPR, SPRR par tag et par bot, affect par thème | data/results/analysis_summary.json |
| 8 | stage8_visualizations.py | Fig. 2–9, y compris la tendance OLS de la Fig. 2 (R² = 0,35) | figures/fig02_* … fig09_* |
unassigned.