2012-03-14 13 views
6

Đã sửa đổi (câu hỏi được làm rõ)Tôi cần phải xóa dữ liệu khỏi trò chơi facebook - sử dụng ruby ​​

Tôi đã dành một vài ngày để tìm cách xóa thông tin cụ thể khỏi trò chơi facebook; tuy nhiên, tôi đã chạy vào tường gạch sau bức tường gạch. Tốt nhất là tôi có thể nói, vấn đề chính là như sau. Tôi có thể sử dụng công cụ kiểm tra phần tử của Chrome để tìm html theo cách thủ công mà tôi cần - nó xuất hiện ẩn bên trong khung nội tuyến. Tuy nhiên, khi tôi cố gắng và cạo iframe đó, nó là sản phẩm nào (trừ tài sản):

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

Đây là cùng một đầu ra mà tôi thấy nếu tôi sử dụng một trình duyệt "Xem mã nguồn trang web" công cụ. Tôi không hiểu tại sao tôi không thể thấy dữ liệu trong khung nội tuyến. Câu trả lời KHÔNG phải là nó được AJAX thêm vào sau đó. (Tôi biết rằng cả hai vì "Xem nguồn trang" có thể đọc dữ liệu được thêm bởi Ajax và cũng vì tôi đã b/c tôi đã đợi cho đến sau khi tôi có thể xem trang dữ liệu trước khi cạo nó và nó vẫn không có).

Điều này có đang xảy ra do việc cạo màn hình chống vi-rút của Facebook và nếu có cách nào đó xung quanh nó? Hay tôi chỉ thiếu một cái gì đó. Tôi lập trình bằng ruby ​​và tôi đã thử nokogiri, rồi cơ giới hoá, rồi capybara mà không thành công.

Tôi không biết liệu nó có tạo ra sự khác biệt hay không, nhưng dường như với iframe là dữ liệu của nó bằng cách sử dụng tham chiếu "game_frame" của khung nội tuyến có vẻ là đoạn html xuất hiện trước đó trong tài liệu:

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

gốc câu hỏi

tôi đã viết một chương trình ruby ​​có sử dụng nokogiri để trích xuất dữ liệu từ HTML một trò chơi facebook của. Hiện tại, tôi nhận được HTML bằng cách sử dụng công cụ "kiểm tra phần tử" của chrome và tôi lưu nó vào một tệp và phân tích cú pháp từ đó. Tuy nhiên, tôi thực sự muốn có thể truy cập thông tin từ bên trong ruby. Ví dụ, tôi sẽ vượt qua chương trình tên trang "www.gamename.com/...?id=12345" và nó sẽ đăng nhập vào facebook, đi đến trang đó và loại bỏ dữ liệu. Hiện tại, nếu tôi thử điều đó, nó không hoạt động vì tôi được chuyển hướng đến trang đăng nhập của facebook. Làm thế nào tôi có thể vượt qua màn hình đăng nhập để truy cập (các) trang mà tôi cần?

Tôi muốn thực hiện việc này bằng mã nokogiri mà tôi đã viết; tuy nhiên, nếu tôi phải viết lại nó bằng cách sử dụng cái gì khác. Hiện tại, chương trình là một chương trình độc lập - không phải là chương trình đường ray - nhưng tôi có thể thay đổi điều đó. Tôi đã thấy một số thông tin có thể chỉ cho tôi theo hướng của Omniauth nhưng tôi không chắc chắn đó là những gì tôi đang tìm kiếm và nó cũng có vẻ rất phức tạp. Tôi hy vọng có một giải pháp đơn giản hơn.

Cảm ơn

Trả lời

6

Tôi có thể đề xuất capybara-webkit cho loại công việc này. Nó sử dụng QtWebkit dưới mui xe và hiểu 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) 
+0

Mặc dù tôi không thể có được webkit để làm việc b/c của các vấn đề xây dựng các cửa sổ đá quý, tôi đã có thể sử dụng Capybara để lấy thông tin tôi cần. Điểm dính lớn nhất là vì thông tin tôi cần được chứa trong một khung, nó không xuất hiện trong HTML cho trang chính. Tuy nhiên, cuối cùng tôi đã nhận ra rằng nếu tôi sử dụng phương pháp within_frame, tôi sẽ có thể truy cập thông tin trong khung và điều này đã hiệu quả. –

4

Cách đơn giản nhất là sử dụng mechanize:

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'] = '[email protected]', '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 
+0

Tôi đã sử dụng RestClient để làm điều gì đó tương tự, mặc dù bạn cần quản lý cookie, chuyển hướng vv trong RestClient. cơ giới hóa trông giống như một ứng cử viên tốt để giảm bớt những nhiệm vụ này. – ch4nd4n

+0

tùy thuộc vào ứng dụng, thiếu hỗ trợ JavaScript có thể là một showstopper. –

+0

Tôi đã thử điều này và có vẻ như nó hoạt động rất tốt để đăng nhập. Tuy nhiên, nó dường như không giải quyết vấn đề cụ thể của tôi. Thông tin mà tôi đang tìm kiếm ở bên trong một hình thức ẩn mà không được đọc bởi Nokogiri. Ngay cả tùy chọn trình duyệt web "nguồn xem" chuẩn không thể xem nội dung của biểu mẫu ẩn, chỉ có biểu mẫu ẩn. Nokogiri thậm chí không thấy điều đó. Chỉ công cụ phần tử kiểm tra của Chrome mới có thể xem thông tin. Tôi không biết đủ để hiểu điều này có nghĩa là gì hay cách giải quyết vấn đề này. –