Размещение данных программно - PullRequest
0 голосов
/ 24 августа 2009

Я хочу программно загрузить содержимое веб-страницы, но эта страница создается в результате процедуры POST, и я не могу заставить ее работать.

Это страница: http://jp.translink.com.au/mobile/Input.aspx

Вы можете ввести следующие значения, чтобы увидеть, как это работает:

От: Железнодорожная станция Coorparoo

Кому: Центральный железнодорожный вокзал

Я следил за трафиком с помощью tcpdump и воссоздал его, используя код в меру своих возможностей. Вот код теста:

http = Net::HTTP.new("jp.translink.com.au", 80)
path = "/mobile/Input.aspx"

# GET request -> so the host can set his cookies
resp, data = http.get(path, nil)
cookie = resp.response['set-cookie']

viewstate = data.match(/"__VIEWSTATE" value="([^"]+)"/)[1]

# POST request -> logging in
data = "__VIEWSTATE=#{viewstate}&FromTextBox=mitchelton+railway+station&FromModeList=stopLandmark&ToTextBox=morayfield+railway+station&ToModeList=stopLandmark&VehicleList%3A1=on&HourList=11&MinuteList=40&NoonList=PM&DateList=0&goButton=Go%21"
headers = {
  'Cookie' => cookie,
  'Referer' => 'http://jp.translink.com.au/mobile/Input.aspx',
  'origin' => 'http://jp.translink.com.au',
  'Content-Type' => 'application/x-www-form-urlencoded',
  'User-Agent' => 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-us) AppleWebKit/530.19.2 (KHTML, like Gecko) Version/4.0.2 Safari/530.19',
  'Accept' => 'application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5',
  'Accept-Language' => 'en-us',
  'Accept-Encoding' => 'gzip, deflate'
}

resp, data = http.post(path, data, headers)

# Output on the screen -> we should get either a 302 redirect (after a successful login) or an error page
puts 'Code = ' + resp.code
puts 'Message = ' + resp.message
resp.each {|key, val| puts key + ' = ' + val}
puts data

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

РЕДАКТИРОВАТЬ: Спасибо немногие, которые ответили на мой вопрос. Я ниже, это решение моей проблемы:)

require 'mechanize'
agent = WWW::Mechanize.new
initial_page = agent.get('http://jp.translink.com.au/mobile/Input.aspx')
initial_form = initial_page.form('InputForm')
initial_form.FromTextBox = 'Mitchelton Railway Station'
initial_form.radiobuttons_with(:name => 'FromModeList')[1].check
initial_form.ToTextBox = 'Morayfield Railway Station'
initial_form.radiobuttons_with(:name => 'ToModeList')[1].check
initial_form.checkbox_with(:name => 'VehicleList:0').uncheck
initial_form.checkbox_with(:name => 'VehicleList:2').uncheck
go_button = initial_form.buttons[0]
result_page = agent.submit(initial_form, go_button)
puts result_page.body

Ответы [ 3 ]

5 голосов
/ 24 августа 2009

Я бы не стал использовать библиотеку Net с нуля, есть множество драгоценных камней, которые специально созданы для того, чтобы делать то, что вы хотите, посмотреть на что-то вроде mechanize или, может быть, Вебрат или нокогири .

Все, что в наши дни можно уничтожить, если вы столкнетесь с более серьезными проблемами (например, с генерацией контента страницы ajax), вам, возможно, придется прибегнуть к программному управлению экземпляром браузера - webrat интегрируется с Selenium, инструментом тестирования, который позволяет браузер из кода и проверить дом браузер в реальном времени. Однако этот подход медленный, поэтому попробуйте сначала механизировать, он сможет делать то, что вы хотите.

1 голос
/ 24 августа 2009

Не вдаваясь в подробности, ваш cookie, безусловно, неверен. Вы получаете

Set-Cookie: ASP.NET_SessionId=2wo3lv455p2mbfimbmyyqoua; path=/

.... и затем следует отправить его обратно без части ; path=/, например:

Cookie: ASP.NET_SessionId=2wo3lv455p2mbfimbmyyqoua

РЕДАКТИРОВАТЬ : Кроме того, где ваша длина контента?

РЕДАКТИРОВАТЬ 2 : Где ваш хозяин? Вы не можете обойтись без хоста, если веб-сайт также не будет работать только на основе IP-адресов. Что, в данном случае, на самом деле делает ... Тем не менее: сравните заголовки браузеров с собственными ...

РЕДАКТИРОВАТЬ 3 : необходимо закодировать значение для VIEW_STATE.

(Обратите внимание, что, например, расширение Firefox LiveHTTPHeaders может сделать жизнь проще, чем tcpdump. Используя опцию Replay, я вижу, что cookie не требуется, но __VIEW_STATE действительно есть. также увидим, что он закодирован и отличается от значения, полученного с помощью GET.)

0 голосов
/ 24 августа 2009

Перейти с механизировать. Если это не помогло, вы можете использовать firewatir для автоматизации Firefox из Ruby.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...