PythonとcronとJSONで画像付きツイートを自動化する
こちらのnoteでは、Pythonで画像付きツイートをするスクリプトをcronで定期実行することで、画像付きツイートを自動化する手順を紹介します。
以前、PythonとcronでテキストのみをツイートするBotを作成する手順についてまとめました。
こちらのnoteは、上のnoteのレベルアップ版です。(とは言え、内容は全く難しくありませんのでご安心を!)
実行環境
OS : MacOS Mojave
Python 3.6.3
画像付きツイートBotの要件定義
僕が作りたかった画像付きのツイートをするBotは以下のようなものです。
・ 毎日9:30に自動でツイートする(時間はテキトーに変える予定)
・ツイートはJSONファイル内で定義済みの内容の中からランダムで決定する
ほどんどテキストのみをツイートするBotの作成と変わりありません。違うのは、"画像をTwitterにアップロードしてそれをツイートに含める"という部分だけです。
それでは、早速実装方法について触れていきます。
Twitter APIに登録 & キーの取得
スクリプトからTwitterを利用するには、Twitter APIに登録する必要があります。「Twitter APIって何?」「どうやって登録すればいいの?」って方は、下の記事が非常にわかりやすいので参考にして進めてください。(Twitter APIの登録ページって英語だから苦手な人にはちょっぴり億劫かも...)
上の記事通りにAPIの登録が完了すると、以下の4つキーが発行されます。
1 : Consumer Key
2 : Consumer Secret
3 : Access Token
4 : Access Token Secret
スクリプトではこれら4つのキーを使用して認証を行い、APIを利用します。
Pythonモジュールのインストール
スクリプトについて紹介する前に、使用するモジュールのインストールをします。
$ pip install requests requests_oauthlib
ツイート本文と画像URLをJSONファイルで定義
ツイート内容をJSONファイルで定義しておきます。ここでは"tweet_contents_with_img.json"というファイル名にします。
{
'contents': [
{
'img_url': '',
'tweet_text': ''
}, //ツイート内容1
{
'img_url': '',
'tweet_text': ''
} //ツイート内容2
]
}
JSONファイルを更新することで、ツイート内容を後から増やすことができる設計です。
PythonでJSONファイルを読み取って画像付きツイート
import json, random
from requests_oauthlib import OAuth1Session
import urllib.request
CK = '<CONSUMER_KEY>'
CS = '<CONSUMER_SECRET>'
AT = '<ACCESS_TOKEN>'
ATS = '<ACCESS_TOKEN_SECRET>'
twitter = OAuth1Session(CK, CS, AT, ATS)
def get_tweet_content(json_file_path): #jsonファイルからツイート本文と画像urlを取得
f = open(json_file_path, 'r', encoding='utf-8')
json_data = json.load(f)
return random.choice(json_data['contents']) #読み取ったJSONファイルからランダムで1要素をリターン
def upload_media(img_url): #画像をTwitterにアップロードし、media_idをリターン
upload_media_url = 'https://upload.twitter.com/1.1/media/upload.json'
res = urllib.request.urlopen(img_url)
img_data = res.read()
img_files = {'media': img_data}
res_media = twitter.post(upload_media_url, files=img_files)
if res_media.status_code == 200:
return json.loads(res_media.text)['media_id']
else:
print('Image upload failed: %s', res_media.text)
exit()
def post_tweet(tweet_text, media_id): #ツイート本文とアップロード済みの画像のmedia_idを引数にツイート
update_url = 'https://api.twitter.com/1.1/statuses/update.json'
params = {'status': tweet_text, 'media_ids' [media_id]}
res = twitter.post(update_url, params=params)
if res.status_code == 200:
print('Auto Tweet Succeeded.')
else:
print('Failed. : %d' % res.status_code)
def main():
json_file_path = '<LOCATION_TO_JSON_FILE>'
tweet_content = get_tweet_content(json_file_path)
media_id = upload_media(tweet_content['img_url'])
post_tweet(tweet_content['tweet_text'], media_id)
if __name__ == '__main__':
main()
cronでPythonスクリプトを定期実行
最後に上で紹介したPythonスクリプトをcronで定期実行することで、画像付きツイートBotの完成です。ツイート内容は、JSONファイルを編集することでを変更することができます。
cronについては下のnoteにまとめてあるので、そちらを参照ください。
おしまい。お疲れ様でした!