Twitterで自動ツイートをするために、どうしていますか?
おそらく、TwitterのAPIを利用しているはずです。
もちろん、bot(ボット)もAPIの利用が前提でしょう。
でも、TwitterのAPIは制約が多すぎませんか?
そもそも、APIを利用(Developer登録して英語で申請だったはず)するのに手間がかかり過ぎです。
簡単に言うと、TwitterのAPIは使い物になりません。
これには、理由があります。
その理由については、次の記事の「TwitterのAPIが使えない」をご覧ください。
とにかく、もうTwitterのAPIは使い物になりません。
あくまで、無料では。
では、無料枠のAPIでチマチマと頑張るしかないのでしょうか?
いえいえ、ブラウザを自動で操作すればいいのです。
ブラウザをプログラムから操作すれば、ツイートも自動化できます。
また、これならほぼ制約なしでやりたいことができるようになります。
そのための方法を説明していきます。
この記事では、まずはTwitterへの自動ログインについて解説します。
ログインしないとツイートはできませんからね。
本記事の内容
- Twitterへ自動ログインするために必要なモノ
- Twitter自動ログインの仕様
- 【サンプルコード】Twitter自動ログイン
それでは、上記に沿って解説していきます。
Twitterへ自動ログインするために必要なモノ
Twitterへ自動ログインするために必要なモノは、以下。
- Twitterアカウント(ログインID、パスワード)
- Python(プログラム言語)
- Selenium
- ChromeDriver
これらを説明していきましょう。
Twitterアカウント(ログインID、パスワード)
自動ログインするためには、ログインするためのTwitterアカウントが必要です。
ただし、利用するアカウントには注意してください。
新規でボットを作るなどであれば、特に問題ではありません。
ただ、長年愛用しているようなアカウントはやめておいた方が賢明です。
TwitterはAPI以外の自動プログラムに対しては「No」と主張しています。
そのため、いつBANされてもいいようなアカウントを利用しましょう。
まあ、よほどのことがない限りTwitterにはバレませんけどね。
あくまで、リスクを述べているだけです。
Python(プログラム言語)
プログラム言語は、数多くのモノが存在しています。
その中でも、Pythonは作業の自動化に向いたプログラム言語です。
個人的には、最もそのような作業に向いている言語だと思います。
あと、機械学習の分野でもよく利用されていますね。
Pythonでできることについては、次の記事で解説しています。
Selenium
自動ログインにおける主役ですね。
Seleniumは、ブラウザを操作するためのライブラリです。
この記事では、このSeleniumを使って自動ログインを行います。
なお、Seleniumはスクレイピングする際にも大活躍します。
その活躍ぶりに関しては、以下の記事をご覧ください。
Seleniumなしでは、最近のサイトをスクレイピングするのは困難です。
スクレイピングに興味があれば、本ブログは参考になるでしょう。
ChromeDriver
上記のSeleniumは、あくまでブラウザを操作するためのライブラリです。
Seleniumの中にブラウザを含んでいるわけではありません。
実際にインストールされているブラウザを利用するのです。
まずは、どのブラウザを利用するかについて説明します。
Chrome一択です。
FireFoxやIEなども選択肢としては、あります。
しかし、本記事ではChrome以外は解説していません。
これはそういうモノだと受け入れてください。
ここでの本題です。
SeleniumがChromeブラウザと連携できないと何も始まりません。
そのパイプ役が必要です。
それが、ChromeDriverです。
ChromeDriverに関しては、次の記事で詳細を解説しています。
Twitter自動ログインの仕様
仕様と言っても大げさなモノでは、ありません。
プログラムで自動ログインする上でのポイントを説明しています。
ポイントは、以下の3つです。
- ログインフォームが表示されるまで待つ
- ログインボタンがクリック可能になるまで待つ
- div要素(ログインボタン)をクリックする
すべてSeleniumに関わる技術的なポイントです。
Python自体のロジックに関しては、説明しません。
ポイントを一つづつ説明していきます。
ログインフォームが表示されるまで待つ
まずは、ログイン画面へアクセス。
https://twitter.com/login
ログインしていなければ、ログインフォームが表示されています。
基本的には、Seleniumでアクセスするとブラウザの情報を共有しません。
クッキーなどの情報は基本的には残らないと考えてください。
ただし、その自動ログインのプログラムが起動している最中はクッキー情報などは存在しています。
だからこそ、ログインが維持されます。
ここでのポイントは、「ログインフォームが表示されるまで待つ」でしたね。
静的なログインフォームではないということです。
つまり、JavaScriptにより生成されているログインフォームなのです。
そのため、ログインページにアクセスした時点ではログインフォーム部分は存在しないのです。
Twitterも嫌なことをしますよね。
もちろん、これはプログラムによる自動ログインを防ぐための対策です。
Twitterは、随所にこのような対策をちりばめています。
ログインボタンがクリック可能になるまで待つ
初期では、ログインボタンをクリックできません。
ログインID(電話、メールまたはユーザー名)とパスワードが入力されていれば、クリック可能となります。
これ自体は、ユーザビリティ向上のための対応でしょう。
しかし、これが地味にダメージを受けます。
自動ログインする側にとっては。
ログインフォームと同じように、クリック可否の状態をJavaScriptで制御しています。
そうなると、クリック可能になるまで待たないといけません。
さらに、ログインフォームの場合と少し異なります。
ログインIDとパスワードを入力するというアクションがトリガーになっています。
div要素(ログインボタン)をクリックする
今回は、これがもっとも厄介でした。
以下は、ログインボタンのタグです。
ボタンですが、buttonタグではありません。
そして、aタグでもありません。
なんと、divタグなのです!!
まあ、そこまで驚く必要はありませんね。
私もdivタグをボタンにすることは、よくあります。
しかし、これがSeleniumでは若干やっかいなのです。
aタグやbuttonタグであれば、簡単にクリック操作を発動できます。
しかし、divタグには一手間かかるのです。
【サンプルコード】Twitter自動ログイン
2020年10月04日時点では、自動ログインができています。
htmlタグを変更されたら、動かなくなる可能性はありますのでご注意を。
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 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 if __name__ == "__main__": # Driver driver = get_driver() # ログイン login_flg = do_login(driver) print(login_flg) driver.quit()
TWITTER_BASE以外は、各自で変更してください。
CHROMEDRIVER = "chromedriver.exeのパス" TWITTER_BASE = "https://twitter.com/" LOGIN_ID = "メールアドレスとかユーザ名" PASSWORD = "パスワード"
サンプルコードでは、ヘッドレスモードではありません。
ヘッドレスモードとは、ブラウザが目に見えずに起動する状態を言います。
つまり、現状はブラウザが動く様(入力・クリック・遷移)を確認できます。
# ヘッドレスモードでブラウザを起動 options = Options() #options.add_argument('--headless')
ヘッドレスモードにするには、上記コードの「#」を除去してください。
変更した情報が適切であれば、ログインまで行うはずです。
成功すればTrue、失敗すればFalseが表示されます。
ソースの詳細は、コメントを見てください。
あとは、上記で述べた3つのポイントですね。
このポイントをとコードを比較すれば、ある程度の意味がわかると思います。
では、今回はこれで自動ログインの解説を終わります。
ただ、これはスタートに過ぎないのですよね。
自動ツイートであれば、ここからツイートをする作業(プログラム)も必要となります。
ここまで書いてですけど、私は多分自動ツイートをやりません。
追記 2021年4月28日
自動ツイートをやる必要が出てきました。
そのため、自動ツイートの方法もまとめました。
私が自動ログインを必要とした理由は、フォロワーを自動で収集したかったからです。
(自動フォローとかではなく、フォロワーリストの作成をしたいということ)
今のTwitterは未ログインなら、フォロワーを確認できません。
いつからこのような仕様に変更したのでしょう?
まあ、フォロワーを収集するプログラム対策だとは思いますけどね。