見出し画像

X(twitter) api v2を使って毎日の投稿を自動化する(2024/07)

毎日毎日毎日毎日予約投稿ポチポチするのめんど~~~~いって人の為の記事です。X apiはだいたい有料なんですが、投稿だけなら無料でできます。
<問題点>
・X apiを所得するのが非常にめんどい。
・Pythonプログラムを動かし続ける(24時間起動しっぱなしの)PCが必要。


① X apiキーを所得する

主にこれがメインで滅茶苦茶面倒な所です。
詳細に解説してくれているのでここを見てください。
ここにも書かれていますが、なんと現在Xには、7つのAPIキーがあります。
正気か???

Sign up for Free Accountを選ぶと無料でAPIキーが使えます。「250文字以上の英語の概要を送れ」と言われるので適当にChatGPTにでも水増しさせて送りましょう。どうせ自動で承認されます。

するとなんかdeveloper画面に移行するので出来たーと思うかもしれませんが、ここで油断せずに、「X(Twitter) Developer Portalで認証の設定」まで行いましょう。これをおこなうと、「①Client ID・➁Client Secret」(OAuth 2.0 Client ID and Client Secret)が入手できます。この二つはプログラムでは使いませんが、この設定を行っておかないとプログラムが認証エラーになります。
記事内にもありますが、Website URLはX(Twitter)のURLでも構いません。
その後は、「key and tokens」から以下の5つのキーを確保しましょう。

  • Consumer API Key / API Secret:

  • Bearer Token

  • Access Token / Access Token Secret:

ここまでやればほぼクリアしたも同然です。

➁  pythonコードをコピペする。

このコードをコピペして自身の適当なフォルダ(できればユーザー名直下がいい)に「autotweet.py」という名前で保存してください。

import os
import tweepy
import schedule
import time
from datetime import datetime

# Twitter API認証

# 頑張って所得する奴(所得だけでいいっぽい)
# client_id = ""
# client_secret = ""

consumer_api_key = "(キーを入力)"
consumer_api_secret = "(キーを入力)"
bearer_token = "(キーを入力)"
access_token = "(キーを入力)"
access_token_secret = "(キーを入力)"

# 基本となるフォルダのパス
base_folder = r"C:\(なんたらかんたら~~~)"

# 認証
client = tweepy.Client(
    bearer_token=bearer_token,
    consumer_key=consumer_api_key,
    consumer_secret=consumer_api_secret,
    access_token=access_token,
    access_token_secret=access_token_secret
)

# Twitter API認証
auth = tweepy.OAuthHandler(consumer_api_key, consumer_api_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)

print("認証ok")


# 画像投稿メイン処理
def post_image(image_folder):
    sumi_folder = os.path.join(image_folder, "sumi")
    
    if not os.path.exists(image_folder):
        print(f"Folder does not exist: {image_folder}")
        return

    # フォルダ内のpngファイルを取得 →一番最初のやつを投稿する
    png_files = [f for f in os.listdir(image_folder) if f.endswith('.png')]
    # 最初のpngファイルを投稿
    image_path = os.path.join(image_folder, png_files[0])
    
    if not png_files:
        print(f"No PNG files found in the folder: {image_folder}")
        return

    # フォルダ内のtxtファイルを取得 →ツイート内容へ
    txt_files = [f for f in os.listdir(image_folder) if f.endswith('.txt')]
    if not txt_files:
        print(f"No TXT files found in the folder: {image_folder}")
        return
    else:
        txt_path = os.path.join(image_folder, txt_files[0])
        with open(txt_path, 'r', encoding='utf-8') as file:
            tweet_text = file.read().strip()


    try:
        media = api.media_upload(image_path)
        client.create_tweet(text=tweet_text, media_ids=[media.media_id])
        print(f"Posted image: {png_files[0]} at {datetime.now()}")

        # 投稿したファイルをsumiフォルダに移動
        sumi_path = os.path.join(sumi_folder, png_files[0])
        os.rename(image_path, sumi_path)
        print(f"Moved {png_files[0]} to sumi folder")
    except Exception as e:
        print(f"Error posting image: {e}")


# base_folderの中にあるフォルダ一覧を取得
folders = [f for f in os.listdir(base_folder) if os.path.isdir(os.path.join(base_folder, f))]
# スケジュールを設定
for folder_name in folders:
    # Convert folder_name from HHMM to HH:MM
    time_str = f"{folder_name[:2]}:{folder_name[2:]}"
    schedule.every().day.at(time_str).do(post_image, image_folder)
    print(f"make schedule: {image_folder}, {time_str}")



# メインループ
while True:
    schedule.run_pending()
    time.sleep(60)  # 1分ごとにチェック

フォルダー構造としては

(指定したBaseとなるフォルダー)
  ー(4ケタの時間が書かれたフォルダー 複数可)
   ーー(画像ファイルたくさん)
   ーー(ツイート内容が書かれたテキストファイル)
   ーー(sumiという名前の投稿した画像が移動するフォルダー)

という形で動作するようになっています。

指定したBaseとなるフォルダー中身
4ケタの時間が書かれたフォルダー中身

コマンドプロンプトを起動して、

pip install tweepy schedule

と入力して、必要なライブラリをインストールしましょう。(pipやpythonがなければそれらも)

cdを使って、「autotweet.py」を保存したフォルダーに移動します。

python autotweet.py

でプログラムを立ち上げたら一生放置しておいてください。勝手に投稿してくれるはずです。

その他わからないことはclaude3.5 sonnetにきいてください!!

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