VBA WinHTTP для входа в Oddsportal

Я пытаюсь войти в оддспорт через скрипт VBA. Я написал следующий код, но он не работает. Я получаю сообщение об ошибке, когда пытаюсь установить cookie для запроса POST. Я был бы благодарен, если бы кто-то мог указать мне в правильном направлении.

Dim WHTTP As Object
Dim myuser, mypass, url, strAuthenticate As String
Dim out As String

url = "http://www.oddsportal.com/"

myuser = "user"
mypass = "pass"
strAuthenticate = "login-username=" & myuser & "&login-password=" & mypass & "&login-submit="

Set WHTTP = CreateObject("WinHTTP.WinHTTPrequest.5.1")

WHTTP.Open "POST", url, False
WHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36"
WHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
WHTTP.setRequestHeader "Connection", "keep-alive"
WHTTP.send strAuthenticate
strCookie = WHTTP.getResponseHeader("Set-Cookie")  **'I am getting an error here**
strResponse = WHTTP.ResponseText


WHTTP.Open "GET", "http://www.oddsportal.com/soccer/africa/africa-cup-of-nations/results/", False
WHTTP.setRequestHeader "Connection", "keep-alive"
WHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
WHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.114 Safari/537.36"
WHTTP.setRequestHeader "Cookie", strCookie
WHTTP.send

out = WHTTP.ResponseText

Я изменил метод аутентификации на сервер, используя метод setcredential. Теперь я могу установить cookie из первой части. Однако я все еще не могу получить данные со второй страницы (вторая часть кода). Вот заголовки ответа, которые я получил с помощью setcredentials: Моя строка set cookie может сохранить только последний cookie.

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
   Connection: keep-alive
   Date: Tue, 27 May 2014 16:01:29 GMT
   Pragma: no-cache
   Transfer-Encoding: chunked
   Content-Type: text/html
   Expires: Thu, 19 Nov 1981 08:52:00 GMT
   Age: 0
   Server: Apache
   Set-Cookie: op_lang=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/
   Set-Cookie: op_oddsportal=fehof62734n35crjd9vpshhf10; path=/
   Set-Cookie: op_cookie-test=ok; expires=Wed, 27-May-2015 16:01:28 GMT; path=/
   Set-Cookie: op_state=1
   Set-Cookie: op_last_id=1; expires=Thu, 26-Jun-2014 16:01:28 GMT; path=/
   Set-Cookie: op_cookie-test=ok; expires=Wed, 27-May-2015 16:01:28 GMT; path=/
   Vary: Accept-Encoding
   X-Deliver: Tue, 27 May 2014 16:01:29 GMT

Это файл cookie, который я получаю от Fiddler:

Set-Cookie:op_user_logout=0; expires=Mon, 18-May-2015 18:44:49 GMT; path=/
Set-Cookie:op_last_id=1; expires=Thu, 26-Jun-2014 18:44:49 GMT; path=/
Set-Cookie:op_user_login_id=95774; expires=Mon, 18-May-2015 18:44:49 GMT; path=/
Set-Cookie:op_user_login_hash=73a967ad18d6a353afa12877309f4708; expires=Mon, 18-May-2015 18:44:49 GMT; path=/
Set-Cookie:op_cookie-test=ok; expires=Wed, 27-May-2015 18:44:48 GMT; path=/
Set-Cookie:op_user_time_zone=1.00; expires=Thu, 26-Jun-2014 18:44:49 GMT; path=/
Set-Cookie:op_user_full_time_zone=35; expires=Thu, 26-Jun-2014 18:44:49 GMT; path=/
Set-Cookie:op_lang=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/

person user3674413    schedule 25.05.2014    source источник
comment
У вас есть более подробная информация об ошибке, которую вы получаете?   -  person Kyle Gobel    schedule 26.05.2014
comment
Проверьте WHTTP.Status после отправки, но перед попыткой получить значение cookie   -  person barrowc    schedule 26.05.2014
comment
@barrowc: я проверяю статус, прежде чем получить значение cookie, оно равно 200   -  person user3674413    schedule 26.05.2014
comment
@Kyle: в строке cookie, выделенной выше, я получаю сообщение об ошибке «Запрошенный заголовок не найден».   -  person user3674413    schedule 26.05.2014
comment
Используйте Debug.Print WHTTP.GetAllResponseHeaders, чтобы узнать, какие заголовки на самом деле возвращаются   -  person barrowc    schedule 27.05.2014
comment
@barrowc Cache-Control: public Соединение: keep-alive Дата: вторник, 27 мая 2014 г., 15:25:48 по Гринвичу Передача-кодирование: chunked Content-Type: text/html Срок действия: вторник, 27 мая 2014 г., 15:26:17 по Гринвичу Последнее изменение: вторник, 27 мая 2014 г., 15:25:17 GMT Возраст: 32 Сервер: Apache Вариант: Accept-Encoding X-Deliver: вторник, 27 мая 2014 г., 15:25:48 GMT   -  person user3674413    schedule 27.05.2014
comment
@barrowc: Пожалуйста, проверьте мои первоначальные вопросы. Я сделал несколько выводов.   -  person user3674413    schedule 27.05.2014
comment
Я считаю, что объект WinHTTPrequest может обрабатывать все файлы cookie для вас, поэтому попробуйте закомментировать строку strCookie = ... плюс строку, в которой вы устанавливаете заголовок запроса файла cookie, а затем посмотрите, что произойдет.   -  person barrowc    schedule 28.05.2014
comment
@barrowc: это не сработало.   -  person user3674413    schedule 28.05.2014


Ответы (1)


Я не уверен, что это поможет в данном конкретном случае, но обработка файлов cookie запросов и ответов включена в мою библиотеку Excel -ОТДЫХ. Вот пример получения и установки идентификатора входа и хэша:

Dim OddsClient As New RestClient
OddsClient.BaseUrl = "http://www.oddsportal.com/"

Dim LoginRequest As New RestRequest
LoginRequest.Method = httpPOST
LoginRequest.Format = formurlencoded
LoginRequest.AddParameter "login-username", myuser
LoginRequest.AddParameter "login-password", mypass
LoginRequest.AddParameter "login-submit", ""

Dim LoginResponse As RestResponse
Set LoginResponse = OddsClient.Execute(LoginRequest)

If LoginResponse.StatusCode = 200 Then
  Dim OddsRequest As New RestRequest
  OddsRequest.Resource = "soccer/africa/africa-cup-of-nations/results/"
  OddsRequest.AddCookie "op_user_login_id", LoginResponse.Cookies("op_user_login_id")
  OddsRequest.AddCookie "op_user_login_hash", LoginResponse.Cookies("op_user_login_hash")

  Dim OddsResponse As RestResponse
  Set OddsResponse = OddsClient.Execute(OddsRequest)
End If

У меня были некоторые трудности с извлечением файлов cookie из заголовков, поскольку каждый файл cookie имеет один и тот же ключ заголовка «Set-Cookie». В Excel-REST я разделил getAllResponseHeaders на Collection заголовков ключ-значение для простоты доступа, а затем вытащил заголовки с ключом «Set-Cookie» (см. RestHelpers). В вашем примере может работать что-то похожее на следующее:

Dim Headers As Collection ' of Dictionaries with key, value
Set Headers = ExtractHeadersFromResponseHeaders(WHTTP.getAllResponseHeaders) ' from RestHelpers

' Setup GET...

Dim Header As Dictionary
For Each Header In Headers
    ' Move all cookies from login to GET request
    If Header("key") = "Set-Cookie" Then
        WHTTP.setRequestHeader "Cookie", Header("value")
    End If  
Next Header
person Tim Hall    schedule 04.08.2014