Autoit: HTTP-запрос, как войти на сайт - PullRequest
0 голосов
/ 02 августа 2020

Привет, я пытаюсь войти на en.forgeofempires.com с помощью http-запроса. Я действительно не знаю, как это сделать, но добился значительных успехов.

Вот информация из сети в chrome

Request Headers: 
:authority: en.forgeofempires.com
:method: POST
:path: /glps/login_check
:scheme: https
accept: application/json, text/plain, */*
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9,nb;q=0.8,sv;q=0.7
content-length: 85
content-type: application/x-www-form-urlencoded; charset=UTF-8
cookie: metricsUvId=b3101c98-4f26-4614-95a7-fb26978130f9; _fbp=fb.1.1564063487771.1575313619; 
        ig_conv_last_site=https://en13.forgeofempires.com/game/index; glps_exp_dc=ag1185a; 
        portal_tid=1595784514678-50397; device_view=full; 
        portal_ref_url=https://en0.forgeofempires.com/page/; 
        PHPSESSID=mh81candht9492apd1nb71fiatsmr6p28759fdrcdtelr7u9; XSRF-TOKEN=gdC1RBZsCkekiR6Z- 
        1EVetD3- 
        skzAvLg7zSB11YjBXc; portal_ref_session=1; portal_data=portal_tid=1595784514678- 
        50397&portal_ref_url=https://en0.forgeofempires.com/page/&portal_ref_session=1; 
        fs_cr=1596385201458
origin: https://en.forgeofempires.com
referer: https://en.forgeofempires.com/glps/iframe-login
sec-fetch-dest: empty
sec-fetch-mode: cors
sec-fetch-site: same-origin
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) 
Chrome/84.0.4147.105 Safari/537.36
x-requested-with: XMLHttpRequest
x-xsrf-token: gdC1RBZsCkekiR6Z-1EVetD3-skzAvLg7zSB11YjBXc

Form Data 
login[userid]: user
login[password]: pass
login[remember_me]: false

view source:
login%5Buserid%5D=user&login%5Bpassword%5D=pass&login%5Bremember_me%5D=false

Вот ответ, который получает Google

cache-control: max-age=0, must-revalidate, private
content-encoding: gzip
content-type: application/json
date: Sun, 02 Aug 2020 16:20:07 GMT
server: nginx
set-cookie: PHPSESSID=smq4rrp2gtp7an4t5vqsjd0npbbk7tumo8n04thkk8nbuer3; path=/; secure; HttpOnly; 
            SameSite=Lax
set-cookie: glps_remember_me=deleted; expires=Sat, 03-Aug-2019 16:20:06 GMT; Max-Age=0; path=/; 
            secure; httponly
status: 200
x-said: 549565

В autoit у меня есть этот код для отправки запроса:

#include "WinHttp.au3"
Opt("MustDeclareVars", 1)

; !!!Note that this example will fail because of invalid username and password!!!

; Authentication data
Global $sUsername = "UserName"
Global $sPassword = "Password"

; Address
Global $sAddress = "en.forgeofempires.com"

; Initialize and get session handle
Global $hOpen = _WinHttpOpen()

; Get connection handle
Global $hConnect = _WinHttpConnect($hOpen, $sAddress)

; Request
Global $hRequest = _WinHttpOpenRequest($hConnect, _
    "POST", _ ; verb
    "/glps/login_check", _    ; target
    Default, _ ; version
    "en.forgeofempires.com", _    ; referer
    "*/*") ; accept

; Send it
_WinHttpSendRequest($hRequest, _
    "Content-Type: application/x-www-form-urlencoded" & @CRLF, _
    "login%5Buserid%5D=user&login%5Bpassword%5D=pass&login%5Bremember_me%5D=false")

; Wait for the response
_WinHttpReceiveResponse($hRequest)

; See what's returned
If _WinHttpQueryDataAvailable($hRequest) Then
    Global $sHeader = _WinHttpQueryHeaders($hRequest)
    ConsoleWrite($sHeader & @CRLF)
    ; Check if proper cookie is given
If StringInStr($sHeader, 'Set-Cookie: uchome_loginuser=' & $sUsername) Then
    MsgBox(0, "", "Login success")
Else
    MsgBox(0, "", "Login failed")
EndIf
Else
    MsgBox(48, "Error", "Site is experiencing problems.")
EndIf


; Close open handles and exit
_WinHttpCloseHandle($hRequest)
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)

И вот ответ, который я получаю в своей консоли

HTTP/1.1 200 OK
Cache-Control: max-age=0, must-revalidate, private
Connection: keep-alive
Date: Sun, 02 Aug 2020 16:56:14 GMT
Transfer-Encoding: chunked
Content-Type: text/html; charset=UTF-8
Server: nginx
Set-Cookie: XSRF-TOKEN=8b33ZwZLqTnxwlK6wTPbUN_gKcNGTa1y1AxxiRk0gEk; path=/; secure
Set-Cookie: glps_exp_dc=deleted; expires=Sat, 03-Aug-2019 16:56:13 GMT; Max-Age=0; path=/; httponly
X-SaId: 549234

Я просмотрел различные ответы в chrome и консоль, что этот x-xsrf-токен может быть проблемой с моей причиной кода в chrome Он отправлен в заголовке запроса но в autoiit я получаю этот токен в заголовке ответа ??? Не уверен, где я ошибаюсь, но похоже, что сервер игнорирует пользователя и передаю, что я отправляю любую помощь, чтобы мне удалось успешно войти в мою учетную запись, было бы очень удобно

1 Ответ

0 голосов
/ 04 августа 2020

Хорошо, вот обновленный ответ, но все еще не удается войти в систему, но получить успешный ответ от сервера,

#include "WinHttp.au3"
#include <File.au3>


; Authentication data
Global $sUsername = "user"
Global $sPassword = "pass"

; Open needed handles
$hOpen = _WinHttpOpen()
$hConnect = _WinHttpConnect($hOpen, "en.forgeofempires.com")
; Specify the reguest:
$hRequest = _WinHttpOpenRequest($hConnect)

; Send request
_WinHttpSendRequest($hRequest)

; Wait for the response
_WinHttpReceiveResponse($hRequest)

; Get cookies
If _WinHttpQueryDataAvailable($hRequest) Then
    Global $sHeader = _WinHttpQueryHeaders($hRequest)
    ;ConsoleWrite("Response Headers" & @CRLF)
    ;ConsoleWrite($sHeader & @CRLF)

; Get cookies
$i = 0
FileDelete(@ScriptDir & "\System\Cookies.txt")
Local Const $sFilePath = @ScriptDir & "\System\Cookies.txt"
Local $hFileOpen = FileOpen($sFilePath, $FO_APPEND)
While 1
    $sCookie = _WinHttpQueryHeaders($hRequest, $WINHTTP_QUERY_SET_COOKIE, Default, $i)
    $i = @extended
    If $i Then
        ;ConsoleWrite("cookie->: " & $sCookie & @crlf)
        FileWrite($hFileOpen, "Set-Cookie: " & $sCookie & @CRLF)
    Else
        ExitLoop
    EndIf
WEnd
FileClose($hFileOpen)
Else
     MsgBox(48, "Error", "Site is experiencing problems.")
EndIf

FileOpen($sFilePath, 0)
;MsgBox(48, "Cookie Payload line 2", FileReadLine($sFilePath, 2))
;MsgBox(48, "Cookie Payload line 4", FileReadLine($sFilePath, 4))

; Request
Global $hRequest = _WinHttpOpenRequest($hConnect, _
    "POST", _ ; verb
    "/glps/login_check", _    ; target
    Default, _ ; version
    "https://en.forgeofempires.com/glps/iframe-login", _    ; referer
    "*/*") ; accept

$sHeaders = "Content-Type: application/x-www-form-urlencoded" & @CRLF


; Send it
_WinHttpSendRequest($hRequest, _
    $sHeaders, _ ;header(s)
    "login%5Buserid%5D=" & $sUsername & "login%5Bpassword%5D=" & $sPassword & 
    "&login%5Bremember_me%5D=false")

; Wait for the response 
_WinHttpReceiveResponse($hRequest)

; See what's returned
If _WinHttpQueryDataAvailable($hRequest) Then
   Global $sHeader = _WinHttpQueryHeaders($hRequest)
    ConsoleWrite($sHeader & @CRLF)
; Check if proper cookie is given
If StringInStr($sHeader, 'Set-Cookie: uchome_loginuser=' & $sUsername) Then
    MsgBox(0, "", "Login success")
Else
    MsgBox(0, "", "Login failed")
EndIf
Else
    MsgBox(48, "Error", "Site is experiencing problems.")
EndIf



; Close handles
_WinHttpCloseHandle($hRequest)
_WinHttpCloseHandle($hConnect)
_WinHttpCloseHandle($hOpen)
...