ミスミメンテbotを改良した~pythonで直接ツイート~
前作ったこれを改良しました
- 上記記事でiftttというサービスを利用して簡単なbotを作った
- おかげ様でわりと見てもらってるぽい(うれしい)
- 調整作業をしたり,意見をもらう中で改善点がたまってきたので改良することにした
今回作ったもの
メンテがあるときつぶやくbot twitter.com
メンテがないときつぶやくbot twitter.com
実際のツイート
#ミスミメンテ
— ミスミメンテおしらせbot《非公式》 (@misumi_mainte) July 6, 2019
Start:7/7 10:00
Goal:7/8 8:00
https://t.co/C2VY3rgPcZ
#ミスミ pic.twitter.com/wh2rNLfDv4
メンテ中だよ
— ミスミメンテないよbot《非公式》 (@misumi_nomainte) July 7, 2019
https://t.co/Mubq0qT9Me
#ミスミ #ミスミメンテ pic.twitter.com/c2S5azhx4o
前回からの改善点
- メンテがあるときとないときのアカウントを分けた
- ツイートのpush通知をONにして使ってもうるさくない(利用者にうれしい)
- ツイート内容のカスタマイズが楽になった(私がうれしい)
- プログラム上で直接ツイート内容を記述・投稿できるようにした
- これに伴いツイート内容に渡せる引数の数の制限もなくなった
なぜわざわざ作り直したのか・今回の目標
- 2019年3月から運用を続けた結果,以下のように改善点・不満点がたくさんでてきた.
つまり今回やりたいこと:iftttを使わずに複数アカウントからツイートできるようにする
Step1. システムのしくみ
- iftttを利用しないしくみに変えた.
- 同時にメンテの有無によってアカウントを分けるように変更した.
以前のシステム
新しいシステム
Step2. プログラムからのツイート
Twitter appの作成とアクセストークンの取得
- ↓にbotにしたいTwitterアカウントごとに登録する
- ぐぐると↓みたいな解説ページが出てくるのでそのとおりにやるのが楽.
- 【2019年1月最新版】新しくなったTwitterのAPIの登録方法と使い方。Developer登録をしてAPI keyを取得するまでの手順を公開!RailsもPythonも対応可能!|Data Science Navi
- 頻繁に操作画面が変わるようなので最新の記事を参照することに注意.
- 公式ドキュメントにちゃんとした説明がのっている↓
Consumer Key Consumer Secret Access Token Accesss Token Secert
の4つの英数字列がアクセストークンで,これをあとで使う.
python3からのツイート
- 前記事のpython3で書いたメンテ判定のプログラムを使いたい為,python3を利用する前提で作成.
基本的なしくみ
これ↓を参考にした.
上で紹介されているコードで使われているライブラリが↓.
requests-oauthlib.readthedocs.io
Requests-OAuthlib uses the Python Requests and OAuthlib libraries to provide an easy-to-use Python interface for building OAuth1 and OAuth2 clients.
というものらしく, pythonで画像付きツイートをしたい人はだいたいこれを使っていた.
複数アカウント対応
一つのコードから複数のアカウントを利用するので,アカウント切り替えがしやすいように整備.
アクセストークンの登録
入れ子にした辞書型を使うと便利.
以下のように別ファイルsecret_cactus.py
に記述.
twDict = {'mainte':{ 'consumer_key' : 'xxxxxxxxxxxxxxxx', 'consumer_secret' : 'xxxxxxxxxxxxxxxx', 'access_token_key' : 'xxxxxxxxxxxxxxxx', 'access_token_secret' : 'xxxxxxxxxxxxxxxx' }, 'nomainte':{ 'consumer_key' : 'xxxxxxxxxxxxxxxx', 'consumer_secret' : 'xxxxxxxxxxxxxxxx', 'access_token_key' : 'xxxxxxxxxxxxxxxx', 'access_token_secret' : 'xxxxxxxxxxxxxxxx' } }
これを以下のように取り込む.
(別ファイルimportだけして直接右辺の形で使ってもよいのだが,長くなるので以下のようにした)
import secret_cactus pw = {} pw['mainte'] = secret_cactus.twDict['mainte'] pw['nomainte'] = secret_cactus.twDict['nomainte']
ツイート関数
先述の記事を参考にしてアカウント切り替えがしやすい関数を作成した.
以下のように添付画像pic
,投稿文字列message
に加えアカウント名tw_ac
を引数にとる関数を作成.引数で指定したアカウントのトークンを辞書から探してきてOAuth認証する.
def tweet_with_pic(tw_ac, pic, message): # 文字列,文字列,文字列 # OAuth認証 セッションを開始 tweet_ac = OAuth1Session(pw[tw_ac]['consumer_key'], pw[tw_ac]['consumer_secret'], pw[tw_ac]['access_token_key'], pw[tw_ac]['access_token_secret']) # 画像投稿 files = {"media" : open(pic, 'rb')} req_media = tweet_ac.post(url_media, files = files) # レスポンスを確認 if req_media.status_code != 200: print ("画像アップデート失敗: %s", req_media.text) exit() # Media ID を取得 media_id = json.loads(req_media.text)['media_id'] print ("Media ID: %d" % media_id) # Media ID を付加してテキストを投稿 params = {'status': message, "media_ids": [media_id]} req_media = tweet_ac.post(url_text, params = params) # 再びレスポンスを確認 if req_media.status_code != 200: print ("テキストアップデート失敗: %s", req_text.text) exit() print ("OK")
プログラムの定期自動実行
と同じくherokuを利用.
利用するライブラリが増えたら忘れずにrequirements.txtに書き足すことに注意.
Step3. できたコード全体
以前のプログラムをベースに作成したもの. メンテ予告メッセージ取得や状況に応じた投稿内容はほぼそのまま.
- 本体
- requirements.txt
django gunicorn django-heroku lxml requests requests_oauthlib
参考文献
OAuthのイメージがわかりやすかった記事 https://qiita.com/TakahikoKawasaki/items/e37caf50776e00e733be