TwitterのREST APIについて その9(AWSへのPython3導入と自動化まで)
こんにちは!こんばんは、みんろです!
ただ、前回までに紹介したLog吐き出しがエラーになったりしたので、そこらへんも含めて解説・紹介していきますよ!
【前回】TwitterのREST APIについて その8(AWSからツイート操作まで)
https://minro-blog.info/system/develop/twitter-api-8/
AWSサーバで定期実行するファイルを転送して、実行テストを行う
①PythonファイルをAWSサーバに転送する。
今回は、下記の2ファイルを転送します。ソースコードは下記の通り。
# -*- coding: utf-8 -*- import json, config, log #標準のjsonモジュールとconfig.pyの読み込み import datetime 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) #認証処理 #searchURL searchurl = "https://api.twitter.com/1.1/search/tweets.json" #followURL favoriteurl = "https://api.twitter.com/1.1/favorites/create.json" #tweet_researchURL tweeturl = "https://api.twitter.com/1.1/statuses/show.json" #favorite logic def favorite(tweet_id): #follow params params = {"id" : tweet_id} #request_follow favorite_res = twitter.post(favoriteurl, params = params) #post送信 #responsrog log.favoritelog(json.dumps(json.loads(favorite_res.text), ensure_ascii=False)) if favorite_res.status_code == 200: #正常投稿出来た場合 log.standard("Favorite Success") else: #正常投稿出来なかった場合 log.standard("Failed. : %d"% favorite_res.status_code) return; #tweet_research logic def tweet_research(tweet_id): #follow params params = {'id' : tweet_id} #request_tweet_research research_req = twitter.get(tweeturl, params = params) if research_req.status_code == 200: search_tweet = json.loads(research_req.text) log.tweet_research(json.dumps(search_tweet, ensure_ascii=False)) if search_tweet['favorited'] == False and search_tweet['favorite_count'] >= 3: log.standard("start favorite") return False; elif search_tweet['favorite_count'] < 3: log.standard("count is a few") return True; elif search_tweet['favorited'] == True: log.standard("already favorite") return True; else: log.standard("Not covered") return True; else: log.standard("Failed. : %d"% research_req.status_code) return False; #search keyword keyword = "#ブログ初心者" #search params params = {'q' : keyword, 'count' : 10} #request_search search_req = twitter.get(searchurl, params = params) log.standard("**Start**") #search and request_favorite if search_req.status_code == 200: search_timeline = json.loads(search_req.text) log.searchlog(json.dumps(search_timeline, ensure_ascii=False)) for tweet in search_timeline['statuses']: if tweet_research(tweet['id_str']) == False: favorite(tweet['id_str']) log.standard("id_str:" + tweet['id_str']) log.standard("id_str:" + tweet['user']['screen_name']) log.standard("----------------------------------------------------") else: log.standard("id_str:" + tweet['id_str']) log.standard("id_str:" + tweet['user']['screen_name']) log.standard("----------------------------------------------------") else: log.standard("Failed. : %d"% search_req.status_code) log.standard("**Finish**") log.finish()
【処理の流れ解説】
①キーワードでタイムラインを検索する。
②いいね済みかどうかを確認する。
③いいねの数が一定以上か確認する。※処理は特に深い意味はなく、条件分岐を試してみたかっただけ。笑
④②と③に合致すれば、いいねする。
# -*- coding: utf-8 -*- # log making import datetime import os def fileout(text,str): f = open(str, 'w') # ファイルを開く(該当ファイルがなければ新規作成) f.write(text) # 文字列を記載する f.close() # ファイルを閉じる #":"と","で改行コード with open(str,"r",encoding="utf-8") as file: filedata=file.read() filedata=filedata.replace(":",":\n") filedata=filedata.replace(",",",\n") with open(str,"w",encoding="utf-8") as file: file.write(filedata) return; def standard(text): dt = datetime.datetime.now() str = 'logs/standard.log' f = open(str, mode = 'a', encoding = 'utf-8') # ファイルを開く(該当ファイルがなければ新規作成) f.write(dt.strftime("%m月%d日%H時%M分%S秒") + ":" + text + "\n") # 文字列を記載する f.close() # ファイルを閉じる return; def finish(): dt = datetime.datetime.now() os.rename('logs/standard.log', 'logs/standard_' + dt.strftime("%Y%m%d%H%M%S") + '.log') def favoritelog(text): dt = datetime.datetime.now() str = 'logs/favorite_' + dt.strftime("%Y%m%d%H%M%S") + '.log' fileout(text,str) return; def tweet_research(text): dt = datetime.datetime.now() str = 'logs/tweet_research_' + dt.strftime("%Y%m%d%H%M%S") + '.log' fileout(text,str) return;
②テスト実行してみたが、エラーになる。。
AWSに接続した後、logsのディレクトリを作成してます。
その後、コマンドで実行。
が、なぜかエラーに。。。。
どうも、AWSに入っているPythonは2.x系であり、open関数でencodingが使えるのは、Python3.x系らしい。
そのため、「open関数のencodingってなんやねん。」ってエラーになっている様子。
じゃあ、Python3.x系インストールすれば良いか。
②Python3.x系のインストール。
AWSへのPython3.x系のインストールはパッケージが用意されているので、簡単でした。
①下記コマンドで、インストール情報を確認。
yum info python3
②下記コマンドでインストール実施。
sudo yum install python3
途中で「y」の入力が求められるが、入力してエンターで進めちゃいましょう。
その後、実行を試してみるが、またエラーに。。
そうか、、、
python3にはOAuthライブラリ適応しないといけないのか。。
③OAuthライブラリ適応
手順は前回紹介した通りだが、Python3で実行することを忘れずに。
その後、再実行すると、エラーにならず成功!これで下準備はOK
④Cronで定期実行を指定する。
rootユーザで「crontab」を編集するだけで、あとは勝手に実行してくれる。
【設定手順】
①rootユーザに切り替え
sudo su -
②crontabの編集
vi /etc/crontab
下記のように設定するだけで、OK。
(例:毎分実行の場合)
以上で完了!
条件に一致するツイートがあれば、「いいね」が自動的に実行されることになった!
でも、これはあんまり使うことはないので、普段は設定しなくて良いかなー
リフォローの自動化を同じような感じで今後はしていこうかなと思ってます。
本日はここまで!