TwitterがAPI無料化を廃止すると発表がありましたね。
ここ最近のTwitterは動きが激しく、稼働中のプロジェクトに影響が出てしまんじゃないかと頻繁に情報を調べている次第です。
TwitterAPIが無料だったことでこれまで無料で利用出来ていたツールも続々と廃止を発表。
自動投稿が無料で可能だったtwittbotも今後どうなるか、、という状況だったので「Pythonを使ってブラウザそのものを指定した時間に起動し、投稿フローまで行えればAPIの制約も回避しつつ投稿できるのではないか」と思い検証してみました。
実際のPythonコード
下記はMac Monterey(12.6)で実行した際のコードです。
# ライブラリ
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を使用してください
プログラムの開始
def tweetstart():
tweetstartで関数を呼び出します。
ログイン情報を呼び出し
# アカウント情報 Inputs = ["ログインID", "パスワード"]
Twitterへログインする際に入力する情報をそれぞれ設定します。
Tweet内容を入力
# Tweet内容を入力 textInputs = ["テスト投稿です!"]
Tweetする内容を適宜入力します。
chromedriverのパス情報
# 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を起動
# Chromeを起動 driver = webdriver.Chrome(executable_path=Exefile)
Chromeを起動します。
executable_pathの中にはExefileの指定先がセットされています。
Twitterへログイン
# ブラウザを操作して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する
# ツイート内容を入力 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」の中身を反映します。
その後「ツイートする」ボタンをクリックし、無事投稿が終えたらブラウザを閉じます。
時間を指定
# 毎日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に起動されるよう指定していますが秒、時間などそれぞれ指定が可能です。
毎秒毎にチェック処理が入るため少し負荷を軽減
# 毎秒チェックが入るので60秒間のスリープを実行
while True: schedule.run_pending() time.sleep(60)
毎秒毎にチェックが入ってしまうため、60秒のスリープを挟んでいます。こうすることで時間のチェックを60秒毎に処理させることが可能となります。
プログラムスタート
# プログラムスタート
if __name__ == '__tweetstart__': tweetstart()
tweetstartを実行します。
Pythonの呼び出し方法
例えば「twitter_auto.py」としてファイル名を作成した場合下記で実行します。
python twitter_auto.py
【注意事項】
Pythonの設定環境により指定方法が異なるため各設定方法に合わせて実行してください。
今回ご紹介の方法は投稿テキストが1パターンのみとなりますが、json等を用いて「random」を行うことでランダムに投稿テキストを指定することが可能かと思います。
自宅にPCが余っている方は一度お試しください。
2/14追記
Twitter API無料版廃止までの期間が再度延長したようですね。(今回は期間の発表がありませんが数日とのこと、、)
まだまだ動きが激しいですね。