見出し画像

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にまとめてあるので、そちらを参照ください。

おしまい。お疲れ様でした!

この記事が気に入ったらサポートをしてみませんか?