ツイッターのミュートワード追加をSeleniumで自動化する

2022/09/21

Python 自動化

t f B! P L

概要

  • PythonとSeleniumでブラウザを操作して、自分のツイッターアカウントのミュートワードに単語を追加する
  • TLにミュート推奨ワードリストなるものが流れてきたやろうと思った
    • 元ツイは、ミュート推奨ではなく書き出しとして使えるフレーズ集としてツイートされたもの
    • それがミュート推奨ワードじゃね?となり、むしろそっちがバズった
    • 元ツイートは削除されたが、テキスト化したものがdotupに上がっている
    • https://dotup.org/uploda/dotup.org2871409.txt
    • 100件くらいあるので自動化したい
  • TwitterのOffitial APIではユーザーのミュートはできるが、ミュートワードはできないっぽい(たぶん)のでSeleniumを使う

Seleniumで操作するChromeをDockerコンテナで用意する

こちらの記事を参考にした。

https://qiita.com/Chanmoro/items/9a3c86bb465c1cce738a

https://hub.docker.com/u/selenium

ChromeだけでなくWebDriverも必要になるが、そういうのも諸々入ってる。 Chrome自体もローカルのものではなく、Dockerコンテナの独立したChromeを使ったほうがいろいろ良い。

以後、localhost:4444でChromeが動いている想定。

コード

ログインとミュートワード追加の部分。

from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('--headless') driver = webdriver.Remote( command_executor='http://localhost:4444/wd/hub', desired_capabilities=options.to_capabilities(), options=options, ) # login driver.get('https://twitter.com/i/flow/login') time.sleep(3) element_account = driver.find_element(by="name", value="text") element_account.send_keys(account) time.sleep(3) element_login = driver.find_elements(by="tag name", value="div") for div in element_login: if div.get_attribute("role")=="button" and div.text=="Next": login_button = div login_button.click() time.sleep(3) element_pass = driver.find_element(by="name", value="password") element_pass.send_keys(password) time.sleep(3) element_login = driver.find_elements(by="tag name", value="div") for div in element_login: if div.get_attribute("role")=="button" and div.text=="Log in": login_button = div login_button.click() time.sleep(3) # check driver.save_screenshot('test.png') # Mute Keywords def add_mute_keyword(keyword): driver.get('https://twitter.com/settings/add_muted_keyword') time.sleep(3) element_keyword = driver.find_element(by="name", value="keyword") # keyword入力 element_keyword.send_keys(keyword) time.sleep(3) # 1つ目のラジオボタン、すべてのアカウントをクリックする element_radio = driver.find_elements(by="name", value="mute_notifications_option") for radio in element_radio: if not radio.is_selected(): radio.click() time.sleep(3) break element_add = driver.find_elements(by="tag name", value="div") for div in element_add: if div.get_attribute("role")=="button" and div.text=="保存": add_button = div add_button.click() time.sleep(3)

URLやUIは変更されるし、実際のブラウザで見ているHTMLと微妙に違ったりもするので、スクショ撮ったり、取得した要素のattrやtextを見たりして、地道に必要なinputやbuttonを探す。

find_elementのドキュメントはこのあたり。 https://www.selenium.dev/selenium/docs/api/py/_modules/selenium/webdriver/remote/webdriver.html#WebDriver.find_element

ひとつ気になったので、セッションが切れて再度ログインするたびに、「新規ログインがありました」と通知が来る。

あまり頻繁にやると不正利用と誤認識されてアカウントロックされる可能性も考えられるので、そこらへんは自己責任でお願いします。

雑記

今更だが、SeleniumやDockerなど構成要素が増えて一見複雑になるように見えても、トータルで手間が減る方法を選べるようになったし、パッケージやイメージのリンクやスター数などを見てsquattingに注意できるようになったり、我ながら少しだけ成長を感じる。

Seleniumの自動化系はかなり良さげなので今後もばんばんやっていきたい。

検索

QooQ