やったもん勝ち

主にプログラミングのこと。生産性向上の某とかも。

SeleniumとRubyでTwitterの複数アカウントを自動ファボ&RT

背景

自分の趣味というか、ちょっとしたプロジェクトでTwitterを運営していて、特定のワードで検索されたときに上位に表示させたいなーと思うことがありました。
一つの方法が、ツイートを頻繁にするということで、それはbotで普通に解決できました。これはノンプログラマーでもできますね

bot化したのはだいぶ前だったので、正確には覚えていませんが、確かココらへんを使ってた思い出があります。というか今も使ってるはずですが忘れて確認するのが面倒くさいだけです。

MAKEBOT - ツイッターボット作成サービス

twittbot - enjoy

楽ボッツ - 初心者向き twitter bot(ボット)サービス

ほんといいサービス達です。

で、Twitterで検索したときは、この画面がまず出るわけです。 f:id:benzenetarou:20170907231557p:plain

検索ワードによって少々構成が変わることもあったりはするみたいですが、基本こんな感じで、まず一番に表示されるのは話題のツイートです。
ここではツイートまたはユーザーが表示されます。
僕の独自の調査では、この表示されるのに有効な要素は、

  • フォロワー数
  • Tweetのファボ数
  • TweetのRT数

ですね。普通か。

ということで、ファボ&RT数を増やしたい。
それも自分の内々のアカウント群で。

どうやら調べてみると、なんとかマティックっていう怪しい有料のツールはあるみたいですが、それはなんか使いたくなかったので、自作してそれっぽいことをすることに。
いや〜成長しましたね〜 2年前の僕は必死にそういうサービスがないか検索しまくるのが関の山でした。
ということで、余談おしまいです。

APIは使えないのか?

TwitterにはもちろんAPIがありますが、ざっと調べた感じ、自動ファボはできなかったような気がします…
前はできたみたいなんですけどね
もしかしたら普通にできたかも。
Seleniumとかスクレイピングの練習ってことで!

コード

ちょっと前に実装したので、driverのinstallのあたりで若干苦戦した気もしますが、忘れてしまいました。

基本的には実際にTwitterのページを開いて開発者ツールでHTMLコード見て、ゴリゴリにチューニングしてどうにかこうにか動くって感じです。
結構Twitterは罠が多いです。ログインのところとか結構罠でした。
そういう理由から、チューニングしきれず、ちょいちょいエラーになりそうなのを強引にその後の処理を捨ててるので、精度はそこまで高くないです。
回り続けることを優先しています。

# execute `$ watch -n 1800 ruby path/to/this/project/auto_favo_RT_with_selenium.rb` to run every 30 minutes
require "selenium-webdriver"
user_names = [
  "account1",
  "account2",
  "account3"
]


for user_name in user_names do
  driver = Selenium::WebDriver.for :firefox

  driver.get "https://twitter.com"

  # ログインする
  sleep 1
  begin
    driver.find_element(:class, "js-login").click
    driver.find_element(:name, "session[username_or_email]").send_key "#{user_name}"
    driver.find_element(:name, "session[password]").send_key "password" #パスワードは全部同じとして
    driver.find_element(:class, "js-submit").click
  rescue
    driver.quit
    puts "login error"
    next
  end
  puts "login with #{user_name}"

  # 検索してファボ&RT
  driver.get "https://twitter.com/search?f=tweets&vertical=default&q=ANYWORD&src=typd"
  for i in 0..10 do
    begin
      driver.find_elements(:class, "js-actionFavorite")[i*2].click
      driver.find_elements(:class, "js-actionRetweet")[i*2].click
      driver.find_element(:class, "RetweetDialog-retweetActionLabel").click
    rescue
      puts "Error: in #{i}"
      break
    end
    sleep 2
  end
driver.quit
end

同じコードですがgithubに上げときます。 github.com

これをMacのターミナルから実行させときます。
$ watch -n 1800 ruby path/to/this/project/auto_favo_RT_with_selenium.rb
これだと1800秒ごと、30分ごとに実行されます。
これは自分のbotのツイート数と併せてこのくらいの感覚でいいなって思って設定しました。
30分ごとに10個ずつふぁぼっていくので、そのくらいのペースということです。
重複しそうになったら、そこでそのループは終了します。

では、悪用しないで楽しいTwitterライフを送りましょう!!!

課題

一つだけ問題点があって、普通にパソコンを使っていると、30分毎にお気にFirefoxが出現して、最前面でブラウザ操作を行っていくことです。
ちょっとうっとうしい。
次のステップとしては、フォローアンフォローも自動化していきたいです。
あとAWSとか使ってやりたい。
ブラウザ操作なんて不細工なことはしたくないな……