15
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

P&D - Planning and Development -Advent Calendar 2018

Day 4

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

Last updated at Posted at 2018-12-04

この記事は学生団体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の規約に反してるよね...

15
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?