LoginSignup
9
3

More than 3 years have passed since last update.

〇%で〇〇になるBotを作った話

Posted at

前書き

こんにちは、はるちゃんと申します。
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
スクリーンショット 2019-06-23 18.42.39.png

素晴らしい。
よくわかりませんが、とにかくこれに従って進めば、PythonでWebサーバーを立てる所までできるそうですね。

Heroku CLI

Herokuの基本操作はコマンドラインから行うようです。
Heroku CLIをインストールしましょう。

スクリーンショット 2019-06-23 18.46.36.png

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というファイルがリポジトリ内に存在しており、デプロイ時にはそこからコマンドが実行されます。

Procfile
web: gunicorn gettingstarted.wsgi --log-file -

既にwebサーバーを立ち上げるコマンドが入っています。
後ほど作成するtweet.pyのファイルを起動するコマンドにしましょう。

Procfile
web: python tweet.py

Tweet

そんなわけで、こちらの記事を参考にPythonのコードを組んでみました。
PythonでTwitter API を利用していろいろ遊んでみる

tweet.py
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に書きます

requirements.txt
requests
requests-oauthlib

デプロイ

これでコミットをつけてデプロイしましょう

git add --all
git commit -m "bot機能を追加"
git push heroku master

スクリーンショット 2019-06-23 20.23.43.png

いい感じですね

タイムアウト問題

なんか起動後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

Procfile
worker: python tweet.py

これで完璧です。

おわり

というのをYouTubeの配信で作りました。
かくして、Twitter村にまた一つくだらないBotが生まれたのです。

9
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
3