見出し画像

【無料】instagramで相互フォローか確認するやつ作りました

※seleniumを始めたい方向けにruby + selenium webdriverチュートリアルという記事もあります。

こんにちわ。合同会社ベステンダンク代表の大浦です。
世間は年の瀬丸出しですね。ワクワクが止まりません。

インスタって相互フォローなのかどうかわかりづらいんですよね。
誰をフォローしてんだかわかんなくなりました。
というわけで片想い状態のアカウントをテキストファイルに出力するやつをseleniumでちょちょいって作りました。

かなり不安定な出来なのですが、これ以上時間かけられないので許してください。無料だし。
修正した安定版を誰かがうpしてくれることを期待しています。

構成はこんな感じ
・windows 10
・ruby 2.3.3
・chromedriver最新
・selenium-webdriver最新

instagramはめちゃめちゃソースの変更があるので、明日には使えなくなるかもしれません。
class名とかのメンテナンスはご自分で行ってくださいね。

環境構築は私のブログに書いてあります。ご参考にどうぞ。
windowsならruby + selenium webdriverも環境設定は15分で終わる | katsulog


require 'selenium-webdriver'

account = ["ログインIDを入力", "パスワードを入力"]
user_id = "ユーザーIDを入力"

@d = Selenium::WebDriver.for :chrome
@wait = Selenium::WebDriver::Wait.new(:read_timeout => 120)

# ログイン
def login(account)
  @d.get("https://www.instagram.com/accounts/login/")

  @wait.until{ @d.find_elements(:name, 'username').size > 0 }

  @d.find_element(:name, 'username').clear
  @d.find_element(:name, 'username').send_keys(account[0])

  @d.find_element(:name, 'password').clear
  @d.find_element(:name, 'password').send_keys(account[1])

  @d.find_element(:xpath, '//*[@class="_0mzm- sqdOP  L3NKy       "]').click

  @wait.until{ @d.find_elements(:xpath, '/html/body/div[3]/div/div').size > 0 }
end

# 自分がフォローしてるアカウントのURLを取りにいく
def get_follow_user(user_id)
  @d.get("https://www.instagram.com/#{user_id}")

  @d.find_element(:xpath, '//*[@id="react-root"]/section/main/div/header/section/ul/li[3]/a').click

  @wait.until{ @d.find_elements(:xpath, '//*[@class="_7UhW9   xLCgt      MMzan   _0PwGv           fDxYl     "]').size > 0 }

  # 一番下までスクロール
  loop do
    before_page = @d.page_source
    begin
      @d.find_elements(:xpath, '//*[@class="_7UhW9   xLCgt      MMzan   _0PwGv           fDxYl     "]').last.click
    rescue
      @d.find_elements(:class, 'wo9IH').last.click
    end
    sleep 0.5
    if before_page == @d.page_source
      break
    end
    sleep 0.5
  end

  # アカウントのURL取得
  links = []
  @d.find_elements(:xpath, '//*[@class="FPmhX notranslate _0imsa "]').each do |user|
    links << user.attribute("href")
  end
  return links
end

# それぞれのアカウントを見に行ってフォローされてるかチェック
def check_follow(links)
  links.each do |url|
    flag = ""
    puts url
    @d.get(url)
    begin
      @wait.until{ @d.find_elements(:xpath, '//*[@id="react-root"]/section/main/div/header/section/ul/li[3]/a').size > 0 }
    rescue
      next
    end
    @d.find_element(:xpath, '//*[@id="react-root"]/section/main/div/header/section/ul/li[3]/a').click

    begin
      @wait.until{ @d.find_elements(:xpath, '//*[@class="_7UhW9   xLCgt      MMzan   _0PwGv           fDxYl     "]').size > 0 }
    rescue
    end

    if @d.find_element(:xpath, '//*[@class="isgrP"]').text.include?("フォローしている人")
      next
    end
    
    before_url = @d.current_url
    # 一番下までスクロール
    loop do
      sleep 2
      before_page = @d.page_source
      if @d.current_url != before_url
        break
      end
      begin
        begin
          @d.find_elements(:class, 'wFPL8 ').last.click
        rescue
          @d.find_elements(:class, 'wo9IH').last.click
        end
      rescue
        @d.find_elements(:xpath, '//*[@class="_7UhW9   xLCgt      MMzan   _0PwGv           fDxYl     "]').last.click
      end

      begin
        if @d.current_url != before_url
          break
        end
        if @d.find_element(:xpath, '//*[@class="isgrP"]').text.include?("\nおすすめ\n")
          begin
            @d.find_elements(:xpath, '//*[@class="_7UhW9   xLCgt      MMzan   _0PwGv           fDxYl     "]').each do |row|
              row.click
              # sleep 0.1
            end
          rescue
            begin
              @d.find_elements(:class, 'wo9IH').each do |row|
                row.click
                # sleep 0.1
              end
            rescue
              retry
            end
          end
        end
      rescue
        retry
      end

      sleep 0.5
      if before_page == @d.page_source
        break
      end
    end

    if @d.find_elements(:xpath, '//*[@class="_7UhW9   xLCgt      MMzan   _0PwGv           fDxYl     "]').size > 0
      @d.find_elements(:xpath, '//*[@class="_7UhW9   xLCgt      MMzan   _0PwGv           fDxYl     "]').each do |user|
        
        if user.find_elements(:xpath, '//*[@class="_0mzm- sqdOP  L3NKy       "]').size == 0
          flag = "follow"
          break
        end
      end
    elsif @d.find_elements(:class, 'wo9IH').size > 0
      begin
        @d.find_elements(:class, 'wo9IH').each do |user|
          if user.find_elements(:class, "_0mzm-").size == 0
            flag = "follow"
            break
          end
        end
      rescue
        retry
      end
    end

    # フォローされてなかったら出力
    if flag != "follow"
      File.open("unilateral_follo_list.txt", "a") do |file|
        file << url + "\n"
      end
    end
  end
end

login(account)

links = get_follow_user(user_id)

check_follow(links)

@d.quit


です。

インスタに限らずこんな感じのものなら作れるのでお声がけください。
もちろん代金はいただきますけど。。

質問あればコメントいただければと思います。
では温かい年末年始をお過ごしくださいませ。