Edited at

[ruby]seleniumでTwitterに自動ログイン、自動ツイート

この記事は学生団体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/


実装


tweet.rb


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にログイン、ツイートします。

twitter_login.png

スクリーンショット 2018-12-04 20.15.48.png

スクリーンショット 2018-12-04 20.15.58.png

スクリーンショット 2018-12-04 20.16.06.png

無事、投稿ができました!👏


詰まったところ


ログイン画面での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の規約に反してるよね...