TwitterのAPIを使えば、プログラムによる自動ツイートが簡単にできます。
でも、TwitterはAPIの申請が面倒で嫌になります。
それなら、APIを使わずに自動ツイートを行えばいいのです。
ということで、この記事ではAPIなしの自動ツイートに関して解説していきます。
本記事の内容
- Twitter APIを使わずに自動ツイートする方法
- Twitterへのログイン
- Twitterにログインした状態でツイート
- 【サンプルコード】Twitter APIなしの自動ツイート
それでは、上記に沿って解説していきます。
Twitter APIを使わずに自動ツイートする方法
まずは、全体像を説明します。
ツイートするためには、ログイン済みが前提となります。
ログインしている状況でしかツイートはできませんからね。
つまり、自動ツイートとは以下の機能に分解できます。
- Twitterへのログイン
- Twitterにログインした状態でツイート
この機能を満たすプログラムであれば、自動ツイートが可能になります。
このようなプログラムを可能にするには、Seleniumを利用します。
Seleniumのインストールは、次の記事で解説しています。
あと、タイトルにも書いているようにPythonを開発言語とします。
Pythonは、このような自動処理に最も適したプログラム言語と言えます。
以上、Twitter APIを使わずに自動ツイートする方法の全体像を説明しました。
次は、分解した機能の一つである「Twitterへのログイン」を説明します。
Twitterへのログイン
詳細は、次の記事をご覧ください。
上記記事の内容通りに、ライブラリなども用意してください。
以上、Twitterへのログインに関する説明でした。
次は、プログラムによってツイートを行う方法を説明していきます。
Twitterにログインした状態でツイート
実は、簡単です。
これは、Twitterのシェアボタンです。
今では、大抵のページで目にします。
このシェアボタンの仕組みを利用するのです。
例えば、以下のページのシェアボタンをクリックします。
https://this.kiji.is/759887978843619328
すると、次の表示の画面に遷移します。
上の画面のURLは、以下となります。
https://twitter.com/intent/tweet?text=%E7%B1%B3%E3%82%B0%E3%83%BC%E3%82%B0%E3%83%AB%E3%80%81%E9%81%8E%E5%8E%BB%E6%9C%80%E9%AB%98%E7%9B%8A%E3%80%80%E3%82%B3%E3%83%AD%E3%83%8A%E8%BF%BD%E3%81%84%E9%A2%A8%E3%80%81MS%E3%82%82%E5%A5%BD%E8%AA%BF+%7C+2021%2F4%2F28+-+%E5%85%B1%E5%90%8C%E9%80%9A%E4%BF%A1&url=https%3A%2F%2Fthis.kiji.is%2F759887978843619328
このURLは、以下の形式で表現されています。
https://twitter.com/intent/tweet?text=テキスト&url=対象ページURL
この形式のURLが、シェアボタンに設定されているだけです。
そのため、私たちもシェアボタンの仕組みを利用します。
上記形式のURLに遷移すれば、入力までは完了していることになります。
あとは、「Tweet(ツイートする)」ボタンを押すだけです。
「Tweet」ボタンを押すのは、Seleniumを利用します。
ボタンを押せば、これでツイートの投稿が完了になります・
以上、Twitterにログインした状態でツイートすることを説明しました。
次は、実際にTwitter APIなしの自動ツイートを行っていきます。
Twitter APIなしの自動ツイート
以下のサンプルコードは、Twitter APIなしの自動ツイートを行います。
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains import urllib.parse CHROMEDRIVER = "chromedriver.exeのパス" TWITTER_BASE = "https://twitter.com/" LOGIN_ID = "メールアドレスとかユーザ名" PASSWORD = "パスワード" def get_driver(): # ヘッドレスモードでブラウザを起動 options = Options() # options.add_argument('--headless') # ブラウザーを起動 driver = webdriver.Chrome(CHROMEDRIVER, options=options) return driver # twitterログイン def do_login(driver): # ログインURL login_url = TWITTER_BASE + "login" driver.get(login_url) # 電話、メールまたはユーザー名のinput要素が読み込まれるまで待機(最大10秒) elem_id = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.NAME, "session[username_or_email]")) ) try: # パスワードのinput要素 elem_password = driver.find_element_by_name("session[password]") if elem_id and elem_password: # ログインID入力 elem_id.send_keys(LOGIN_ID) # パスワード入力 elem_password.send_keys(PASSWORD) # ログインボタンクリック elem_btn = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.XPATH, "//div[@data-testid='LoginForm_Login_Button']")) ) actions = ActionChains(driver) actions.move_to_element(elem_btn) actions.click(elem_btn) actions.perform() # 遷移 # 遷移後のURLでログイン可否をチェック perform_url = driver.current_url if perform_url.find(login_url) == -1: # ログイン成功 return True else: # ログイン失敗 return False else: return False except: return False # tweet投稿 def post_tweet(driver, text, url): tweet_text = text tweet_text = urllib.parse.quote(tweet_text, safe='') tweet_url = url tweet_url = urllib.parse.quote(tweet_url, safe='') target_url = TWITTER_BASE + "intent/tweet?text=" + tweet_text + "&url=" + tweet_url # 投稿画面へ遷移 driver.get(target_url) # tweetボタンが読み込まれるまで待機(最大10秒) elem_tweet_btn = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.XPATH, "//div[@data-testid='tweetButton']")) ) try: actions = ActionChains(driver) actions.move_to_element(elem_tweet_btn) actions.click(elem_tweet_btn) actions.perform() except: print("投稿エラー") if __name__ == "__main__": # Driver driver = get_driver() # ログイン login_flg = do_login(driver) if login_flg: # ログイン成功 text = "投稿テストを行います" url = "https://this.kiji.is/759884204002656256" post_tweet(driver, text, url) # driver.quit()
「Twitterにプログラムで自動ログインする【Python + Selenium】」のサンプルコードとほぼ同じです。
異なる箇所は以下の部分だけです。
if login_flg: # ログイン成功 text = "投稿テストを行います" url = "https://this.kiji.is/759884204002656256" post_tweet(driver, text, url)
もちろん、post_tweet関数も新規で追加しています。
post_tweet関数に関しては、自動ログインと同じロジックです。
post_tweet関数で説明がいるとすれば、「urllib.parse.quote」でURLエンコードしていることでしょうか。
あと、それに伴ってurllib.parseをimportしています。
import urllib.parse
自動ログインのサンプルコードさえ理解できれば、今回は何も難しいことはありません。
では、上記のサンプルコードを実行してみましょう。
普通に投稿が行われます。
そして、ツイートとしても確認できます。
以上、Twitter APIなしの自動ツイートについて説明しました。