見出し画像

Threads(スレッズ)公式APIを使った投稿自動化の教科書

Theads公式APIを使った自動化について


今回Threadsの自動化スクリプトを作るにあたり、日本語の記事は2つしか見つからず
エンジニアさんやアフィリエイターさんもかなり困惑している様子が伺えます。

本記事はThreadsのAPI解説の日本で3番目の記事になると思います。
Pythonに限れば日本初かもしれません。

この記事は
・自前サーバーを持っていない人でもできる認証・承認プロセス
・Treadsアクセストークン獲得方法

Threadsの具体的な自動投稿Pythonスクリプトを用意しています

スクリプトの内容はGoogleのスプレッドシートにあらかじめ投稿を用意しておきCSVで出力し
その投稿内容を自分で定めた間隔でランダムに投稿するスクリプトです
重複を避けるためにCSVファイルの内容を全部投稿してからリセットされるようになっています

用意してもらうのは以下の要素です
・スレッズアカウント(インスタグラムはビジネスアカウントとして設定)
・マニュアルを使いアクセストークンとユーザーIDの取得
・投稿内容(グーグルスプレッドシートでまとめて入力)
・稼働PC(プログラムを作動させるために常時電源がONになっているPCです。VPSを推奨しています)


Threadsアクセストークン取得

まずはここからmeta社のデベロッパーアカウントに登録します

デベロッパーアカウントはmetaのビジネスアカウントが必要なのでまだビジネスアカウントを持っていない人は作っておいてください

たまに審査に落ちる人がいますが、ほとんどの場合、異議申し立てを行えばビジネスアカウントは開設されます

ビジネスアプリを作成

事前準備としてThreadsのアカウントをビジネスアカウントとし、適当なページにリンクさせておいてください。

API はビジネス カスタマーを対象としています
そのため、ビジネス アプリを作成する必要があります。
既に開発者としてアプリを作った人も古いアプリにはThreadsが統合されていないため、新しいアプリである必要があります。
新しいアプリの機能で、[スレッズ API にアクセス] を選択します。



ビジネスアプリの設定


・コールバックURLリダイレクト
・コールバックURLをアンインストール
・コールバックURLを削除
の項目に

https://oauth.pstmn.io/v1/callback
を入力する



テスターの追加


ブラウザ版Threadsでの確認

承認URLへアクセスする

https://threads.net/oauth/authorize?client_id=[あなたのThreadsID]&redirect_uri=https://oauth.pstmn.io/v1/callback&scope=threads_basic,threads_content_publish&response_type=code
上記のURLをコピーしメモに置いておき[あなたのThreadsID]をThreadsアプリIDに置き換えて
ブラウザのURL検索欄に置いてエンターキーを押し検索を実行する
※[ ]は削除

許可が完了した後のURLをコピーしメモに保管しておく

Postmanにてアクセストークンを生成

本来ならここで自前のサーバーを使ってPHPリクエストでAPIキーのテストが必要なのですが
ここではその作業を簡略化するためにPostmanを使います
登録・利用は無料ですので登録してワークスペースにいき作業をしてください

リクエストの形式はPostで、URL欄には
https://graph.threads.net/oauth/access_token
を入力する

ボディ→x-www-from-uriencodedで
以下のパラメータを追加します:

  • client_id: あなたのThreadsアプリID

  • client_secret: あなたのThreads clientシークレット

  • redirect_uri: https://oauth.pstmn.io/v1/callback

  • grant_type: authorization_code

  • code: 先ほどの承認URLに記載されていたコード(最後に#_がある場合は除く)

リクエストに成功すると短期アクセストークンとユーザーIDが生成されます。
このIDをメモなどに保存しておきます。
ユーザーIDは実際のPythonスクリプトで使用します

短期アクセストークンを長期アクセストークンへ

現在Threadsのアクセストークンは無期限の物が作れません
なので現在発行されている短期(1時間)アクセストークンを長期(60日間)アクセストークンに変えて使う必要があります
アクセストークンは60日間ごとに更新しないといけない仕様になっているので60日ごとにこのアクセストークンを取得する作業を行なってください

リクエスト形式をPostからGetに変更し
URL欄に
https://graph.threads.net/access_token?grant_type=th_exchange_token&client_secret=[あなたのThreadsシークレット]&access_token=[先ほど取得したアクセストークン]
を入力します
※[ ]は削除

リクエストが成功すると長期アクセストークンが生成されるので
保存しておきます


簡単な投稿スクリプト例



アクセストークンの取得までできたと思うのでエンジニアの方はThreads公式のAPIドキュメントを見て自動投稿システムを構築してみてください

また設定までの流れはPythonなどプログラミングをやったことがない人でもできるように書いていますが
初心者にはハードルが高いかもしれません

簡単な質問なら答えるのでインスタまでご連絡ください



それでは早速自動化プロセスを解説していきます



Pythonのインストール

Python(パイソン)はオープンソースのプログラミング言語の一つで、シンプルで読みやすい構文をもち、数値計算からWebアプリ開発、AI開発など幅広い用途で利用できるプログラミング言語です。

要するに自動化をするのに初心者でもさわりやすく、簡単なインストールで使える言語ぐらいで覚えておいてもらえたら結構です

Pythonのインストール方法に関してはここでわざわざ書くことでもないと思うので下記のサイトを参考にインストールしてください

スクリプトのダウンロード

下記のGoogleドライブからスクリプトファイルを受け取ってください

↓をクリック

ダウンロード後は
macの方は MacintoshHD→ユーザー→自分の名前のフォルダ
Windowsの方は (C)ローカルディスク→ユーザー→自分の名前のフォルダ(またはadmin)
においてください

スクリプト内を改変

ダウンロードフォルダ内は[main.py]と[file.csv]のシンプルな二種類になっています

[main.py]の中はこうなっています。触ったことがない人が見るとゾワっとすると思いますが、意味はわからなくて大丈夫です。

[main.py]全体

import requests
import pandas as pd
import schedule
import time
import random


API_URL = "https://graph.threads.net/v1.0/{user_id}/threads"
API_TOKEN = "あなたの長期アクセストークン"
USER_ID = "あなたのユーザーID"


def load_csv(file_path):
    print("Loading CSV file...")
    df = pd.read_csv(file_path)
    print("CSV file loaded successfully.")
    return df['content'].tolist()


def post_to_threads(content):
    print(f"Attempting to post: {content}")
    headers = {
        "Authorization": f"Bearer {API_TOKEN}",
        "Content-Type": "application/json"
    }
    data = {
        "text": content,
        "media_type": "text"  
    }
    response = requests.post(API_URL.format(user_id=USER_ID), json=data, headers=headers)
    if response.status_code == 200:
        print(f"Successfully posted: {content}")
    else:
        print(f"Failed to post: {content}, Status Code: {response.status_code}, Response: {response.text}")

# 投稿をスケジュール デフォルトは2時間ごと
def schedule_posts(contents):
    print("Scheduling posts...")
    random.shuffle(contents)
    for content in contents:
        schedule.every(2).hours.do(post_to_threads, content=content)
    print("Posts scheduled. Starting the schedule...")

    
    if contents:
        post_to_threads(contents[0])

    while True:
        schedule.run_pending()
        time.sleep(1)

if __name__ == "__main__":
    print("Script started...")
    file_path = "file.csv"  
    contents = load_csv(file_path)
    print("CSV content loaded. Scheduling posts...")
    schedule_posts(contents)

ここの[API_TOKEN]と[USER_ID]にテキストエディタなどで自分のアクセストークンと、短期アクセストークンを取得した時に取得したユーザーID(数字)を入力してください

API_URL = "https://graph.threads.net/v1.0/{user_id}/threads"
API_TOKEN = "あなたの長期アクセストークン"
USER_ID = "あなたのユーザーID"

投稿時間の頻度を変えたい人はここの
schedule.every(2)の2の部分を変えていただければその時間ごとに投稿するロジックになります

# 投稿をスケジュール デフォルトは2時間ごと
def schedule_posts(contents):
    print("Scheduling posts...")
    random.shuffle(contents)
    for content in contents:
        schedule.every(2).hours.do(post_to_threads, content=content)

投稿文作成

投稿文はGoogleスプレッドシートで作りCSVファイルとして出力します

左端の列にセットしておきたい投稿文を書き出しておきます

投稿文のセットが終わったら

  • ファイルメニューをクリック

    • 左上の「ファイル」をクリックします。

  • ダウンロードを選択

    • 「ダウンロード」オプションを選択し、その中から「カンマ区切りの値(.csv、現在のシート)」を選択します。

  • CSVファイルがダウンロードされる

    • これにより、現在表示されているシートがCSV形式でダウンロードされます。

CSVファイルは file.csv という名前にしてスクリプトフォルダに入れておきます


いよいよ稼働開始


ここまで準備が整ったらいよいよ稼働を開始します

macの人はターミナルを
Windowsの人はWindows PowerShellを起動します
どちらもデフォルトで入っているソフトなのでスタートメニューなどで検索するとすぐ出てきます

起動したらまずプロジェクトのディレクトリに移動します
下記のコマンドをコピーして入力してエンターを押してください

mac

cd threadspost

Windows(ユーザー名は自分のものに変更)

cd C:\Users\Administrator\threadspost


その後必要な要素をインストールします下記のコマンドを入力してエンターを押してください

pip install schedule


ここまで来れば準備は万端です

mac.Windows共通で

python main.py

を入力しエンターを押せば起動完了です

これで指定した時間で投稿がされるスクリプトが動きます

稼働PCの通信接続が切れたり
電源が切れたりすると止まってしまうので注意が必要です

また長期アクセストークンは60日間なので60日ごとにアクセストークンを取得する必要があるのにも注意が必要です

まとめ


そんな感じでThreadsはTwitterやインスタグラムのAPIと違い、かなりAPIの扱い難易度が高いです

meta CEOのアダムモセリがTwitterの対抗馬として作ったSNSなので
Twitterが抱えている問題である「botが多すぎる問題」をAPI取扱いハードルを上げることで解決しようとしている感はあります

しかし逆を言えばハードルが高いことによって競合も少ないということになるので
攻略してみる価値はあるSNSではあります


簡単なことなら空いた時間に答えるので
わからない部分があれば答えるのでインスタまでご連絡ください


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