html - http请求未收到预期响应(或未被解析)[webkit表单边界]

标签 html delphi winsock recaptcha wininet

我正在创建一个简单的应用程序,让用户管理他/她的 Aeria Games)帐户。 我打算用它来为我玩的某个游戏创建一个辅助应用程序。 我的问题是,当我发送请求时,它发送的响应看起来与获取请求版本完全相同(是的,我知道,很奇怪)并且不会更改任何内容(我当前正在尝试更改电子邮件,但我也想要进行密码管理(毕竟,没有密码更改器的帐户管理应用程序算什么))。

这是一个成功的 HTTP POST 请求,它更改了电子邮件(我使用 fiddler 捕获浏览器的 http 请求)。

POST http://www.aeriagames.com/user/92466845/edit/account HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer: http://www.aeriagames.com/user/92466845/edit/account
Accept-Language: en-US
User-Agent: Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)
Content-Type: multipart/form-data; boundary=---------------------------7dd3e30504ac
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Content-Length: 1589
DNT: 1
Host: www.aeriagames.com
Pragma: no-cache
Cookie: __utmc=71836108; lang=en; __utma=71836108.1752246952.1385652238.1385867504.1385918072.10; __utmz=71836108.1385596659.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); utm_ref=http://www.aeriagames.com/; __utmv=71836108.|1=v_sp=0=1^2=v_age=34=1^3=v_gen=NA=1^4=v_acct=0=1; _gaUniversalX=GA1.2.1752246952.1385652238; __gads=ID=1f31e24ad29d5444:T=1385669247:S=ALNI_MbSMtFcxyx6woFbnCDcXByJCbzrKA; __utmb=71836108.22.9.1385918564155; ag_signup_completed=1; AGESESSID=ed691e273007a36397cb1d3bd4e69f3a; AGESESSID_SIG=NWZkOGMxNjNlYzZkY2Y1OGYwYTY5MzNkNjE3NzM3NTMyZjFhNGZkZnxlZDY5MWUyNzMwMDdhMzYzOTdjYjFkM2JkNGU2OWYzYXwkMmEkMTAkQUdTWG0uNXVydnRtY2NwU3JITWk3ZXdKcXBJdXF5YzFzR1A0NUZlSXZiQy9QYThTUkZ3OWF8OTI0NjY4NDV8dWdnaTAzMXwxMzg1OTE4NTU0; AGESESSID_data=a%3A3%3A%7Bs%3A6%3A%22userid%22%3Bs%3A8%3A%2292466845%22%3Bs%3A11%3A%22autologinid%22%3Bs%3A33%3A%221034996301529b705a714616.82880917%22%3Bs%3A11%3A%22user_active%22%3Bi%3A1%3B%7D; __ar_v4=AF2ADDNNHFDFBJXGZLJI2M%3A20131129%3A17%7CQD7EQLJLZRDDNJQQR47BLX%3A20131129%3A17%7CY25KFQ7YFRFMFIIQ5CUA4W%3A20131129%3A17

-----------------------------7dd3e30504ac
Content-Disposition: form-data; name="edit[mail]"

<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="d0a6b9b7a5b4a7b5b190a3b8b1a2bbbcb1a3b5a2a3feb3bfbd" rel="noreferrer noopener nofollow">[email protected]</a>
-----------------------------7dd3e30504ac
Content-Disposition: form-data; name="edit[pass_current_for_mail]"

JX04utgjamezv0
-----------------------------7dd3e30504ac
Content-Disposition: form-data; name="edit[pass_current]"


-----------------------------7dd3e30504ac
Content-Disposition: form-data; name="edit[pass][pass1]"


-----------------------------7dd3e30504ac
Content-Disposition: form-data; name="edit[pass][pass2]"


-----------------------------7dd3e30504ac
Content-Disposition: form-data; name="edit[change_email]"

1
-----------------------------7dd3e30504ac
Content-Disposition: form-data; name="edit[change_pass]"

0
-----------------------------7dd3e30504ac
Content-Disposition: form-data; name="edit[form_token]"

eae5053f2a1ba7844992bdd273d327a9
-----------------------------7dd3e30504ac
Content-Disposition: form-data; name="edit[form_id]"

user_edit
-----------------------------7dd3e30504ac
Content-Disposition: form-data; name="recaptcha_challenge_field"

03AHJ_Vuskvi0iTL9Xkw8rgXRTSdIUKXau6IN4MnP00MdBMTd5Suzl6Px2fsg0VlDFnSeVEHlYKhwTlSiG5aS6KjorEHzRbS7doFsgCACSL8ZyLWDaEy9-RaPvC5ivxjhrPFCjLXM4YufV8_Ezxuo4pDsnEyn6tvmUJZzCwhGmbOOOZuMmcD9ITTs
-----------------------------7dd3e30504ac
Content-Disposition: form-data; name="recaptcha_response_field"

James lmndme
-----------------------------7dd3e30504ac
Content-Disposition: form-data; name="op"

Submit
-----------------------------7dd3e30504ac--

我为什么要留下那封电子邮件并经过那里?电子邮件已再次更改,因此如果您尝试登录该网站,它将无法工作(我不想编辑任何详细信息,以防出现问题)。 是的,密码正确。

(fiddler 不记录来自 Winsock 的 http 请求/响应,所以我必须只发布函数的响应)。 函数发送 xx 数据后,它应该以重定向响应(在 header 中),但事实并非如此!...

您可以在此处获取单位: http://pastebin.com/f2EemQjS (AeriaAPI.pas)

http://pastebin.com/VNsj9ZwB (uFunc.pas)

这是使用示例:

Procedure Aeria(user, pass:string);
var
  val:String;
  a:TAeria;
label 
  restart1, restart2, restart3;
begin
  a := TAeria.Create(user, pass);
  if a.Error = INVALID_CAPTCHA then 
  begin

restart1:

    if not GetCaptcha(a) then 
    begin
      Form1.Memo1.Lines.Add('PID 0x' + RandomID + ' exited.');
      Exit;
    end;
    a.ReLogin(user, pass);
    if a.Error = INVALID_CAPTCHA then 
      goto restart1;
  end;
  if (a.Error = INVALID_CREDENTIALS) then 
  begin
    Form1.Memo1.Lines.Add('Invalid username or password!');
    Exit;
  end;
  Form1.Memo1.Lines.Add('Successfully logged in!');

restart2:

  if not( a.GetData() ) then 
  begin
    Form1.Memo1.Lines.Add('an unknown error occured!');
    Exit;
  end;

  if not GetCaptcha(a) then 
  begin
    Form1.Memo1.Lines.Add('Logging out...');
    InternetSetCookie('https://www.aeriagames.com/', nil, '');
    Form1.Memo1.Lines.Add('Logged out!');
    Exit;
  end;

  if not a.AeriaSetEmail('<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a4dccedcd5cfc0d5d1e4d7ccc5d6cfc8c5d7c1d6d78ac7cbc9" rel="noreferrer noopener nofollow">[email protected]</a>') then//<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="90e3e9e7faffeafaf3d0e3f8f1e2fbfcf1e3f5e2e3bef3fffd" rel="noreferrer noopener nofollow">[email protected]</a>'
    ShowMessage(IntToStr(a.Error));

  if a.Error = INVALID_CAPTCHA then 
  begin
    Form1.Memo1.Lines.Add('invalid captcha!');
    goto restart2;
  end;
  if a.Error <> INVALID_NONE then 
  begin
    case a.Error of
      INVALID_PASSWORD:
        Form1.Memo1.Lines.Add('invalid password!');
      INVALID_TOKEN:
        goto restart2;
      INVALID_COOKIES:
        Form1.Memo1.Lines.Add('error: session expired!');
      INVALID_CREDENTIALS:
        Form1.Memo1.Lines.Add('invalid password or username!');
      INVALID_UNKNOWN:
        Form1.Memo1.Lines.Add('an unknown error occured!');
    end;
    Exit;
  end;
  Form1.Memo1.Lines.Add('Part[1] of [2] Complete.');

restart3:

  if not(a.GetData()) then 
  begin
    Form1.Memo1.Lines.Add('an unknown error occured!');
    Exit;
  end;
  if not GetCaptcha(a) then 
  begin
    Form1.Memo1.Lines.Add('Logging out...');
    InternetSetCookie('https://www.aeriagames.com', nil, '');
    Form1.Memo1.Lines.Add('Logged out!');
    Exit;
  end;
  a.AeriaSetPass('Aefow40tu943kszdfg');
  if a.Error = INVALID_CAPTCHA then 
    goto restart3;
  if a.Error <> INVALID_NONE then 
  begin
    case a.Error of
      INVALID_PASSWORD:
        Form1.Memo1.Lines.Add('invalid password!');
      INVALID_TOKEN:
        goto restart3;
      INVALID_COOKIES:
        Form1.Memo1.Lines.Add('error: session expired!');
      INVALID_CREDENTIALS:
        Form1.Memo1.Lines.Add('invalid password or username!');
      INVALID_UNKNOWN:
        Form1.Memo1.Lines.Add('an unknown error occured!');
    end;
    Exit;
  end;
  Form1.Memo1.Lines.Add('successful.');
end;

该示例将失败,错误代码 = 99,然后退出。

您可能会问的一些问题: 问题:为什么我使用winsock作为HTTPPostRequest函数? 答:我认为该函数的WININET版本有问题,所以我决定使用纯winsock来实现该函数。

问:我调用了 WSAStartUp() xD 吗? A:是的,我有Dx。

问:我使用的是winsock,那么如何检查重定向? 答:我使用 showmessage(recvstr);收到 header 后,它只是响应而不重定向:/

问:为什么不直接在表单上放置一个 TWebBrower 并让用户从中更改他的通行证? A:为什么不在用户端让这个过程变得更简单呢?

我已经解决这个问题好几天了,你们是我最后的希望...我不是要求复制+粘贴,我不需要复制+粘贴答案,我只是希望有人指出我我哪里搞砸了,这样我就可以从错误中吸取教训。

这个项目确实不需要,但是如果我在真正开始将编程作为“工作”时遇到这样的问题怎么办...

最佳答案

我已经明白了! 对于和我有同样问题的人:

“Content-Type:multipart/form-data;boundary=” header 是边界减去两个破折号(“-”)

示例: 如果你的边界是: --------------------------------------7dd37b37e06e2 你发送: ---------------------------7dd37b37e06e2

希望我能帮助别人!我花了三天时间才解决这个问题:(

关于html - http请求未收到预期响应(或未被解析)[webkit表单边界],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20317529/

相关文章:

html - 为不同宽高比的图像在图像的右上角放置一个按钮

c# - 如何在 winform 中显示 html 格式的内容(无图像)?

c++ - Winsock ~ 创建一个 UDP 监听器(多个与 1 个套接字)

c++ - 如何使用getaddrinfo()?

html - 用于响应式网页设计的 CSS 技术

javascript - HTML5 <audio> 中区分音频开始和音频播放(暂停后)

delphi - DWScript:在运行时向 dwsUnit 添加新的数组定义

其他方法中的Delphi nil对象

delphi - TScrollBox 具有自定义平面边框颜色和宽度?

windows - winsock 周围的 BSD 套接字兼容包装器?