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


# 前書き
こんにちは、はるちゃんと申します。
0.032%で「はるちゃん」になるTwitterのBotを作りました。
「は」「る」「ち」「ゃ」「ん」の五文字からランダムに5つ抽出して、ツイートするだけのBotです。
「はるちゃん」が揃う確率が `(1/5)^5 = 0.032%` という訳ですね。

完成品のBotはこちらになります。
https://twitter.com/hal_cha_n_bot

# 導入
今回は[Heroku](https://jp.heroku.com/)を使用します。名前は聞いたことありますが、全く使ったことはありません。助けてください。

肝心のツイート部分とTwitterAPIを使ってリクエストを送信する部分はPythonで書きましょうか。これも使ったことありません。勉強不足の分は、まあ、有り余る才能でカバーしたいと思っております。


# Heroku
## チュートリアル
まずはサーバーの設定から行いましょう。Google検索能力だけ鍛えているので、いいサイトを見つけました。

[Getting Started on Heroku with Python](https://devcenter.heroku.com/articles/getting-started-with-python)
<img width="1001" alt="スクリーンショット 2019-06-23 18.42.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297541/cfeb5727-49fd-a625-9627-d70d7606a20a.png">

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

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

<img width="763" alt="スクリーンショット 2019-06-23 18.46.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297541/70d7ce2b-68a7-c3ee-eb34-c1f15cecff94.png">

CLIを入れるとherokuコマンドが使用できます。
まずはherokuにログインしましょう。ついでにアカウントもここで作りましょう。

```console
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](https://developer.twitter.com/en/apps)から発行することができるアプリのキーです。少々面倒ですが。
Access系はConsumerキーからアカウントを結びつけると発行出来ます。
今回はこれらのキー取得手順は割愛いたします。


# Python
ではそろそろPythonやりますか。

##  heroku + Python

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

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

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

```console:Procfile 
web: python tweet.py
```

## Tweet
そんなわけで、こちらの記事を参考にPythonのコードを組んでみました。
[PythonでTwitter API を利用していろいろ遊んでみる](https://qiita.com/bakira/items/00743d10ec42993f85eb)

```python: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に書きます

```console:requirements.txt 
requests
requests-oauthlib
``` 

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

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

<img width="452" alt="スクリーンショット 2019-06-23 20.23.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297541/12481144-126a-c6c8-82c7-8a0cb521b73d.png">


いい感じですね

# タイムアウト問題

なんか起動後60秒でエラー出てきました。

```console
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

```console:Procfile 
worker: python tweet.py
```

これで完璧です。

# おわり
というのをYouTubeの[配信](https://www.youtube.com/watch?v=fFD85aw_Fxg)で作りました。
かくして、Twitter村にまた一つくだらないBotが生まれたのです。