VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 128|回复: 4

[已解决]winhttp课程的post问题

[复制链接]
99_avatar_middle
最佳答案
1 
online_vip 发表于 2020-2-21 12:27:23 | 显示全部楼层 |阅读模式
本帖最后由 风度猫 于 2020-2-21 19:08 编辑

长期求助一名萌师傅,我会卖萌会孝敬,可以按咨询频次包月收费.
VC驿站官方的post教程可能5年前的了,之前的例子的网站都关闭了,找老师又发了一个说是类似的,但是中间遇到一个问题,第一步获取cookie的地方就无法获取.我尝试了添加协议头进去,貌似也不行.求大佬解惑.
代码如下
  1. void CMFCwinhttppostDlg::OnBnClickedOk()
  2. {
  3.         CoInitialize(NULL);
  4.         IWinHttpRequestPtr P_http = NULL;
  5.         CString H_body, H_name, H_password,H_str;
  6.         _bstr_t H_header;
  7.         K_Edit_name.GetWindowText(H_name);
  8.         K_Edit_passwod.GetWindowText(H_password);
  9.         H_body.Format(_T("u_name=%s&u_password=%s&imageField=登录"), H_name, H_password);
  10.         HRESULT hr = P_http.CreateInstance(__uuidof(WinHttpRequest));
  11.         if (FAILED(hr))return;
  12.         hr = P_http->Open(_T("POST"), _T("http://www.idc816.com/chklogin.asp"));
  13.         if (FAILED(hr))return;
  14.         //P_http->SetRequestHeader(_T("accept"), _T("text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3"));
  15.         //P_http->SetRequestHeader(_T("accept-encoding"), _T("gzip, deflate"));
  16.         //P_http->SetRequestHeader(_T("accept-language"), _T("zh-CN,zh;q=0.9"));
  17.         //P_http->SetRequestHeader(_T("content-type"), _T("application/x-www-form-urlencoded"));
  18.         //P_http->SetRequestHeader(_T("origin"), _T("http://www.idc816.com"));
  19.         //P_http->SetRequestHeader(_T("proxy-authorization"), _T("Basic ZjUwMmRkOTkxZWY3NmYxZTBiNzE2ZDY3NDFlZWI4YWI6ZGFqaW4xMjM="));
  20.         P_http->SetRequestHeader(_T("referer"), _T("http://www.idc816.com/default.asp"));
  21.         //P_http->SetRequestHeader(_T("upgrade-insecure-requests"), _T("1"));
  22.         P_http->SetRequestHeader(_T("user-agent"), _T("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36"));
  23.         COleVariant body_srt;
  24.         body_srt = H_body;
  25.         hr = P_http->Send(body_srt);
  26.         if (FAILED(hr))return;
  27.         long H_Status=P_http->Status;
  28.         H_str.Format(_T("返回status值:%d\n"), H_Status);
  29.         OutputDebugString(H_str);
  30.         H_header = P_http->GetAllResponseHeaders();
  31.         OutputDebugString(H_header);
  32.         CoUninitialize();
  33.         CDialog::OnOK();
  34. }
复制代码

源代码文件
winhttp课程的post问题 MFC_winhttp_post.zip (131.94 KB, 下载次数: 5)




上一篇:对话框扩展操作问题
下一篇:c++的mfcd达成的效果
99_avatar_middle
最佳答案
1 
ico_lz  楼主| 发表于 2020-2-21 12:31:43 | 显示全部楼层
尝试调试输出了Status值,返回200证明请求成功了,但是没获取到cookie,应为老师给的这个新站有验证码,获取验证码的时候要提交cookie所以这一步就卡住了.
51_avatar_middle
最佳答案
57 
online_admins 发表于 2020-2-21 22:36:26 | 显示全部楼层    本楼为最佳答案   
bestAnswer
1、不知道自己发的包是什么样的,就没办法跟浏览器的对比,这里可以在代码中设置你的程序使用的本地 Fiddler 代理:
在  CreateInstance 之后,添加如下代码:
  1. HTTPREQUEST_PROXY_SETTING HTTPREQUEST_PROXYSETTING_DEFAULT = 0;
  2. HTTPREQUEST_PROXY_SETTING HTTPREQUEST_PROXYSETTING_PRECONFIG = 0;
  3. HTTPREQUEST_PROXY_SETTING HTTPREQUEST_PROXYSETTING_DIRECT = 1;
  4. HTTPREQUEST_PROXY_SETTING HTTPREQUEST_PROXYSETTING_PROXY = 2;
  5. hr = P_http->SetProxy(HTTPREQUEST_PROXYSETTING_PROXY, _T("127.0.0.1:8888"));
复制代码

这样就可以在Fiddler中看到自己发送的Http包信息了;

2、按照你代码我发出去之后,看到的错误信息如下:
  1. HTTP/1.1 302 Object moved
  2. Date: Fri, 21 Feb 2020 14:09:39 GMT
  3. Content-Type: text/html
  4. Content-Length: 191
  5. Connection: close
  6. Cache-Control: private
  7. Location: /error.asp?errstr=%C7%EB%C2%BC%C8%EB%C4%FA%D2%AA%B5%C7%C2%BD%B5%C4%D5%CA%BA%C5%C3%DC%C2%EB%2E
  8. Set-Cookie: ASPSESSIONIDCQQQTCTD=EIBLLAPDFBMOJMCJPPIFCLEE; path=/
  9. X-Powered-By: ASP.NET
  10. Server: wts/1.2
  11. Proxy-Connection: keep-alive

  12. <head><title>       &#438; </title></head>
  13. <body><h1>       &#438; </h1>      <a HREF="/error.asp?errstr=%C7%EB%C2%BC%C8%EB%C4%FA%D2%AA%B5%C7%C2%BD%B5%C4%D5%CA%BA%C5%C3%DC%C2%EB%2E"> &#756; </a>.</body>
复制代码


错误页面地址有了:error.asp?errstr=

3、对比下自己程序的包和浏览器的有什么不同?
浏览器的:
  1. POST http://www.idc816.com/chklogin.asp HTTP/1.1
  2. Host: www.idc816.com
  3. Proxy-Connection: keep-alive
  4. Content-Length: 57
  5. Cache-Control: max-age=0
  6. Origin: http://www.idc816.com
  7. Upgrade-Insecure-Requests: 1
  8. Content-Type: application/x-www-form-urlencoded
  9. User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
  10. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
  11. Referer: http://www.idc816.com/default.asp
  12. Accept-Encoding: gzip, deflate
  13. Accept-Language: zh-CN,zh;q=0.9
  14. Cookie: ASPSESSIONIDCQQQTCTD=LHBLLAPDNLACJAMALAJIFALK; safecode=f691cef80127b409

  15. u_name=net_sy&u_password=19851218&imageField=%B5%C7%C2%BC
复制代码


自己程序的:
  1. POST http://www.idc816.com/chklogin.asp HTTP/1.1
  2. Proxy-Connection: Keep-Alive
  3. Accept: */*
  4. Referer: http://www.idc816.com/default.asp
  5. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36
  6. Content-Length: 51
  7. Host: www.idc816.com

  8. u_name=net_sy&u_password=19851218&imageField=登录
复制代码


差在哪呢?最关键的就是 Content-Type 你没设置,但是发现你的代码中确实有,但是被注释掉了,我们打开注释。
再次查看我们自己的程序登录之后返回的包,正确啦!!!!
winhttp课程的post问题

你要问我看这个怎么就知道成功了?都让你进管理页面了,难道还没成功吗?
  1. <a HREF="/Manager/">
复制代码
51_avatar_middle
最佳答案
57 
online_admins 发表于 2020-2-21 22:37:06 | 显示全部楼层
重要的就是对比包,对比浏览器的和自己发送的有什么不同!
这个网站相对简单,POST过去的账号和密码都没有加密,也不用研究 js 脚本,所以不难的
99_avatar_middle
最佳答案
1 
ico_lz  楼主| 发表于 2020-2-22 11:57:06 | 显示全部楼层
最后应该是有302重定向,我用谷歌浏览器显示的是200没重定向造成的无解,谢谢老师的耐心查看
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-4-9 22:47

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表