twitter-relay-pain-analysis
Twitter/X Web App API relay (fa0311/twitter_api_safe_relay) を用いた、都内在住推定アカウントの「困りごと・悩み」投稿収集・ペイン深さ分類・静的ダッシュボード生成の一連パイプライン。
- License 许可
- MIT
- 所属仓库
- zapabob/Skills
- 最近更新
- 2026-10-26
- Stars
- ★ 2
- Forks
- 0
01 前言 Front Matter
- name
- twitter-relay-pain-analysis
- author
- Hermes Agent
- license
- MIT
- version
- 1.0.0
- metadata
- { "hermes": { "tags": [ "twitter", "x", "relay", "data-collection", "pain-analysis", "dashboard", "tokyo" ], "upstream_repos": [ "https://github.com/fa0311/twitter_api_safe_relay", "https://github.com/fa0311/twitter_api_safe_relay_skills" ] } }
- platforms
- [ "linux", "macos", "windows" ]
- description
- Twitter/X Web App API relay (fa0311/twitter_api_safe_relay) を用いた、都内在住推定アカウントの「困りごと・悩み」投稿収集・ペイン深さ分類・静的ダッシュボード生成の一連パイプライン。
- prerequisites
- { "env": { "TWITTER_RELAY_BASE_URL": "http://127.0.0.1:6900 (relay server)" }, "commands": [ "node", "pnpm", "python3" ] }
02 资源文件 24
- 参考文档bmad-skill-manifest.yaml12 B
- 参考文档data/design-system-guide.md8.7 KB
- 参考文档steps-c/step-01-scan-existing.md4.3 KB
- 参考文档steps-c/step-02-compare-attributes.md8.3 KB
- 参考文档steps-c/step-03-calculate-similarity.md9.4 KB
- 参考文档steps-c/step-04-identify-opportunities.md10.4 KB
- 参考文档steps-c/step-05-identify-risks.md10.6 KB
- 参考文档steps-c/step-06-present-decision.md12.5 KB
- 参考文档steps-c/step-07-execute-decision.md11.8 KB
- 参考文档steps-c/step-08a-initialize-design-system.md10.7 KB
- 参考文档steps-c/step-08b-create-new-component.md14.2 KB
- 参考文档steps-c/step-08c-update-component.md12.3 KB
- 参考文档steps-c/step-08d-add-variant.md11.1 KB
- 参考文档steps-c/step-08e-generate-catalog.md16.1 KB
- 参考文档templates/catalog.template.html12.7 KB
- 参考文档templates/component-library-config.template.md875 B
- 参考文档templates/component.template.md1.4 KB
- 参考文档templates/design-tokens.template.md2.1 KB
- 参考文档workflow-browse.md2.6 KB
- 参考文档workflow-create.md2.2 KB
- 参考文档workflow-edit.md1.8 KB
- 参考文档workflow-import.md2.1 KB
- 参考文档workflow-view.md1.7 KB
- 参考文档workflow.md3.7 KB
03 SKILL.md 正文
twitter-relay-pain-analysis
fa0311/twitter_api_safe_relay (Playwright経由でログイン済みブラウザから X Web App API を叩く HTTP relay) を使い、公式 API 制限なし・Cookie/CSRF 自動付与で検索収集し、ペイン深さ (L1–L4) 分類 → HTML ダッシュボード + 原文詳細ページを生成するクラスレベルスキル。
アーキテクチャ
twitter_api_safe_relay (port 6900)
└─ Playwright Chromium → x.com login → inject bridge → /i/api/graphql/* relay
│
▼
collect_pain_posts.py (SearchTimeline, cursor paging, Tokyo score filter)
│
▼
data/raw_posts.jsonl (NDJSON, 10k+ target)
│
▼
classify_pain.py (rule-based L1–L4 + 7 categories)
│
▼
data/classified_posts.json (summary + posts[])
│
▼
build_dashboard.py (static HTML: index.html + posts/<id>.html)
│
▼
out/ (deployable static site)
セットアップ
# 1. relay repo
git clone https://github.com/fa0311/twitter_api_safe_relay.git
cd twitter_api_safe_relay
pnpm install
pnpm build:relay
# 2. settings.json を 6900 / headless:false / user_data_dir 指定で編集
# (user_data_dir で永続プロファイル → 再ログイン不要)
# 3. 起動 → ブラウザで X ログイン
pnpm start:relay
# http://127.0.0.1:6900/health で {"status":"ok"} 確認
# 4. 収集側
export TWITTER_RELAY_BASE_URL=http://127.0.0.1:6900
python scripts/collect_pain_posts.py --probe-only
python scripts/collect_pain_posts.py --target 10000
python scripts/classify_pain.py
python scripts/build_dashboard.py
# → out/index.html
収集クエリ設計
- geocode/near: は GraphQL SearchTimeline で空になりがち → 代替:
placeキーワード in query+profile location/post-filter PLACE_HINT = '(都内 OR 東京 OR 渋谷 OR 新宿 ...)'を OR で付与- コアキーワード 14 群 × (plain / +PLACE_HINT) + 完全一致フレーズ = 30+ クエリ
-is:retweet固定、lang:ja固定product: "Latest"(逆時系列) で最新から掘る
Tokyo 推定スコアリング (0–1)
| 信号 | 重み | 条件 |
|---|---|---|
| profile.location | +0.8 | 正規表現で区・市・地名マッチ |
| tweet.place | +0.9 | X の place object |
| user.description (bio) | +0.35 | 同正規表現 |
| tweet.text | +0.45 | 本文に地名 |
| place-scoped query + 既存信号 | +0.15 | 弱い prior |
閾値既定 0.35 (調整可)。明示信号なしなら除外 (noise 排除)。
ペイン深さ分類 (L1–L4)
| Level | Label | Color | キーパターン例 |
|---|---|---|---|
| L1 | 軽度・表面 | #2563eb | めんどい, ちょっと困った, 迷う |
| L2 | 中程度 | #ca8a04 | 悩み, 相談, つらい, しんどい, 不安 |
| L3 | 深刻 | #ea580c | 限界, うつ, 借金, 失業, DV, 助けて |
| L4 | 危機・緊急 | #b91c1c | 死にたい, 消えたい, 自殺, 生きられない |
- ルールベース・説明可能・日本語特化
- 深い方が勝ち、同レベルなら weight×hit数で決着
- 長文(≥120)かつ「本当に/ずっと/何年/毎日/もう」で +1 level (上限 L3)
カテゴリ (7)
仕事・キャリア / 人間関係 / お金・生活 / 健康・メンタル / 育児・介護 / 住まい・都内生活 / 学業 / その他
レート制限・回復
- X 側 429 (Too Many Requests) → relay ログに
HTTP-429 codes:[1003] - 対処: relay 再起動 (ブラウザ再起動でセッションリフレッシュ) → 10–30 分待機 → 低速再開 (
--sleep 2.0 --page-size 20) - 同一 query で 500 連発なら query 単位でスキップ
トラブルシュート
| 現象 | 原因 | 対処 |
|---|---|---|
| relay /health ok だが 500 | ブラウザセッション切れ/rate limit | relay 再起動 → ブラウザで再ログイン |
| geocode 0件 | GraphQL 側未対応 | place keyword query + post-filter へ |
| 収集が伸びない | cursor ループで同一ページ | cursor == next_cursor で break |
| 重複除外効かない | seen set が raw_posts.jsonl から再構築 |
load_seen() で ID 抽出済み |
参照ファイル
references/collect_pain_posts.py— 収集スクリプト (SearchTimeline, paging, Tokyo score)references/classify_pain.py— 分類ルール (L1–L4, 7 categories)references/build_dashboard.py— 静的 HTML 生成 (paginated table + detail pages)references/search_timeline_template.json— relay 用リクエストテンプレ (features 固定)references/query_design.md— クエリ設計の詳細
テンプレート
templates/collect_pain_posts.py— 収集スクリプト雛形templates/classify_pain.py— 分類スクリプト雛形templates/build_dashboard.py— ダッシュボード雛形templates/search_timeline_template.json— リクエストテンプレ雛形
スクリプト
scripts/verify_relay.py— relay ヘルスチェック + SearchTimeline プローブscripts/rebuild_views.py— 分類→ダッシュボード一括再生成
04 同仓库更多 Skills
xurl
X/Twitter via xurl CLI: post, search, DM, media, v2 API.
writing-plans
Write implementation plans: bite-sized tasks, paths, code.
whisper
OpenAI's general-purpose speech recognition model. Supports 99 languages, transcription, translation to English, and language identification. Six model sizes from tiny (39M params) to large (1550M params). Use for speech-to-text, podcast transcription, or multilingual audio processing. Best for robust, multilingual ASR.
weights-and-biases
W&B: log ML experiments, sweeps, model registry, dashboards.
watchers
Poll RSS, JSON APIs, and GitHub with watermark dedup.
serving-llms-vllm
vLLM: high-throughput LLM serving, OpenAI API, quantization.