GitHub Trendingの日次・週次・月次ランキング上位10件を取得してDiscordへ通知するPython Botです。
リポジトリ名、リンク、説明文を掲載します。説明文の翻訳・要約は行いません。
取得件数が10件未満の場合、タイトルの Top N も実際の件数になります。
Python 3.10とvenvを使用します。依存パッケージは requirements.txt に記載しています。
python3.10 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
python main.py --dry-run--dry-run はGitHubから実際に取得し、Discordへ送る内容をターミナルに表示します。
Webhookの設定は不要で、Discordには送信しません。
対象期間は --period daily|weekly|monthly で選択します。省略時は daily です。
python main.py --period weekly --dry-run
python main.py --period monthly --dry-runそれぞれGitHub Trendingの since=daily / weekly / monthly を取得し、
通知タイトルを「今日」「今週」「今月」に切り替えます。
週次・月次は実行時点でGitHubが表示するランキングです。保存した日次データの集計や、
前週・前月の暦上の期間を指定した集計ではありません。
テストは通信をモックするため、ネットワークやWebhookなしで実行できます。
python -m unittest discover -s tests -vDiscordに実際に送信する場合は、環境変数 DISCORD_WEBHOOK_URL を設定して
python main.py --period daily(または weekly / monthly)を実行します。
URLは秘密情報です。ソースやログに書き込まないでください。
.env の自動読み込みはありません。
- Discordの通知先テキストチャンネルでWebhookを作成します。
- GitHubリポジトリの Settings → Secrets and variables → Actions → New repository secret
で、名前を
DISCORD_WEBHOOK_URL、値をWebhook URLとして登録します。 - Actions → Send GitHub Trending to Discord → Run workflow で
period(daily/weekly/monthly)を選んで手動実行できます。 この操作は実際にDiscordへ投稿します。
定期通知はすべてUTC 00:00(日本時間09:00)のスケジュールです。
| 対象期間 | 実行日 | cron(UTC) |
|---|---|---|
| daily | 毎日 | 0 0 * * * |
| weekly | 毎週月曜 | 0 0 * * 1 |
| monthly | 毎月1日 | 0 0 1 * * |
同じ日に実行日が重なる場合も、各期間をそれぞれ同じWebhookへ通知します。
通知の到着順は保証されません。
GitHub側の都合で実行が遅れることがあります。スケジュールはデフォルトブランチの設定を使います。
通知ジョブは10分で打ち切り、同じ期間の同時実行を直列化します。
この変更をデフォルトブランチに反映すると週次・月次の定期実行が有効になります。
Tests ワークフローはpush・pull request・手動実行でテストのみを実行し、Discordへは送信しません。
main.py: 取得、HTML解析、メッセージ分割、送信、CLI。tests/test_main.py: HTML変更、通信失敗、レート制限、文字数、CLIなどの回帰テスト。.github/workflows/daily_trending.yaml: 日次・週次・月次の定期通知と手動実行。.github/workflows/tests.yaml: 自動テスト。
接続タイムアウトは5秒、読み取りタイムアウトは20秒です。
GitHub取得ではタイムアウト・接続エラーとHTTP 429/500/502/503/504を最大3回試行します。
通常の再試行待機は1秒、2秒です。サーバーが Retry-After を返した場合はその指定に従います。
DiscordのHTTP 429では retry_after も扱います。待機指定が不正、または60秒を超える場合は異常終了します。
HTMLにリポジトリが見つからない、必要なリンクが壊れている、重複している場合は 通知せず異常終了します。説明文がない場合は「説明がありません」と表示します。 GitHubのHTML変更に自動追従するものではないため、構造変更時には解析処理の修正が必要です。
Discordのcontent上限に合わせてメッセージを2,000文字以内に分割します。
絵文字などは保守的にUTF-16の2単位として数え、説明文は切り捨てません。
各メッセージにタイトルを付け、説明文中の @everyone などによるメンション通知を無効にします。
wait=true と応答のメッセージIDで送信確認を行います。
Discord送信では接続前タイムアウトとHTTP 429のみ最大3回試行します。 読み取りタイムアウト・接続切断・HTTP 5xxなどは投稿済みの可能性があるため自動再送しません。 分割送信の途中で失敗した場合は送信確認済み件数をログに残して停止します。 再実行するとすでに送った内容も再投稿されるため、通知先を確認してから再実行してください。 実行をまたぐ重複排除や途中再開はありません。
正常終了は終了コード0、Webhook未設定・取得失敗・解析失敗・送信失敗は終了コード1です。 これによりGitHub Actionsにも失敗が反映されます。Webhook URLや応答本文はエラーログに出力しません。