TwitterAPIとWindowsタスクスケジューラーとpythonを使って画像投稿botを作る

更新:2021/04/08 作成:2021/04/07

python TwitterAPI Windowsタスクスケジューラ

はじめに

VRChatというVRSNSで遊んでると、綺麗な景色とかカワイイアバターとかが回りに存在してスクリーンショットがはかどるんですよね。それで、撮った写真を選んでTwitterに投稿するんですけど、この「選ぶ」って過程に時間がかかってしまって投稿するのが億劫になってしまいます。そこで、Twitterに投稿しないよりは、ランダムに選んだ写真を適当に呟いた方がましだろうってので作ってみました。

大まかな手順

  1. TwitterDeveloper Platformで、自動投稿したいTwitterアカウントで登録し、APIを利用するためのキーを入手する
  2. pythonでTwitterでフォルダ内の画像をランダムに選び、TwitterAPIを利用してTwitterに投稿するスクリプトを書く
  3. windowsタスクスケジューラーで毎日決まった時間に特定のプログラムを起動するようにスケジュールする

TwitterDeveloper Platformで、自動投稿したいTwitterアカウントで登録し、APIを利用するためのキーを入手する

登録時にTwitterAPIを使いたい理由を英語で200字くらいで書く必要があります。申請後、しばらく時間がたつと、承認メールが届きます(私の場合は、利用用途が自動投稿だけだったのか、1時間ほどで届きました)。申請メールを受けとったら、Developer PortalのProjectからConsumer KeysとAuthentication Tokensを受取ります。

pythonでTwitterでフォルダ内の画像をランダムに選び、TwitterAPIを利用してTwitterに投稿するスクリプトを書く

#tweet.py
# -*- coding:utf-8 -*-
import json, configparser
from requests_oauthlib import OAuth1Session
import random
from PIL import Image
import os
import datetime
import sys

# config.iniの読み込み
config_ini = configparser.ConfigParser()
config_ini.read('config.ini', encoding='utf-8')

CK = config_ini.get('DEFAULT', 'CK')
CS = config_ini.get('DEFAULT', 'CS')
AT = config_ini.get('DEFAULT', 'AT')
AS = config_ini.get('DEFAULT', 'AS')
twitter = OAuth1Session(CK, CS, AT, AS)

url_media = "https://upload.twitter.com/1.1/media/upload.json?media_category=tweet_image"
url_text = "https://api.twitter.com/1.1/statuses/update.json"
path = "D:\\Pictures\\VRChat"
files = os.listdir(path)
dirs = [f for f in files if os.path.isdir(os.path.join(path, f))]
dates_list = sorted(dirs,reverse=True)

# 3日間VRChatに入ってなかったら投稿しない
now = datetime.datetime.now()
someday_ago = now - datetime.timedelta(days=3)
someday_ago_str = someday_ago.strftime('%Y-%m-%d')
some_dirs = dates_list[0:3]
if dates_list[0] < someday_ago_str:
    sys.exit()

image_paths = []
selected_image_paths = []
for d in some_dirs:
    image_dir_path = path + '\\' + d 
    image_files = os.listdir(image_dir_path)
    for file_name in image_files:
        selected_image_paths.append(image_dir_path + '\\' + file_name)

selected_image_paths = random.sample(selected_image_paths,4)

media_ids = []
for i in range(4):
    with open(selected_image_paths[i],"rb") as image_file:
        image_data=image_file.read() 

    files = {"media" : image_data}
    req_media = twitter.post(url_media, files = files)
    media_id = json.loads(req_media.text)['media_id']
    media_ids.append(media_id)

message = '最近の!'
media_ids_string=','.join(map(str,media_ids))
params = {'status': message, "media_ids": media_ids_string}
req_media = twitter.post(url_text, params = params)

keyやtokenはconfig.iniから読み込みます。

#config.ini
[DEFAULT]
CK = consumer_api_key
CS = consumer_secret_key
AT = authentication_access_token
AS = authentication_secret_token

windowsタスクスケジューラーで毎日決まった時間に特定のプログラムを起動するようにスケジュールする

windowsの左下の検索窓から「タスクスケジューラー」をみつけて起動し、タスクを作成する。