この記事は学生団体P&DのAdventCalendar2018 4日目の投稿です。
はじめに
当初はTwitterAPIを使った簡単なWEBアプリケーションを開発して、それを記事にしようと思ったのですが、それを思いついたのがこの記事を書く前日で、TwitterAPIの使用を認可されるまでに数日かかるようなので惜しくも断念...
(追記: いざTwitterAPI登録してみると、登録自体はめんどくさいけど一瞬で認可された。)
他にネタもなかったので、憎きTwitterAPIを使わずにseleniumを使って無理やりTwitterにログインして、自動ツイートすることにした。
seleniumのinstall
まずはgemのseleniumをインストールします。
> gem install selenium-webdriver
chromedriverのダウンロード
chromedriverをダウンロードします。
ダウンロードしたchromedriverは以下のようにrubyのbinaryと同じディレクトリ内に配置します。
> which ruby
/Users/username/.rbenv/shims/ruby
> mv chromedriver /Users/username/.rbenv/shims/
実装
require 'selenium-webdriver'
driver = Selenium::WebDriver.for :chrome
url = 'https://twitter.com/login?lang=ja'
# Twitterログインページに移動
driver.get url
# Twitter登録情報
email = "hogehoge@example.com"
password = "xxxxxxxx"
# Twitterにログイン
driver.find_element(:xpath, '//*[@id="page-container"]/div/div[1]/form/fieldset/div[1]/input').send_keys email
driver.find_element(:xpath, '//*[@id="page-container"]/div/div[1]/form/fieldset/div[2]/input').send_keys password
driver.find_element(:xpath, '//*[@id="page-container"]/div/div[1]/form/div[2]/button').click
sleep 1
# ツイートする内容
message = "WoW"
# ツイート
driver.find_element(:xpath, '//*[@id="tweet-box-home-timeline"]').send_keys message
driver.find_element(:xpath, '//*[@id="timeline"]/div[2]/div/form/div[3]/div[2]/button').click
sleep 1
# 終了
driver.quit
実行
> ruby tweet.rb
実行するとseleniumで制御されたchromeが開き、以下のように勝手にTwitterにログイン、ツイートします。
無事、投稿ができました!👏
詰まったところ
ログイン画面でのElementの指定にcssを使うとエラーが出る
最初は以下のように、nameで指定していたのですが、
driver.find_element(:name, "session[password]").send_keys password
このようにelementがインタラクティブじゃねぇと怒られる。
element not interactable (Selenium::WebDriver::Error::ElementNotVisibleError)
試行錯誤した結果、xpathで指定してあげるとうまく動いた。
driver.find_element(:xpath, '//*[@id="page-container"]/div/div[1]/form/fieldset/div[2]/input').send_keys password
なぜだ!?!?
おわりに
絶対、Twitterの規約に反してるよね...