ひとメモ

Pythonを勉強して主にラズパイで何かするブログ

Pythonで作ったTwitterのbotをHerokuで動かす

目次

botを作ったはいいけど、それを常に動かしておく方法がわからない…。」→Herokuで解決!

Twitterbotを作るのは割と簡単なのですが、それを常に動かしておく方法が少しわかりにくいです。
なので今回はHerokuを使った定期投稿のやり方を説明していきます。
この記事ではコードやAPIキーの取得方法などの細かい説明を省いているので、わからなければ過去記事を参照してください。

hwhw.hatenablog.com

環境によって細かいところが違うので、詳しくはHerokuの公式のチュートリアルを見てください。英語ですがわかりやすいです。
Getting Started on Heroku with Python | Heroku Dev Center

Herokuにデプロイするまでの準備

Herokuのアカウントを準備する

Cloud Application Platform | Heroku
上のリンクへ行き、Herokuのアカウントを取得しておきます。制限はありますが、無料で使えます。ただしアカウントの認証にクレジットカードの登録が必要になります。

HerokuのCLIコマンドラインインターフェース)をインストールする

ほとんどの作業はターミナルを使用して進めます。そのためにまずCLIをインストールします。

公式のチュートリアルを見て進めてください。
(ラズパイの場合ですが、OSはLinux系のRaspbianなのでUbuntu/Debian系のやり方で進められるかなと思ったら無理だったので、standalone用のやり方でインストールしたらうまくいきました。
以下のようにOSはlinux, archはarmに置き換えて指定しました。forbiddenエラーみたいなのが出たらsudoで実行します。 )

wget https://cli-assets.heroku.com/branches/stable/heroku-linux-arm.tar.gz  
mkdir -p /usr/local/lib /usr/local/bin  
tar -xvzf heroku-linux-arm.tar.gz -C /usr/local/lib  
ln -s /usr/local/lib/heroku/bin/heroku /usr/local/bin/heroku

インストールできたらheroku loginでログインしておきます。

作業用フォルダを作る

ターミナルで作業用フォルダを作って、そこに移動しておきます。

mkdir 作りたいフォルダ名
cd 上で作ったフォルダ名

用意するファイル

作ったフォルダの中に、以下のファイルを入れておきます。
それぞれの中身は順番に説明します。  

  • Procfile
  • runtime.txt
  • requirements.txt
  • index.py
  • tweet.py

Procfile

Herokuにこれを動かせばいいんだよと指示するファイル。拡張子なし。

web: python index.py

runtime.txt

Pythonのバージョンを書いておくファイル。

python-3.6.1

requirements.txt

必要なモジュールを書いておくファイル。ここに書いておくと、pipからインストールしてくれます。
virtualenvの仮想環境で必要なモジュールをインストールして、pip freeze > requirements.txtとしておくと簡単。
サンプルのbotではこんな感じ。

bottle==0.12.9
certifi==2017.4.17
chardet==3.0.3
idna==2.5
oauthlib==2.0.2
requests==2.17.3
requests-oauthlib==0.8.0
urllib3==1.21.1

index.py

botとは直接関係ないけど、動作を安定させるための(?)ダミープログラム。

#coding:utf-8
import os
from bottle import route, run

@route("/")
def hello_world():
        return "hello world"

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

tweet.py

botの本体プログラム。これは後述するherokuのスケジューラで定期実行します。

# coding: utf-8 

from requests_oauthlib import OAuth1Session
import json
import os
import random
import datetime

twitter = OAuth1Session(os.environ["CONSUMER_KEY"],  os.environ["CONSUMER_SECRET"], os.environ["ACCESS_TOKEN"], os.environ["ACCESS_TOKEN_SECRET"])

tweets = ["文言1","文言2","文言3"]

randomtweet = tweets[random.randrange(len(tweets))]

timestamp = datetime.datetime.today() + datetime.timedelta(hours=9)
timestamp = str(timestamp.strftime("%Y/%m/%d %H:%M"))

params = {"status": randomtweet + " " + timestamp}
req = twitter.post("https://api.twitter.com/1.1/statuses/update.json", params = params)

デプロイする

Gitを使います。

heroku create
git add .
git commit -m "first commit"
git push heroku master

TwitterAPIキーはセキュリティ上、プログラムに直接書かずに環境変数に設定します。***部分を自分のbotAPIキーに置き換えてください。クオーテーションマークはいりません。

heroku config:set CONSUMER_KEY=*** CONSUMER_SECRET=*** ACCESS_TOKEN_KEY=*** ACCESS_TOKEN_SECRET=***

まず手動で動くか確認

heroku run python tweet.py

動いたら次へ。

スケジューラを設定する

これを設定して初めてbotが自動で動くようになります。

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

開いたらAdd new jobを押します。
すると新しいタスクができるので、$の後にpython tweet.pyと入力し、頻度などを設定しsaveすれば終わりです。やったね。

参考サイト

簡単!Herokuで動くTwitter botをPythonで実装する - Qiita
Getting Started on Heroku with Python | Heroku Dev Center
Gitを使ったバージョン管理【Gitの基本】 | サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ

おまけ(自分用メモ:virtualenvの使い方)

virtualenv hoge
source hoge/bin/activate

広告
2週間無料で見放題!DMM見放題chライト