
Forschungsartefakt und MCP-Server, der Sicherheits- und Datenschutzbedenken bei Discord-Bots von Drittanbietern durch groß angelegte Bewertungsanalysen, LLM-Kennzeichnung und eine Taxonomie mit 31 Themen prüft.
Paper: Kofi Ampomah und 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
Artefakt-Prüfer: Beginnen Sie mit
ARTIFACT-EVALUATION.md. Es ordnet jede Behauptung im Paper dem exakten Befehl zu, der sie reproduziert, listet erwartete Ausgaben und Laufzeiten auf und gibt an, welche Komponenten außerhalb des Geltungsbereichs liegen.
Dieses Repository enthält den Quellcode für die BotLens-Pipeline, die Sicherheits- und Datenschutz- (S&P-)Bedenken in Community-Bots Dritter auf Discord durch groß angelegte Review-Analyse und Metadaten-Auditierung analysiert. Die Pipeline verarbeitet 183.142 Nutzerbewertungen von 23.102 Bots, die von Top.gg gescrapt wurden, identifiziert 8.832 Bewertungen als S&P-relevant — eine beobachtete Pipeline-Ausbeute von 4,82 % — und ordnet sie einer S&P-Taxonomie mit 31 Themen zu.
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
Jede Abbildung, die die Skripte schreiben, ist nach ihrer Abbildungsnummer im Paper benannt
(figures/fig02_sprr_over_time.png ist Abb. 2 und so weiter). Die Skripte erzeugen
genau die Abbildungen aus dem Paper: Abb. 2–14, 17 und 18. Abb. 1 ist das Pipeline-
Schema und Abb. 15–16 sind Screenshots der BotLens-Report-UI.
Das Artefakt wird unter https://github.com/ua-spectral/BotLens veröffentlicht. Jede GitHub- Release wird dauerhaft auf Zenodo mit einem DOI archiviert; der DOI ist im Artefakt-Anhang des Papers und auf der Release-Seite des Repositorys angegeben.
Die Daten werden im Repository als botlens-ndss-data.zip (41 MB; eine Datei
entpackt sich auf 515 MB, was das Dateilimit von GitHub überschreitet) mitgeliefert. Entpacke sie einmal im
Repository-Stammverzeichnis:
python -m zipfile -e botlens-ndss-data.zip .
Dadurch wird data/ neben config/ erstellt; es muss nichts weiter heruntergeladen werden. Die Struktur ist:
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)
Überprüfen Sie die Integrität mit sha256sum -c SHA256SUMS.txt innerhalb von data/.
data/README.md beschreibt jede Datei.
| Stufe | Skript | Beschreibung | Zentrale Ausgabe |
|---|---|---|---|
| 0 | stage0_preprocess.py | Zusammenführung von Reviews + Metadaten, Spracherkennung, Argos Translate | data/raw/reviews.csv |
| 1 | stage1_llm_labeling.py | Ollama/Llama 3 8B binäre S&P-Klassifizierung | phase1_binary_labels.csv |
| 1b | stage1b_active_learning.py | Unsicherheits-Sampling + Mehrheitsentscheidungs-Labels | Verbesserter Trainingsdatensatz |
| 2 | stage2_prepare_data.py | Konfidenzfilterung, 5:1-Downsampling, stratifizierte Aufteilungen | train/val/test.csv |
| 3 | stage3_finetune_deberta.py | DeBERTa-v3-large-Fine-Tuning (F1 = 0,938 bei 30 % Labeling) | best_model/ |
| 4 | stage4_classify_all.py | Batch-Inferenz auf allen 183.142 Reviews | all_reviews_classified.csv |
| 5 | stage5_theme_assignment.py | Ollama weist Themen der 31-Themen-Taxonomie zu | privacy_reviews_themed.csv |
| 6 | stage6_emotion_classification.py | GoEmotions (RoBERTa) → 8 Affektgruppen | privacy_reviews_full.csv |
| 7 | stage7_analysis.py | SPRR, TPR, SPRR pro Tag und pro Bot, Affekt nach Thema | data/results/analysis_summary.json |
| 8 | stage8_visualizations.py | Abb. 2–9, einschließlich des OLS-Trends aus Abb. 2 (R² = 0,35) | figures/fig02_* … fig09_* |
unassigned gekennzeichnet sind.