TwitterのREST APIについて その9(AWSへのPython3導入と自動化まで)

こんにちは!こんばんは、みんろです!

TwitterAPIを使って色々してみたいPart9です!
長かったシリーズ物も一旦一区切りかな。完全自動化までまとめて紹介していきます。
ただ、前回までに紹介した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。
  (例:毎分実行の場合)

 

 

以上で完了!

条件に一致するツイートがあれば、「いいね」が自動的に実行されることになった!
でも、これはあんまり使うことはないので、普段は設定しなくて良いかなー
リフォローの自動化を同じような感じで今後はしていこうかなと思ってます。

 

本日はここまで!

おすすめ

コメントを残す

メールアドレスが公開されることはありません。