簡単！Herokuで動くTwitter botをPythonで実装する

Herokuで動くTwitter botをPythonで実装する方法を紹介します。
やり尽くされたネタだとは思いますが、2016年版ということで。

実現方法としては、Heroku上にPythonスクリプトをデプロイして、Heroku Schedulerを使ってスクリプトを定期実行します。

完成版のソースコードは以下にあります。
https://github.com/k-enomoto/minimum_twitter_bot

### この記事で説明すること
- Twitter Botの最低限のソースコード
- Herokuへのデプロイ
- Heroku Schedulerの設定

### この記事で説明しないこと
- Herokuの使い方
- pipの使い方
- Twitter APIのアカウント作成方法    

それぞれ他に詳しい記事がありますので、参考にしてください。

## ライブラリの準備
使用するライブラリをインストールします。

```sh
$ pip install python-twitter
$ pip install bottle
```

Herokuにどのライブラリを使うか教えてあげる必要があるので、 `requirements.txt` を作成します。

```sh
$ pip freeze -l > requirements.txt
```
多分こんな内容になります。

```
bottle==0.12.9
future==0.15.2
oauthlib==1.1.2
python-twitter==3.1
requests==2.10.0
requests-oauthlib==0.6.2
```

## Twitter APIにアクセスするコード
事前にTwitter APIの `consumer_key`, `consumer_secret`, `access_token_key`, `access_token_secret` を取得しておきます。
取得方法は以下の記事を参考にしてください。
[RubyでTwitter APIを使ってツイートする](http://qiita.com/enmtknt/items/b1ff3bcd5d3ef8819845)
また各キーはセキュリティの観点から、環境変数に設定します。Herokuでの環境変数の設定方法は後述します。

つぶやきの内容はWeb APIから取るなり、ご自由にアレンジしてください。

```python:tweet.py
# -*- coding: utf-8 -*-

import os
from datetime import datetime

import twitter


api = twitter.Api(consumer_key=os.environ["CONSUMER_KEY"],
                  consumer_secret=os.environ["CONSUMER_SECRET"],
                  access_token_key=os.environ["ACCESS_TOKEN_KEY"],
                  access_token_secret=os.environ["ACCESS_TOKEN_SECRET"]
                  )
api.PostUpdate("system time is %s" % datetime.now())
```

## Webアプリのコード（ダミー）
今回のポイントになる箇所です。
Herokuでプロセスを動かしておくために、ダミーのWebアプリを用意します。本記事では軽量Webフレームワークbottleを使いました。
[bottleのドキュメント](http://bottlepy.org/docs/dev/recipes.html#using-bottle-with-heroku)にあるサンプルコードをそのまま流用しています。

```python:index.py
# -*- coding: utf-8 -*-

import os
from bottle import route, run


@route("/")
def hello_world():
    return "" # ここで返す内容は何でもよい

run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)))
```

## Procfile
ProcfileにはHerokuのコンテナで実行するコマンドを記載します。
前述のダミーWebアプリを起動するコマンドを記載します。

```Procfile:Procfile
web: python index.py
```

## runtime.txt
ポイントその2です。
`runtime.txt` を作成し、使用するランタイムを記述します。

```runtime.txt
python-3.5.2
```

## デプロイ
以上で必要なファイルが揃いました。

```sh
index.py
tweet.py
requirements.txt
runtime.txt
Procfile
```

Herokuにデプロイするために、ファイルはGitで管理する必要があります。Gitにコミットします。

```sh
git add .
git commit -m "Initial commit"
```

Herokuにデプロイします。
また前述した環境変数の設定はここで行います。 `your_cosumer_key`, `your_consumer_secret`, `your_access_token_key`, `your_access_token_secret`はご自身の値に読み替えてください。

```sh
$ heroku create --stack cedar
$ git push heroku master
$ heroku config:set CONSUMER_KEY=your_cosumer_key CONSUMER_SECRET=your_consumer_secret ACCESS_TOKEN_KEY=your_access_token_key ACCESS_TOKEN_SECRET=your_access_token_secret
```

ちゃんとデプロイできているか、確認しておきます。

```sh
$　heroku logs
```

## スケジューラタスクの登録
最後に、Heroku Schedulerにタスクを登録します。
以下のコマンドを入力すると、スケジューラの登録ページが立ち上がります。

```sh
$ heroku addons:create scheduler:standard
$ heroku addons:open scheduler
```

スケジューラで実行するコマンドと、頻度を設定します。
つぶやくためのPythonスクリプトを設定しておきましょう。

```sh
$ python tweet.py
```


<img width="771" alt="scsho.png" src="https://qiita-image-store.s3.amazonaws.com/0/39720/84f1d4d6-e6ab-761f-b36d-a1cf233cac6e.png">

これでTwitter botが完成しました。