Seleniumとタスクスケジューラを使ってXのポストを自動化する方法

※当サイトは広告を掲載しています。

プログラミング

Xの自動投稿に挑戦してうまくいかず、断念した人も多いのではないでしょうか?

うまくいかない原因でもっとも多いのがログイン時のエラーです。

私も最初はうまくいかなかったのですが、ログイン時のcookieを一度pickleファイルに保存しておいて、それを毎回読み込んで実行する仕様にしたところうまくいくようになりました。

おぢぞう
おぢぞう

今回はそのコードを皆さんに共有いたします。

ログイン情報をpickleファイルに保存

# get_cookies.py

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
import pickle

def main():
   driver_path = ChromeDriverManager().install()
   service = Service(executable_path=driver_path)
   X = webdriver.Chrome(service=service)
   X.get('https://x.com/i/flow/login') #対象ログインページ
   print("ログインしたら何か入力してください。")
   val = input()

   pickle.dump(X.get_cookies() , open("cookies.pkl","wb"))

   X.quit()


if __name__ == '__main__':
   main()

上記のファイルを実行し、一度手動でXにログインして、cookies.pklにログイン情報を保存します。

X自動投稿ファイル

# X_morning_bot.py

from time import sleep
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import pickle

driver_path = ChromeDriverManager().install()

weather_url = 'https://weather.yahoo.co.jp/weather/jp/43/8610.html'
X_url = 'https://x.com'
link = 'https://weather.yahoo.co.jp/weather/'

options = Options()
options.add_argument("--headless")
service = Service(executable_path=driver_path)

# yahoo天気予報から本日の熊本市の天気、最高気温、最低気温を取得
y = webdriver.Chrome(options=options, service=service)
y.get(weather_url)
y.implicitly_wait(10)

day = y.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[2]/div[1]/div[6]/table/tbody/tr/td[1]/div/p[1]/span[1]').text
youbi = y.find_element(By.XPATH, '/html/body/div[1]/div[2]/div[2]/div[1]/div[6]/table/tbody/tr/td[1]/div/p[1]/span[2]').text
today = f'{day}({youbi})'

weather = y.find_element(By.CLASS_NAME, 'pict').text
high = y.find_element(By.CLASS_NAME, 'high').text
low = y.find_element(By.CLASS_NAME, 'low').text

y.quit()

# Xにログイン
X = webdriver.Chrome(options=options, service=service)
cookies = pickle.load(open("cookies.pkl", "rb"))

X.get(X_url)
X.implicitly_wait(10)

for cookie in cookies:
    X.add_cookie(cookie)
X.implicitly_wait(10)

X.get(X_url)
X.implicitly_wait(10)

# ポストの作成
post = f'おはようございます\u266a\n{today}、今日の熊本市は{weather}。\n最高気温{high}、最低気温{low}の予報です。\n本日もよろしくお願いします\u263a\n{link}'
X.implicitly_wait(10)

# ポストの入力
X.find_element(By.CLASS_NAME, 'public-DraftStyleDefault-block.public-DraftStyleDefault-ltr').send_keys(post)
X.implicitly_wait(10)

# ポストの投稿
X.find_element(By.XPATH, '/html/body/div[1]/div/div/div[2]/main/div/div/div/div/div/div[3]/div/div[2]/div[1]/div/div/div/div[2]/div[2]/div[2]/div/div/div/button/div/span/span').click()
X.implicitly_wait(10)

X.quit()

バッチファイル(run.bat)

上記のX_morning_bot.pyをタスクスケジューラに直接登録してもいいのですが、pathの設定が面倒だったので、バッチファイル(run.bat)を作って、これをWindowsのタスクスケジューラに登録しました。

@REM run.bat

@echo off

cd /d %~dp0

conda activate (仮想環境名) & python X_morning_bot.py

以上、上記のファイルをコピーするだけで、Xの自動ポストが実装できます。

あとは、適宜カスタマイズして使ってください。

タイトルとURLをコピーしました