Twitterの自動投稿やデータ収集など、TwitterのAPIを使用せずにブラウザ操作を自動化したいケースは多々あります。本記事では、PythonとSeleniumを使用してTwitterにログインし、テキストや画像付きの投稿を行う方法を詳しく解説します。
はじめに
Twitter APIを使用するには申請が必要で、承認されないケースも多いです。そこで、Seleniumを使用してWebブラウザ操作を模倣し、Twitterにアクセスする方法が注目されています。本記事では以下の点に焦点を当てています:
- ログイン情報の保存(毎回ログインしない)
- ヘッドレスモードでの運用
- 簡潔なXPathの使用
- 複数画像投稿への対応
環境準備
以下の環境で動作確認しています:
Python 3.10.9
selenium==4.8.0
urllib3==1.26.14
必要なモジュールは以下のコマンドでインストールできます:
pip3 install -r requirements.txt
コードの解説
まず、必要なモジュールをインポートします:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
import os
import time
import urllib
次に、ログイン情報とUser-Agentを設定します:
email = 'your_email@example.com'
password = 'your_password'
username = 'your_username'
user_agent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 13_2) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.3 Safari/605.1.15'
Twitterボットのクラスを定義します:
class Tweetbot:
def __init__(self, email, password, username):
self.email = email
self.password = password
self.username = username
self.user_agent = user_agent
chrome_options = webdriver.chrome.options.Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument(f'--user-agent={user_agent}')
chrome_options.add_argument(f'--user-data-dir={os.path.join(os.getcwd(), "profile")}')
self.driver = webdriver.Chrome(options=chrome_options)
self.driver.set_window_size('1920', '1200')
self.driver.implicitly_wait(10)
ログイン機能を実装します:
def login(self):
driver = self.
driver.get('https://twitter.com/login')
try:
elm = driver.find_element(By.XPATH, "//input[@name='text']")
elm.send_keys(self.email)
elm.send_keys(Keys.RETURN)
time.sleep(5)
except:
driver.save_screenshot('debug-login.png')
pass
# ユーザー名入力が必要な場合の処理
try:
elm = driver.find_element(By.XPATH, "//input[@name='text']")
elm.send_keys(self.username)
elm.send_keys(Keys.RETURN)
time.sleep(5)
except:
driver.save_screenshot('debug-username.png')
pass
# パスワード入力
try:
elm = driver.find_element(By.XPATH, "//input[@name='password']")
elm.send_keys(self.password)
elm.send_keys(Keys.RETURN)
time.sleep(5)
except:
driver.save_screenshot('debug-password.png')
pass
テキスト投稿機能を実装します:
def update_status(self, status):
driver = self.driver
text = urllib.parse.quote(status, safe='')
url = f"https://twitter.com/intent/tweet?text={text}"
driver.get(url)
time.sleep(5)
try:
elm = driver.find_element(By.XPATH, "//div[@data-testid='tweetButton']")
elm.click()
time.sleep(5)
except:
driver.save_screenshot('debug-tweet.png')
pass
画像付き投稿機能を実装します:
def update_status_with_media(self, status, media):
driver = self.drivertext = urllib.parse.quote(status, safe='')
url = f"https://twitter.com/intent/tweet?text={text}"
driver.get(url)
time.sleep(5)
media = [os.path.join(os.getcwd(), 'media', s) for s in media]
media_files = "\n".join(media)
try:
elm = driver.find_element(By.XPATH, "//input[@data-testid='fileInput']")
elm.send_keys(media_files)
time.sleep(5)
except:
driver.save_screenshot('debug-media-files.png')
pass
try:
elm = driver.find_element(By.XPATH, "//div[@data-testid='tweetButton']")
elm.click()
time.sleep(5)
except:
driver.save_screenshot('debug-tweet-media.png')
pass
使用方法
以下のように使用します:
def main():
isprofile = os.path.isdir(os.path.join(os.getcwd(), 'profile'))
bot = Tweetbot(email, password, username)
if not isprofile:
bot.login()
bot.update_status('これはテスト投稿です。')
time.sleep(10)
bot.update_status_with_media('これは画像付きテスト投稿です。', ['image1.png', 'image2.png'])
if __name__ == "__main__":
main()
注意点
- ヘッドレスモードでの言語設定: ヘッドレスモードで起動すると英語表示になる場合があります。日本語表示にするには以下のオプションを追加してください:
chrome_options.add_argument('--lang=ja-JP')
- ウィンドウサイズと位置: ウィンドウサイズと位置を細かく制御したい場合は、以下のようにできます:
driver.set_window_size(1080, 800)
driver.set_window_position(0, 0)
ただし、オペレーティングシステムによっては若干のオフセットが生じる場合があります。
まとめ
本記事では、PythonとSeleniumを使用してTwitterにログインし、テキストや画像付きの投稿を行う方法を解説しました。この方法を使えば、Twitter APIの申請なしでTwitterの自動操作が可能になります。ただし、Twitterの利用規約に違反しないよう、適切な使用を心がけてください。
また、セキュリティの観点から、実際の運用では認証情報を環境変数や暗号化されたファイルから読み込むなどの対策を行うことをおすすめします。
参考文献
login機能の実装方法
https://qiita.com/rinodrops/items/f1cd9c3ddf6cd8a20d05
window-size設定方法について
https://zenn.dev/shimo_s3/articles/714ebbefbc52f5
日本語表記について
https://yuki.world/selenium-headless-chrome-en-to-ja