Duo 3.0という英語の例文集から1時間に1つずつ選んでツイートするBotを作った。
もともとMetabirdという外部サービスを利用していたが、イーロンマスク氏のBotジェノサイドの対象に合ってどうやらMetabirdサービスごと吹き飛ばされたらしい。
TwitterのBotを作成する手順としては ①APIを利用する ②Seleniumで自動化する の大きく2つあるらしいが、このうちAPIのほうは有料化とか認証切れとか色々ゴタゴタしていて面倒だった。なのでSeleniumでブラウザ操作を自動化して突破することにした。
もちろんTwitter社もその対策は打っていて、ログイン画面のUIが頻繁に変わったり、ランダムでポップアップが出てきたりする。 あとはそれ以前にChromeがアップデートしてChrome driverとバージョンが合わなくなってクラッシュする可能性も高い。このあたりはその都度修正していく。 Botなのに保守管理が大変だ。
ここでは備忘録がてら自動化のためのスクリプトをベタ張りしておく。 僕はpythonほぼ初心者だが、GPT4の助けにより6時間で実装完了にこぎつけた。彼がいなかったら3倍はかかっていただろう。すごい。
なおDuoの英文で出てくる半角英字のカンマ「,」についてはエスケープがうまくできなかったので、全角英字のカンマ「,」に変換した。ほかの特殊文字はたぶんうまく出力されてるはず。
あとはタスクスケジューラで1時間ごとにbatファイルを起動させるようにしているけど、そのあたりがちゃんと動くかびみょい。
そもそもPCをタスクスケジューラで21時に自動シャットダウンするようにしていて、BIOSで6時に自動スタートアップするような設定にしている。このあたりの兼ね合いがうまくできるかどうか。まだまだ開発力が未熟だな。
# ライブラリを読み込む from selenium import webdriver from subprocess import CREATE_NO_WINDOW from selenium.webdriver.common.keys import Keys from selenium.webdriver.common.by import By from webdriver_manager.chrome import ChromeDriverManager from selenium.webdriver.common.desired_capabilities import DesiredCapabilities import time import random import re # twitterのユーザー情報 user_id = 'DuoEveryDayなのでフォローよろしく' pass_ = 'パスワードなので秘密だよん' # Seleniumの設定 d = DesiredCapabilities.CHROME d['goog:loggingPrefs'] = { 'performance': 'ALL' } driver = webdriver.Chrome(ChromeDriverManager().install(),desired_capabilities=d) driver.set_window_size(800,800) # ログインURL url = "https://twitter.com/login" driver.get(url) time.sleep(3) # メールアドレスorユーザーIDを入力する driver.find_element(By.XPATH, '/html/body/div/div/div/div[1]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div/div[5]/label/div/div[2]/div/input').send_keys(user_id) time.sleep(3) # 次へボタンをクリックする driver.find_element(By.XPATH, '/html/body/div/div/div/div[1]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div/div[6]/div').click() time.sleep(3) # パスワードを入力する driver.find_element(By.XPATH, '/html/body/div/div/div/div[1]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[1]/div/div/div[3]/div/label/div/div[2]/div[1]/input').send_keys(pass_) time.sleep(3) # ログインボタンをクリックする driver.find_element(By.XPATH, '/html/body/div/div/div/div[1]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[2]/div/div[1]/div/div/div/div').click() time.sleep(5) # 新規ツイートボタンをクリックする driver.find_element(By.XPATH, '/html/body/div[1]/div/div/div[2]/header/div/div/div/div[1]/div[3]/a/div').click() time.sleep(3) # ツイート内容を入力する。duo.pyファイルの例文を、特殊文字を修正してからリストに格納。ランダムに選ぶ。 random.seed() tweet_list = [] with open('duo.py', 'r', encoding='utf-8') as f: for line in f: match = re.match(r"\(\'(.+?)\',\s*\'(.+?)\'\)", line.strip()) if match: tweet_list.append((str(match.group(1)).replace("\\", ""), str(match.group(2)).replace("\\", ""))) tweet_english, tweet_japanese = random.choice(tweet_list) tweet_input_xpath = "//div[@aria-label='Tweet text'][@data-testid='tweetTextarea_0'][@role='textbox']" tweet_input_element = driver.find_element(By.XPATH, tweet_input_xpath) # 英語の部分を入力 tweet_input_element.send_keys(tweet_english) # 改行を入力 tweet_input_element.send_keys(Keys.ENTER) # 日本語の部分を入力 tweet_input_element.send_keys(tweet_japanese) time.sleep(10) # ツイートボタンをクリックする tweet_button_xpath = "//div[@role='button'][@data-testid='tweetButton']" tweet_button_element = driver.find_element(By.XPATH, tweet_button_xpath) tweet_button_element.click() time.sleep(5) # ブラウザを閉じる driver.close()
ちなみにDuoの例文は560個あるが、
https://www.chegg.com/flashcards/duo-3-0-d0a5d834-382c-44ee-9fa7-aa0205cb3524/deck
このサイトから全選択してエクセルで成形した。以下のフォーマットで別途Duo.pyファイルに格納している。
('1 個人の意志は尊重しなければいけない。', '1 We must respect the will of the individual.'), ('2 気楽にいけよ。大丈夫、すべてうまくいくさ。', '2 Take it easy. I can assure you that everything will turn out fine.'), ('3 悲観的な人生観を捨てて、前向きな態度を常に持ち続けよう。', '3 Let go of your negative outlook on life. Always maintain a positive attitude.'),
タスクスケジューラについては、.batファイルに以下を記載している。
@echo off
python "C:\Users\yamao\Downloads\lesson\twitter.py"
pause
これを1時間おきに実行する設定にしている。