前書き
こんにちは、はるちゃんと申します。
0.032%で「はるちゃん」になるTwitterのBotを作りました。
「は」「る」「ち」「ゃ」「ん」の五文字からランダムに5つ抽出して、ツイートするだけのBotです。
「はるちゃん」が揃う確率が (1/5)^5 = 0.032%
という訳ですね。
完成品のBotはこちらになります。
https://twitter.com/hal_cha_n_bot
導入
今回はHerokuを使用します。名前は聞いたことありますが、全く使ったことはありません。助けてください。
肝心のツイート部分とTwitterAPIを使ってリクエストを送信する部分はPythonで書きましょうか。これも使ったことありません。勉強不足の分は、まあ、有り余る才能でカバーしたいと思っております。
Heroku
チュートリアル
まずはサーバーの設定から行いましょう。Google検索能力だけ鍛えているので、いいサイトを見つけました。
Getting Started on Heroku with Python
素晴らしい。
よくわかりませんが、とにかくこれに従って進めば、PythonでWebサーバーを立てる所までできるそうですね。
Heroku CLI
Herokuの基本操作はコマンドラインから行うようです。
Heroku CLIをインストールしましょう。
CLIを入れるとherokuコマンドが使用できます。
まずはherokuにログインしましょう。ついでにアカウントもここで作りましょう。
heroku login
クローン
既にherokuがpythonのチュートリアルを用意してくれたようです。
早速クローンしましょう。
git clone https://github.com/heroku/python-getting-started.git
cd python-getting-started
デプロイ
先ほどインストールしたCLIによって幾つかコマンドが使用可能になっています。
まずはherokuのアプリを作りましょう。
heroku create
このコマンドによってheroku上にアプリが作成されます。
同時にgitのリモートにheroku
が追加されます。ここにpushすることでデプロイが可能となっています
git push heroku master
デプロイできたらブラウザで開きましょう
heroku open
やりました。これでPythonを使ってWebサーバーが出来ました。
あとでWebサーバーには消えてもらいます。
TwitterAPI
TwitterAPIにアクセスするためには以下の4つのパラメータが必要です。
- Consumer Key
- Consumer Secret
- Access Token
- Access Token Secret
Consumer系はTwitter Developerから発行することができるアプリのキーです。少々面倒ですが。
Access系はConsumerキーからアカウントを結びつけると発行出来ます。
今回はこれらのキー取得手順は割愛いたします。
Python
ではそろそろPythonやりますか。
heroku + Python
Procfileというファイルがリポジトリ内に存在しており、デプロイ時にはそこからコマンドが実行されます。
web: gunicorn gettingstarted.wsgi --log-file -
既にwebサーバーを立ち上げるコマンドが入っています。
後ほど作成するtweet.pyのファイルを起動するコマンドにしましょう。
web: python tweet.py
Tweet
そんなわけで、こちらの記事を参考にPythonのコードを組んでみました。
PythonでTwitter API を利用していろいろ遊んでみる
import json, config, random, time #標準のjsonモジュールとconfig.pyの読み込み
from requests_oauthlib import OAuth1Session #OAuthのライブラリの読み込み
CK = config.CONSUMER_KEY
CS = config.CONSUMER_SECRET
AT = config.ACCESS_TOKEN
ATS = config.ACCESS_TOKEN_SECRET
twitter = OAuth1Session(CK, CS, AT, ATS) #認証処理
url = "https://api.twitter.com/1.1/statuses/update.json" #ツイートポストエンドポイント
def tweet():
strings = ["は", "る", "ち", "ゃ", "ん"]
tweet = ""
for i in range(5):
index = random.randint(0, 4)
tweet = tweet + strings[index]
params = {"status" : tweet}
res = twitter.post(url, params = params)
if res.status_code == 200: #正常通信出来た場合
print("Success. tweeted「" + tweet + "」", flush=True)
else: #正常通信出来なかった場合
print("Failed: %d" % res.status_code, flush=True)
print("はるちゃんBot起動")
tweetedTime = time.time()
while True:
if time.time() - tweetedTime > 3600:
tweet()
tweetedTime = time.time()
1時間ごとにツイートしてくれます
requirements.txt
pythonファイルに必要なモジュールはpipなどで入れる必要がありますが、requirements.txtに記述することで自動的にインストールしてくれます。
上のコードに必要なモジュールは以下の二つです
- requests
- requests-oauthlib
これをrequirements.txtに書きます
requests
requests-oauthlib
デプロイ
これでコミットをつけてデプロイしましょう
git add --all
git commit -m "bot機能を追加"
git push heroku master
いい感じですね
タイムアウト問題
なんか起動後60秒でエラー出てきました。
Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
調査の結果Procfileにwebを使用していると、60秒以内に指定のポート番号へ接続を行わないとプロセスがキルされるようです。
https://devcenter.heroku.com/articles/dynos#web-dynos
そんなわけでポート公開が必要ないworker
を使いましょう。これdynoというんですね。
https://jp.heroku.com/dynos/configure
worker: python tweet.py
これで完璧です。
おわり
というのをYouTubeの配信で作りました。
かくして、Twitter村にまた一つくだらないBotが生まれたのです。