[Python]Twitter自動投稿botを作る

 これからSNSを活用して書いたコードや制作物を公開して色々と活動をしていこうと思いTwitterを開設しようと思いました。が、飽きっぽい性格のなのでTwitterを始めてもすぐ投稿しなくなって放置or削除に幾度となくなっていたのでbotにまかせて放置してよいTwitterアカウントを作ります。

目的

・アクティブなTwitterアカウントを作成・運用する。ここでのアクティブとは1日最低3回程度はなんらかの投稿を行う状態のこと。
・Pythonコーディングの理解とSNE(github,note)へのコード公開・共有
・常駐型ソフトウェア(サーバウェア)の開発学習とnoteへの学習記録の公開・共有
・余裕があれば人工知能などの知見を得る

前提

・Pythonを実行するサーバ環境は用意がある
・Twitter DevelopperAPI取得済み
・C、C++、C#はだいたい理解しているがPythonは本格的に勉強してない

Python学習スタイル

・教本やチュートリアル・指南サイトなどゼロから始めるPython的なものを上から全部読むことはせず参考程度に利用する。
・hello worldなど簡単なコードを1行目から丁寧に読んで、処理解釈を理解する。
・importパッケージなどでサードパーティ等のライブラリ・フレームワークを積極的に使用する。そのために使用方法を調べる。

結果

scheduleを使った時刻指定の自動ツイート機能を実装した。
コード→github

解説

実装したコードをブロック別に解説する。

ライブラリインポート文

from time import sleep
import schedule
from requests_oauthlib import OAuth1Session

ここでは使用する最低限の関数だけインポートしている。
OAuthライブラリを使ってtwitterAPIを認証します。
(PythonにはTweepyなどtwitterAPI専用ライブラリがありますが、今回はOAuthで認証します)

固定変数定義


CK = 
CS = 
AT = 
AS = 
update_url = "https://api.twitter.com/1.1/statuses/update.json"

CK,CS,AT,ASは各自取得したものを代入する。(秘密鍵になるので公開できません)
twitter APIは機能別に問い合わせURLが異なる。tweet(新規つぶやき)の場合上記のupdateメソッドになる。
(参考) developer.twitter.com

tweet関数定義

def tweet():
 twitter = OAuth1Session(CK, CS, AT, AS)
 body = "tweet"
 params = {"status" : body}
 res = twitter.post(update_url, params = params)
 if res.status_code == 200:
   print("Success")
 else:
   print("code : %d"% res.status_code)

実行されるとAPIを介してtweetする関数を定義する。
[OAuth1Session]:4つの鍵を渡してセッションを開く
[body]:投稿する本文(文字列型) 
[params]:ポストする形式(おそらくJSON)に整形する
[twitter.post]:OAuth1Sessionで開通したセッションにpostする。第一引数にAPIのURL,第二引数にポストパラメータを入れる。
(第二引数に params = params と代入形式で渡されている。これは関数側に引き渡す変数名を引数内で指定している。この場合前項のparamsは関数postの持つ変数で、後項の当関数(tweet())のparamsが引き渡されることになる。元々第二引数はparamsが指定されているため、paramsだけでも動作するが処理の明確化のためparamsに代入する表現をしている。)
[res]:postした結果が格納される。※追記

 以降のif文は成功 or 失敗 の結果を表示する処理。
※このtweet関数をベースに投稿処理の関数を追加する

def morning():
 twitter = OAuth1Session(CK, CS, AT, AS)
 body = "おはよう"
 params = {"status" : body}
 res = twitter.post(update_url, params = params)
 if res.status_code == 200:
   print("Success")
 else:
   print("code : %d"% res.status_code)

上記は実行されると”おはよう”とtweetするmorning関数を定義する。

スケジュール登録

schedule.every().day.at("13:15").do(tweet)

スケジュールに登録する。上記例では毎日13時15分にtweetが実行される。
※追加例

schedule.every().day.at("13:15").do(tweet)
#追加
schedule.every().day.at("08:00").do(morning)
schedule.every(10).minutes.do(job)
・毎日午前8時に"おはよう"とtweetする(関数morning()が実行される)
・10分間隔で関数job()が実行される

がスケジュールに加えて登録される。

メインループ

while True:
 schedule.run_pending()
 sleep(300)

当コードのメイン処理、無限ループで実行処理の待ち受け状態にする。
[schedule.run_pending]:登録されたスケジュールタスクで実行保留中の処理を実行する。
[sleep]:引数秒間処理を止める。
この処理郡では300秒(5分)に一度schedule.run_pending()が実行される。
そのため、実行タイミングにより、実際にtweetされる時刻は最大5分の保留時間が加わる。
ループ間隔を短くすると実行時間の誤差は減少するが、サービスの負荷は増加する。
※スケジュール実行タイミングについての検証を別途まとめます。

次回

 Tweetの投稿時刻などの情報を取得します。