从零开始学编程

 找回密码
 立即注册

QQ登录

只需一步,快速开始

界面工厂编程视频教程广告联系qq1031180668广告位
查看: 1139|回复: 9

实战post登陆网站

[复制链接]
  • ta_mind

    2016-10-1 18:52
  • classn_01: 64 classn_02

    [LV.6]常住居民II

    785

    主题

    1490

    帖子

    2595

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    2595

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

    发表于 2016-1-19 15:58:18 | 显示全部楼层 |阅读模式
    QQ截图20160118233416.png


    上面是做好的程序,输入账号密码点击登陆就登陆到到网站。


    要想做出上面的程序首先得抓取登陆的包,抓包开始。
    打开IE,输入www.idc3389.com 我的测试账号是:c0ks  密码是123456 ,希望大家测试的是别改密码,这样就省得大家费力气每个人都注册了。
    打开网址后输入账号和密码:

    vc实战post登陆网站

    vc实战post登陆网站

    然后F12打开开发者工具,点击开始抓包之后在网页上点击登录:
    QQ截图20160119140347.png
    现在就抓取到了登陆的包。

    从图片可以看出,前两个包都是post的包,第一个的结果是302,也就是说
    第一个post之后302跳转到了第二个地址,但是提交的数据都是一样的,不信
    咱们可以看一下,点击第一个数据包,然后点击详细信息里的请求正文:
    QQ截图20160119140854.png
    QQ截图20160119140926.png

    可以看到第一url提交的数据:              username=c0ks&password=123456&screenwidth=&screenheight=&Submit.x=33&Submit.y=12
    用通样的方法看第二个url提交的数据:username=c0ks&password=123456&screenwidth=&screenheight=&Submit.x=33&Submit.y=12
    可以看出完全一样。
    分析下提交的数据 :username=c0ks&password=123456&screenwidth=&screenheight=&Submit.x=33&Submit.y=12
    咱们在登陆的时候只是输入了账号和密码,咱们看下这条数据里面:
    username=c0ks&password=123456
    usename=c0ks  //账号
    password=123456 //密码
    剩下的这些:&screenwidth=&screenheight=&Submit.x=33&Submit.y=12   先不管它。
    post登陆的包抓到了,也简单分析了,接下来就是用vc++调用winhttp来实现用程序登陆。


    用程序来实现登陆,界面就如同这个:

    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    CoInitialize(NULL);
            IWinHttpRequestPtr  pHttpRequst = NULL;
            HRESULT  hr = pHttpRequst.CreateInstance(__uuidof(WinHttpRequest));
            if (FAILED(hr))
            {
                    MessageBox(_T("实例化失败")); return;
            }
    
            

    这些都不用说了吧?  前面教程里都用很多遍了。
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    pHttpRequst->Open(_T("POST"), _T("http://www.idc3389.com/user/userlogin.asp"));

    用post方式打开 http://www.idc3389.com/user/userlogin.asp ,这个地址通过复制第一个数据的url得来

    实战post登陆网站

    实战post登陆网站
    右键复制。

    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    pHttpRequst->SetRequestHeader(_T("Content-Type"), _T("application/x-www-form-urlencoded"));



    SetRequstHeader 方法用来设置协议头,Content-Type是协议头里决定编码方式的,application/x-www-form-urlencoded这个编码方式的得知是这样的:
    QQ截图20160119143450.png
    不用管application/x-www-form-urlencoded这个是什么意思,在程序里把Content-Type设置的和需要提交的网站上的一样就行了。

    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    CString strUser, strPass,strbody;
            GetDlgItemText(IDC_EDIT1,strUser);
            GetDlgItemText(IDC_EDIT2, strPass);

    获取两个edit的文本,一个是账号 一个是密码
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    strbody.Format(_T("username=%s&password=%s&screenwidth=&screenheight=&Submit.x=39&Submit.y=7"),strUser,strPass);



    把提交的数据包里的账号和密码替换为我们输入的。

    [AppleScript] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    COleVariant vorBody;
            vorBody = strbody;
            pHttpRequst->Send(vorBody);


    send发送的参数是COleVariant类型的,所以把strbofy也就是post的数据包赋值给COleVariant类型的变量,然后用Send方法发送就可以了。


    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    _variant_t varRspBody = pHttpRequst->GetResponseBody();

    _variant_t  是封装的variant类型,用在com中,这里用GetResponseBody()获取返回的数据流,而不是用GetResponseText()获取文本是有原因的,
    先看下用MessageBox显示出来GetResponseText()获得的数据是怎么样的 :
    QQ截图20160119153642.png   
    显示全为乱码。。什么原因呢?
    在网页上右键->查看源
    QQ截图20160119154149.png

    [HTML] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    content="text/html; charset=gbk" 

    那么说明这个网页是的编码是gbk也就是宽字节,而vs默认用的编码是Unicode的编码,所以用信息框显示出来会乱码,
    为了解决这个问题就用GetResponseBody()获取返回的数据流,然后把数据流转换为char类型:

    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    char *pContentBuffer = (char *)varRspBody.parray->pvData; //转换方法



    转换成功之后用赋值给CString类变量,方便进行查找分析返回值操作:

    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    CString strCntBuffer;


    先用MessageBox看下返回的网页源码是否正常:
    2345截图20160203204938.png
    现在看来已经转换成功,此时还剩下一个问题就是怎么才能知道是否已经成功登陆!




    vc实战post登陆网站

    vc实战post登陆网站

    在浏览器上登陆成功之后会发现跳转到这样一个页面,在页面上可以看到
    欢迎您: c0ks  可用金额: 0.00 元  等待入帐金额: 0.00 元        登陆时间:2016-2-3 20:53:31 IP:xxx.xx.xx.xxx
    ,现在查看网页源码,搜索 "欢迎您:"
    2345截图20160203205621.png


    发现可以找到,这就是登陆后网页源码中存在的一个验证是否登陆的特征。
    这样咱们就可以看获取到的网页源码中是否有"欢迎您:",如果有的话就代表登陆成功。
    用CString 实现代码:
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    CString strSucKey(_T("欢迎您:"));




    最后
    释放Winhttp组件对象
    卸载COM组件
    [C++] syntaxhighlighter_viewsource syntaxhighlighter_copycode
    pHttpRequst.Release();

    完成。Ctrl+F5 然后输入账号密码测试:
    2345截图20160203210336.png

    完整的代码见附件下载。





    post提交登陆.rar

    128.99 KB, 下载次数: 45

    售价: 1 编程币  [记录]

    vc++post登陆网站源码




    上一篇:使用IE11自带的f12开发者工具抓包
    下一篇:【转载】VC++COM编程之截取网页密码框密码
    不积跬步,无以至千里
  • ta_mind

    2016-3-27 03:04
  • classn_01: 7 classn_02

    [LV.3]偶尔看看II

    5

    主题

    29

    帖子

    71

    积分

    注册会员

    Rank: 2

    积分
    71
    发表于 2016-2-7 13:01:06 | 显示全部楼层
    支持管理员  很多论坛都是乱七八糟的   你这里我感觉很不错 一个字 清晰
  • ta_mind

    2016-10-1 18:52
  • classn_01: 64 classn_02

    [LV.6]常住居民II

    785

    主题

    1490

    帖子

    2595

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    2595

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

     楼主| 发表于 2016-2-7 13:02:36 | 显示全部楼层
    mjxke 发表于 2016-2-7 13:01
    支持管理员  很多论坛都是乱七八糟的   你这里我感觉很不错 一个字 清晰

    谢谢支持
    不积跬步,无以至千里
  • ta_mind
    开心
    2016-7-13 23:53
  • classn_01: 18 classn_02

    [LV.4]偶尔看看III

    1

    主题

    23

    帖子

    59

    积分

    注册会员

    Rank: 2

    积分
    59
    发表于 2016-2-14 19:33:14 | 显示全部楼层
    已经很详细了,辛苦了!
    电脑知识
  • ta_mind

    2016-10-1 18:52
  • classn_01: 64 classn_02

    [LV.6]常住居民II

    785

    主题

    1490

    帖子

    2595

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    2595

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

     楼主| 发表于 2016-2-14 23:22:10 | 显示全部楼层
    不积跬步,无以至千里
    回复

    使用道具 举报

  • ta_mind
    开心
    2016-4-7 14:45
  • classn_01: 12 classn_02

    [LV.3]偶尔看看II

    5

    主题

    38

    帖子

    111

    积分

    注册会员

    Rank: 2

    积分
    111
    发表于 2016-3-25 19:03:14 | 显示全部楼层
    请问大婶 这里302自动处理了吗  另外cookie 应该怎么管理呢 比如我想将登陆成功后的cookie提取出来 让下一次post 或 get使用  
  • ta_mind

    2016-10-1 18:52
  • classn_01: 64 classn_02

    [LV.6]常住居民II

    785

    主题

    1490

    帖子

    2595

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    2595

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理论坛元老

     楼主| 发表于 2016-3-25 19:11:24 | 显示全部楼层
    hj就好好干 发表于 2016-3-25 19:03
    请问大婶 这里302自动处理了吗  另外cookie 应该怎么管理呢 比如我想将登陆成功后的cookie提取出来 让下一 ...

    302 默认是自动跳转的, cookie登陆成功后从协议头取出来就可以了,下次登陆设置到winhttp的的协议头里就可以免登陆的。当然具体情况跟网站有关
    不积跬步,无以至千里
  • ta_mind
    开心
    2016-4-7 14:45
  • classn_01: 12 classn_02

    [LV.3]偶尔看看II

    5

    主题

    38

    帖子

    111

    积分

    注册会员

    Rank: 2

    积分
    111
    发表于 2016-3-25 20:49:16 | 显示全部楼层
    夜的黑 发表于 2016-3-25 19:11
    302 默认是自动跳转的, cookie登陆成功后从协议头取出来就可以了,下次登陆设置到winhttp的的协议头里就 ...

      O(∩_∩)O谢谢老大科普
  • ta_mind
    开心
    2016-4-28 10:47
  • classn_01: 1 classn_02

    [LV.1]初来乍到

    0

    主题

    29

    帖子

    73

    积分

    禁止发言

    积分
    73
    发表于 2016-4-28 11:45:40 | 显示全部楼层
    感觉是个好东东,谢谢
  • ta_mind
    奋斗
    2016-7-21 23:17
  • classn_01: 11 classn_02

    [LV.3]偶尔看看II

    0

    主题

    17

    帖子

    45

    积分

    新手上路

    Rank: 1

    积分
    45
    发表于 2016-7-6 15:02:09 | 显示全部楼层
    很不错的教程。楼主很喜欢用图文并茂呀。。。。要是能视频讲解那就极好了
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Archiver|小黑屋|sitemap|从零开始学编程 ( 豫ICP备15032706号-2 )

    GMT+8, 2017-4-27 09:26 , Processed in 1.140662 second(s), 35 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

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