Python

【Python】Seleniumを用いたTwitterへのログイン及び投稿

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

ABOUT ME
tona-code
24/7月末の退職を機に、pythonを使った副業にチャレンジ。 初月から5万以上の収入を得たノウハウを発信中。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です