たれみみマンデー

Ruby(Ruby on Rails)でTwitterフォロー一覧のスクレイピング

Twitter連携アプリ(API)を作っていると、認証のためにパスワードまで要求してきます。

そのためユーザービリティが下がるので自分用にユーザーIDだけでTwitterの情報(不フォローしてる人)を取ってくるプログラムを書きました。

今回はCapybaraとPoltergeistを使っています。

尚、サーバー負荷、著作権に関することなど今一度Twitter利用規約をご覧の上各自の自己責任でお願いします。以下コントローラーです。

indexアクションに飛ぶと動き出します。

class SessionsController < ApplicationController

require 'pp'
require 'capybara/dsl'
require 'capybara/poltergeist'

  def index
    redirect
  end

  def redirect
    scrape = Scrape.new
    scrape.visit_site
    twitter_json
    redirect_to root_path
  end

 class Scrape
    #DSLのスコープを別けないと警告がでます
    include Capybara::DSL

  def initialize()
    Capybara.register_driver :poltergeist do |app|
      Capybara::Poltergeist::Driver.new(app, :inspector => true,js_errors: false, :timeout => 60)
    end
    Capybara.default_driver = :poltergeist
    Capybara.javascript_driver = :poltergeist
    Capybara.run_server = false
  end

  def visit_site
    page.driver.headers = { "User-Agent" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2564.97 Safari/537.36" }

    page.visit('https://twitter.com/******/following')
#スクリーンショットで保存
#    page.save_screenshot('screenshot.png', :full => true)
    begin
      fill_in "session[username_or_email]", with: "********"
      fill_in "session[password]", with: "*******"
    
      click_button "ログイン"
    rescue
    end

#     current_count = page.all('.ProfileCard-avatarLink').length
#     until current_count < page.all('.ProfileCard-avatarLink').length      
#      page.execute_script "window.scrollTo(0, document.body.scrollHeight);"
#     end
#      sleep(5)
#   wait_until { page.

    $friends = []
    doc = Nokogiri::HTML.parse(page.html)
    doc.css('.ProfileCard-avatarLink').each do |element|
      name = element.attribute("title").value
      id = element.attribute("href").value.gsub!("/","@")
        element.css('img').each do |image|
          image_url = image.attribute("src").value
          friends = {}
          friends = {name: name, id: id, image_url: image_url}
    $friends << friends
        end
    end
    pp $friends 
   end
  end
 
 
  def twitter_json
#  user = User.find_by(uid: @@user_id )
#   twitter_client(user) 
#    friends = @client.friends
   friends_json = []
   links_json = []
    
    $friends.each do |friend|
      friend_json = {
         "id" => friend[:id],
         "image_url" => friend[:image_url]
      } 
  friends_json << friend_json

      link_json = {
        "source" => friend[:id],
        "target" => friend[:id] 
      }

      links_json << link_json
    end

    complete_json = {
          "node" => friends_json ,
          "links" => links_json
    }
    @@u = "3"
    File.open("public/#{@@u}.json","w") do |f|
      f.write(complete_json.to_json)
    end 
  end

 

以上。

何かあれば気軽に連絡ください。

 

たれみみ

@taremimimi_7