TwitterAPI無料廃止に伴いブラウザベースのbotではなくローカルで自動投稿してみた

TwitterAPI無料廃止に伴いブラウザベースのbotではなくローカルで自動投稿してみた 画像

TwitterがAPI無料化を廃止すると発表がありましたね。

ここ最近のTwitterは動きが激しく、稼働中のプロジェクトに影響が出てしまんじゃないかと頻繁に情報を調べている次第です。

TwitterAPIが無料だったことでこれまで無料で利用出来ていたツールも続々と廃止を発表。

自動投稿が無料で可能だったtwittbotも今後どうなるか、、という状況だったので「Pythonを使ってブラウザそのものを指定した時間に起動し、投稿フローまで行えればAPIの制約も回避しつつ投稿できるのではないか」と思い検証してみました。

実際のPythonコード

下記はMac Monterey(12.6)で実行した際のコードです。

twitter_auto.py
# ライブラリ
import os
from selenium import webdriver
import schedule
import time

# tweetstart開始
def tweetstart():

    # アカウント情報
    Inputs = ["ログインID", "パスワード"]

    # Tweet内容を入力
    textInputs = ["テスト投稿です!"]

    # chromedriverのパス情報
    path = os.getcwd()
    Exefile= path + "/chromedriver"

    # Chromeを起動
    driver = webdriver.Chrome(executable_path=Exefile)

    # ブラウザを操作してTwitterにアクセス
    driver.get("https://twitter.com/i/flow/login") 
    time.sleep(2) 

    # ユーザー名入力
    driver.find_element_by_name("text").send_keys(Inputs[0])

    # 次へボタンクリック
    driver.find_element_by_xpath('//*[@id="layers"]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div/div[6]').click()
    time.sleep(2) 

    # パスワード入力
    driver.find_element_by_name("password").send_keys(Inputs[1])
    
    # ログインボタンクリック
    driver.find_element_by_xpath('//*[@data-testid="LoginForm_Login_Button"]').click()
    time.sleep(2)

    # ツイート内容を入力
    element_text = driver.find_element_by_class_name("notranslate")
    element_text.click()
    element_text.send_keys(textInputs)

    # ツイートボタン
    tweet_button = driver.find_element_by_xpath('//*[@data-testid="tweetButtonInline"]')
    driver.execute_script("arguments[0].click();", tweet_button)

    # ツイート後、ブラウザを閉じる
    print("successful")

# 毎日12:00に起動
schedule.every().day.at("12:00").do(tweetstart)

# 20秒毎に起動
# schedule.every(20).seconds.do(tweetstart)

#1時間毎に起動
# schedule.every(1).hours.do(tweetstart)
  
# 毎秒チェックが入るので60秒間のスリープを実行
while True:
  schedule.run_pending()
  time.sleep(60)

# プログラムスタート
if __name__ == '__tweetstart__':
    tweetstart()

Pythonコードの解説

ライブラリのインストール

上記コードを解説していきます。

#フォルダパスを設定するために使用
import os

#ウェブブラウザとしてChromeを操作するために使用
from selenium import webdriver

#定期的に実行させるために使用
import schedule

#プログラムを停止させるために使用
import time

実行するために下記をinstallします。

python -m pip install selenium==4.2.0

python -m pip install schedule

※seleniumはバージョン4.3をinstallすると若干記述の仕様が変わってしまうため、4.2を使用してください

プログラムの開始

Python
def tweetstart():

tweetstartで関数を呼び出します。

ログイン情報を呼び出し

Python
    # アカウント情報
    Inputs = ["ログインID", "パスワード"]

Twitterへログインする際に入力する情報をそれぞれ設定します。

Tweet内容を入力

Python
    # Tweet内容を入力
    textInputs = ["テスト投稿です!"]

Tweetする内容を適宜入力します。

chromedriverのパス情報

Python
    # chromedriverのパス情報
    path = os.getcwd()
    Exefile= path + "/chromedriver"

chromedriverを呼び出すためのパス情報を記述します。上記はtwitter_auto.pyと同階層に「chromedriver」を設置している場合の設定です。

chromedriverは事前に下記からダウンロードしてください。

https://sites.google.com/a/chromium.org/chromedriver/downloads

chromedriverのバージョンが複数ありますが、現在使用している「Chrome」のバージョンと同じバージョンをダウンロードしてください。

Windowsの方は「chromedriver.exe」をダウンロードし、指定してください。

※「Chrome:110.0.5481.77」であれば「chromedriver:110.0.5481.77」をダウンロード

Chromeを起動

Python
    # Chromeを起動
    driver = webdriver.Chrome(executable_path=Exefile)

Chromeを起動します。

executable_pathの中にはExefileの指定先がセットされています。

Twitterへログイン

Python
    # ブラウザを操作してTwitterにアクセス
    driver.get("https://twitter.com/i/flow/login") 
    time.sleep(2) 

    # ユーザー名入力
    driver.find_element_by_name("text").send_keys(Inputs[0])

    # 次へボタンクリック
    driver.find_element_by_xpath('//*[@id="layers"]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div/div[6]').click()
    time.sleep(2) 

    # パスワード入力
    driver.find_element_by_name("password").send_keys(Inputs[1])
    
    # ログインボタンクリック
    driver.find_element_by_xpath('//*[@data-testid="LoginForm_Login_Button"]').click()
    time.sleep(2)

TwitterログインURLをセットします。

URLを開いた後、ブラウザ上でページを読み込む時間として「time.sleep(2)」を設定し、余裕を持たせます。

ユーザー名入力欄を取得するために「name=”text”」を指定し、事前に設定しておいた「ログインID」をInputs[0]で呼び出しています。

「次へ」のボタンをxpathで指定し、「パスワード」とその後の「ログイン」の流れも同様にセットしています。

【注意事項】

ユーザーID、パスワードやボタンへの指定先はTwitterの更新状況に変動する可能性があるため適宜ご指定ください。

Tweetする

Python
    # ツイート内容を入力
    driver.find_element_by_class_name("notranslate").click()
    element_text.send_keys(textInputs)

    # ツイートボタン
    tweet_button = driver.find_element_by_xpath('//*[@data-testid="tweetButtonInline"]')
    driver.execute_script("arguments[0].click();", tweet_button)

    # ツイート後、ブラウザを閉じる
    print("successful")

実際にTweet内容を投稿します。

入力欄にclass指定されている「notranslate」に対してクリックを行い、「textInputs」の中身を反映します。

その後「ツイートする」ボタンをクリックし、無事投稿が終えたらブラウザを閉じます。

時間を指定

Python
# 毎日12:00に起動
schedule.every().day.at("12:00").do(tweetstart)

# 20秒毎に起動
# schedule.every(20).seconds.do(tweetstart)

#1時間毎に起動
# schedule.every(1).hours.do(tweetstart)

tweetstartを起動する時間を指定します。

今回は毎日12:00に起動されるよう指定していますが秒、時間などそれぞれ指定が可能です。

毎秒毎にチェック処理が入るため少し負荷を軽減

Python
# 毎秒チェックが入るので60秒間のスリープを実行
while True:
  schedule.run_pending()
  time.sleep(60)

毎秒毎にチェックが入ってしまうため、60秒のスリープを挟んでいます。こうすることで時間のチェックを60秒毎に処理させることが可能となります。

プログラムスタート

Python
# プログラムスタート
if __name__ == '__tweetstart__':
    tweetstart()

tweetstartを実行します。

Pythonの呼び出し方法

例えば「twitter_auto.py」としてファイル名を作成した場合下記で実行します。

python twitter_auto.py

【注意事項】

Pythonの設定環境により指定方法が異なるため各設定方法に合わせて実行してください。

今回ご紹介の方法は投稿テキストが1パターンのみとなりますが、json等を用いて「random」を行うことでランダムに投稿テキストを指定することが可能かと思います。

自宅にPCが余っている方は一度お試しください。

2/14追記

Twitter API無料版廃止までの期間が再度延長したようですね。(今回は期間の発表がありませんが数日とのこと、、)

まだまだ動きが激しいですね。