Мне нужно почистить данные из игры на Facebook - используя ruby - PullRequest
5 голосов
/ 14 марта 2012

Пересмотрен (уточненный вопрос)

Я потратил несколько дней, пытаясь выяснить, как извлечь конкретную информацию из игры на Facebook; Тем не менее, я столкнулся с кирпичной стеной за кирпичной стеной. Насколько я могу судить, главная проблема заключается в следующем. Я могу использовать инструмент Chrome для проверки элементов, чтобы вручную найти нужный мне HTML-файл - он расположен внутри iframe. Однако, когда я пытаюсь очистить этот iframe, он пуст (кроме свойств):

<iframe id="game_frame" name="game_frame" src="" scrolling="no" ...></iframe>

Это тот же вывод, который я вижу, если использую браузер «Просмотр источника страницы». Я не понимаю, почему я не вижу данные в iframe. Ответ НЕ в том, что AJAX добавляет его позже. (Я знаю, что и потому, что «Просмотр источника страницы» может читать данные, которые были добавлены Ajax, а также потому, что у меня есть b / c, я ждал до тех пор, пока не смогу увидеть страницу данных, прежде чем очистить ее, а ее все еще нет).

Это происходит из-за антискриптового фейсбука, и если да, то есть ли способ обойти это? Или я просто что-то упустил. Я программирую на рубине и пробовал нокогири, затем механизировал, потом капибара безуспешно.

Я не знаю, имеет ли это какое-то значение, но мне кажется, что iframe получает свои данные, используя ссылку iframe "game_frame", которая, по-видимому, ссылается на этот фрагмент HTML, который появляется ранее в документе:

<form id="hidden_login_form_1331840407" action="" method="POST" target="game_frame">
  <input type="hidden" name="signed_request" autocomplete="off" value="v6kIAsKTZa...">
  ...
</form>

Оригинальный вопрос

Я написал программу ruby, которая использует nokogiri для очистки данных из HTML-кода игры Facebook. В настоящее время я получаю HTML-код с помощью инструмента «Проверка элемента» в Chrome, сохраняю его в файл и анализирую его оттуда. Тем не менее, я бы очень хотел получить доступ к информации из рубина. Например, я передаю программе имя страницы "www.gamename.com/...?id=12345", и она входит в Facebook, заходит на эту страницу и очищает данные. В настоящее время, если я попробую это сделать, это не сработает, потому что я перенаправлен на страницу входа в Facebook. Как пройти через экран входа в систему для доступа к нужным мне страницам?

Я хотел бы сделать это, используя код нокогири, который я уже написал; однако, если бы мне пришлось, я мог бы переписать это, используя что-то еще. В настоящее время эта программа является отдельной, а не рельсовой, но я могу это изменить. Я вижу некоторую информацию, которая может указывать мне направление Омниавта, но я не уверен, что это то, что я ищу, и это также выглядит очень сложно. Я надеюсь, что есть более простое решение.

Спасибо

Ответы [ 2 ]

6 голосов
/ 14 марта 2012

Я могу порекомендовать capybara-webkit для такого рода задач. Он использует QtWebkit под капотом и понимает Javascript:

require 'capybara-webkit'
require 'capybara/dsl'
require 'nokogiri'

include Capybara::DSL
Capybara.current_driver = :webkit

# login
visit("https://www.facebook.com")
find("#email").set("user")
find("#pass").set("password")
find("#loginbutton//input").click

# navigate to the JS-generated page
visit("www.gamename.com/...?id=12345")

# parse HTML
doc = Nokogiri::HTML.parse(body)
4 голосов
/ 14 марта 2012

проще всего использовать механизировать:

require 'mechanize'
@agent = Mechanize.new{|a| a.user_agent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'}
page = @agent.get 'http://www.facebook.com/'
form = page.forms[0]
form['email'], form['pass'] = 'me@myemail.com', 'foobar'
form.submit
# now you're logged in and a request like this:
doc = @agent.get('http://www.facebook.com/').parser
# gives you a logged in Nokogiri::HTML::Document like you're used to
...