このリポジトリには、AtCoder 上でのコードゴルフの記録更新を報告する Twitter bot @atgolfer1 のスクリプトが置かれています。
$ git clone https://github.com/kmyk/atgolfer
$ cd atgolfer
$ pip3 install -e .
$ cp .env.tmp .env
$ # set ATCODER_ID and ATCODER_PASSWORD to .env
$ python3 main.py --verbose --directory=./ --use-atcoder-problems --only-abc00x
[*] load cache from ./shortest_codes.json
[*] load cache from ./latest_submission_ids.json
[*] load cache from ./last_status_id.json
[*] GET https://atcoder.jp/contests/archive?lang=ja
[*] GET https://atcoder.jp/contests/archive?lang=ja&page=1
[*] GET https://kenkoooo.com/atcoder/resources/contests.json
[*] GET https://kenkoooo.com/atcoder/resources/merged-problems.json
[*] 1/36: AtCoder Beginner Contest 001. A. 積雪深差
[*] 2/36: AtCoder Beginner Contest 001. B. 視程の通報
[*] 3/36: AtCoder Beginner Contest 001. C. 風力観測
[*] 4/36: AtCoder Beginner Contest 001. D. 感雨時刻の整理
[*] 5/36: AtCoder Beginner Contest 002. A. 正直者
[*] 6/36: AtCoder Beginner Contest 002. B. 罠
[*] 7/36: AtCoder Beginner Contest 002. C. 直訴
[*] 8/36: AtCoder Beginner Contest 002. D. 派閥
[*] 9/36: AtCoder Beginner Contest 003. A. AtCoder社の給料
...
[*] 33/36: AtCoder Beginner Contest 009. A. 引越し作業
[*] 34/36: AtCoder Beginner Contest 009. B. 心配性な富豪、ファミリーレストランに行く。
[*] 35/36: AtCoder Beginner Contest 009. C. 辞書式順序ふたたび
[*] 36/36: AtCoder Beginner Contest 009. D. 漸化式
[*] store cache to ./shortest_codes.json
[*] store cache to ./latest_submission_ids.json
[*] store cache to ./last_status_id.json
Twitter bot @atgolfer1 を運用するには、bot のための Twitter のアカウントと、5 分おきぐらいにスクリプトを実行してくれるような実行環境が必要です。 具体的には以下が必要となります。
- Twitter bot 用のアカウントを作る
- Twitter bot を自動で操作するための認証情報を得る
- スクリプトを実行するためのサーバを借りる
- そのサーバ上でスクリプトが自動実行され Twitter に投稿されるように設定をする
Twitter のアカウントは普通に作って、認証情報はいい感じにしてください。
4 つの認証情報が必要です。これらは .env
に記載してください。
$ python3 main.py --post ...
サーバについては、性能は求められないのでなんでもいいから VPS (例: VPS(仮想専用サーバー)|さくらインターネット の一番安いやつやその次に安いやつ) を借り、crontab に以下のような設定をするのがよいでしょう。
$ crontab -l
# m h dom mon dow command
0,5,10,25,30,35,40,55 * * * * flock -n /home/ubuntu/atgolfer/lock python3 /home/ubuntu/atgolfer/main.py --directory /home/ubuntu/atgolfer --post --use-atcoder-problems
15,45 * * * * flock -n /home/ubuntu/atgolfer/lock python3 /home/ubuntu/atgolfer/main.py --directory /home/ubuntu/atgolfer --post
注意点:
- いきなり
--post
を付けて実行するとすべての問題についてツイートがされてしまうので、まずは--post
なしで実行するようにする - Twitter bot は何もしていなくても「不審な挙動が……」などとアカウントが凍結されたりしがちなので注意する
TWITTER_ACCESS_TOKEN_SECRET
とかは実質パスワードなので漏らさないように注意する- AtCoder から直接スクレイピングすると遅いが、AtCoder Problems を使うとデータの取りこぼしがあるので、両方を使うようにする
- AtCoder や AtCoder Problems はメンテや負荷などでたまに落ちるので注意する
- 実行が遅くてスクリプトが重複起動してしまうと壊れるので flock などを活用する
- データを貯めているファイルに書き込み中にエラーなどで落ちるとデータが消えるので諦めるかコードを修正する
- API を使用したいアカウントにログインした状態で Twitter の Developer Portal にアクセスする
- App を作る。このとき表示される
API key
とAPI key secret
をメモする→TWITTER_CONSUMER_KEY
とTWITTER_CONSUMER_SECRET
になる - User authentication のセットアップをする。権限は Read and Write で、callback URL は
https://twitter.com
等にしておけばよい - Keys and tokens で Access Token and Secret を作る。このとき表示される
Access Token
とAccess Secret
をメモする→TWITTER_ACCESS_TOKEN
とTWITTER_ACCESS_SECRET
になる