迅雷第一次登录是不需要验证码的,就很方便了。首先还是要解决登录的问题,也不是那么容易解决的,这个是在POST是提交的表单【u=joneeky%40qq.com&p=cf1e22e61d987c37c5c07facb1169b03&verifycode=%2153P&login_enable=0&login_hour=720】,要先分析这个表单“u=”后面是账号,邮箱格式和话要把“@”换为“%40”;“p=”后面是进过加密的密码,这就是关键;“verify=”后面是动态生成的验证码,这种验证码是不需要去输入的,提交的时候会自动完成;再后面的东西就是固定的了,不需要管。
    先分析一下“verify=”后面的数据是怎么来的。这种内部生成的验证码都是以“!”感叹号开头的,也就是里面的“%21”,后面3个则是大写字母和数字随机组合。每一次进入迅雷登录页面(http://i.xunlei.com/login.html)后,当你输入完账号光标离开输入账号的编辑框时,这个验证码就是已经设置好的,抓包看了一下,就是每一次输入完账号,会有一个这样的GET请求【/check?u=joneeky%40qq.com&cachetime=1337413954326】,“u=”后面是我的账号,“cachetime=”后面就是请求的时间,精确到毫秒,一看这种133开头的时间就是计算机被制造出来到现在所发生的时间,这种时间可以用
time 函数获取,它接受一个time_t指针类型的参数,其实就是long指针类型,这样就可以获取前面10位,后面3位是毫秒,可以用 GetLocalTime 函数得到。提交这个表单,成功后会返回Cookies,大致这样【check_result=0:!TPR】,验证码就在cookies里面,就是“!TPR”,我是用 CinternetSession::GetCookie 得到Cookies的。
    有了验证码和密码,就可以算出“p=”后面的了密钥。经过大量实验,发现密钥是一个这样的公式【p=MD5(MD5(MD5(密码))+验证码)】,就是密码两次MD5加密,然后结合验证码再MD5一次。至于MD5算法怎么样的,就自己找吧。
    提交一个登录请求后,成功了会返回很多行Cookies,如果里面有“nickname”这样的cookie就说明登录成功,否则是失败了。要用 CHttpFile::QueryInfo 来获取Cookies了,但是我发现MFC里封装的 CHttpFile::QueryInfo 函数有BUG,只能得到第一行Cookie, 这样就没有办法判断有没有登录成功了。原先我想过直接调用API函数 HttpQueryInfo ,但是发现CHttpFile::m_hFile 是protected成员,不能访问(微弱真贱)。然后在网上找到了
CHttpFile::QueryInfo 的代码,微软写的 HttpQueryInfo 最后一个参数永远是0,这样就只能得到索引位0的Cookie了,也就是第一行,我只要把这个参数改为函数传进去的index就行了,要改这个函数无非是重载它了,重载前要先继承一下 CHttpFile 类,代码就在最下面给出吧。
    登录成功后就可以获取流量了,在这个页面【http://dynamic.i.xunlei.com/user】,这个地方:

我试过直接拿到这个页面的html源码是不可以的,因为数据是通过ajax显示出来的,必须要拿到ajax的数据,是一个这样的GET请求【/ajax?c=user&a=lixiangaosu&cachetime=1337416140406】,后面的时间上面说过了。返回的数据大致是这样的:

“used_capacity”就是已使用的流量,一看就知道单位是字节(bit),转换成G的话要除以3次1024,最后精确到百分位。

---------------------完-------------------

重载 CHttpFile::QueryInfo 数代码如下:

class CMyHttpFile: public CHttpFile

{

public:

 BOOL QueryInfo(DWORD dwInfoLevel, CString &str, LPDWORD lpdwIndex) const

 {

  ASSERT(dwInfoLevel <= HTTP_QUERY_MAX);

  ASSERT_VALID(this);

  ASSERT(m_hFile != NULL);

BOOL bRet;

  DWORD dwLen = 0;

str.Empty();

  if(HttpQueryInfo(m_hFile, dwInfoLevel, NULL, &dwLen, lpdwIndex))

  {

   bRet = TRUE;

  }

  else 

  {

   LPTSTR pstr = str.GetBufferSetLength(dwLen);

   bRet = HttpQueryInfo(m_hFile, dwInfoLevel, pstr, &dwLen, lpdwIndex);

   if (bRet)

   {

    str.ReleaseBuffer(dwLen);

   }

   else

   {

    str.ReleaseBuffer(0);

   }

  }

  return bRet;

 }

};

------------------------------

这是我已经做好的程序,源码下载地址(VC6.0工程):http://dl.dbank.com/c0i0ydhsnj

【VC++开发实战】迅雷晒密及批量查询流量程序的更多相关文章

  1. 《Visual C++开发实战1200例 第1卷》扫描版[PDF]

    [内容简介:] <Visual C++开发实战1200例(第1卷)>是“软件开发实战1200例”丛书之一.<Visual C++开发实战1200例(第1卷)>,编程实例的四库全 ...

  2. 《Visual Basic开发实战1200例》包括第I卷、第II卷共计1200个例子,本书是第I卷,共计600个例子。

    本书以开发人员在项目开发中经常遇到的问题和必须掌握的技术为中心,介绍了应用Visual Basic进行程序开发各个方面的知识和技巧.主要包括基础知识.窗体界面设计.控件应用等.全书分6篇20章,共计6 ...

  3. AI应用开发实战 - 手写识别应用入门

    AI应用开发实战 - 手写识别应用入门 手写体识别的应用已经非常流行了,如输入法,图片中的文字识别等.但对于大多数开发人员来说,如何实现这样的一个应用,还是会感觉无从下手.本文从简单的MNIST训练出 ...

  4. 崔庆才Python3网络爬虫开发实战电子版书籍分享

    资料下载地址: 链接:https://pan.baidu.com/s/1WV-_XHZvYIedsC1GJ1hOtw 提取码:4o94 <崔庆才Python3网络爬虫开发实战>高清中文版P ...

  5. C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇)

    C语言-apache mod(模块开发)-采用VS2017开发实战(windows篇) 名词解释:apxs apxs is a tool for building and installing ext ...

  6. 《Python 3网络爬虫开发实战中文》超清PDF+源代码+书籍软件包

    <Python 3网络爬虫开发实战中文>PDF+源代码+书籍软件包 下载: 链接:https://pan.baidu.com/s/18yqCr7i9x_vTazuMPzL23Q 提取码:i ...

  7. Python3网络爬虫开发实战PDF高清完整版免费下载|百度云盘

    百度云盘:Python3网络爬虫开发实战高清完整版免费下载 提取码:d03u 内容简介 本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib.req ...

  8. chrome拓展开发实战:页面脚本的拦截注入

    原文请访问个人博客:chrome拓展开发实战:页面脚本的拦截注入 目前公司产品的无线站点已经实现了业务平台组件化,所有业务组件的转场都是通过路由来完成,而各个模块是通过requirejs进行统一管理, ...

  9. 《Android NFC 开发实战详解 》简介+源码+样章+勘误ING

    <Android NFC 开发实战详解>简介+源码+样章+勘误ING SkySeraph Mar. 14th  2014 Email:skyseraph00@163.com 更多精彩请直接 ...

随机推荐

  1. vs2017编译installer项目提示缺少visualstudio2010shell(Integrated)-CHN

    这个问题折腾我一天,欲仙欲死啊~~~~~~! 国内的网站各种百度,都不行. 还是Google大神比较强,在stackoverflow.com找到了解决方法,说来也简单,难者不会,会者不难! ----- ...

  2. Python 植物大战僵尸代码实现: 图片加载和显示切换

    游戏介绍以前很火的植物大战僵尸游戏, 本想在网上找个python版本游戏学习下,无奈没有发现比较完整的,那就自己来写一个把.图片资源是从github上下载的,因为图片资源有限,只能实现几种植物和僵尸. ...

  3. maven中scope标签各个值的意义

    在使用maven配置时,有时候会见到scope这个标签,但是总是记不住他们所对应的含义,现在整理一下,以后忘记了再来查看. 版权声明:本文为CSDN博主「MrZhangBaby」的原创文章,遵循 CC ...

  4. matplotlib绘制符合论文要求的图片

    最近需要将实验数据画图出来,由于使用python进行实验,自然使用到了matplotlib来作图. 下面的代码可以作为画图的模板代码,代码中有详细注释,可根据需要进行更改. # -*- coding: ...

  5. 拥有 GitHub 开源项目的小伙伴,免费申请 JetBrains 全家桶的全流程详解

    工欲善其事,必先利其器.如果您想要学习 Java.PHP.Ruby.Python.JavaScript.Objective-C..NET 中的任何一种开发技术,国际知名且屡获殊荣的 JetBrains ...

  6. 【转】JavaScript 3D图表

    文章系本人原创,转载请保持完整性并注明出自<四火的唠叨> 在说3D图表以前,首先要明确两个概念,一个是数据的维度,一个是呈现数据载体的维度.对于数据的维度,一维的数据呈现,但是呈现的载体是 ...

  7. 移动端保存当前屏幕内容为图片,canvas图片拼接

    需求:1.移动端点击分享时,截屏当前屏幕,并保存为图片  2.将截屏的图片与一张二维码图片进行拼接后,生成一张新的图片 技术栈:html2canvas.js.canvas2image.js 代码:(j ...

  8. cf - 920 c 求能否实现交换

    C. Swap Adjacent Elements time limit per test 1 second memory limit per test 256 megabytes input sta ...

  9. 读取配置文件,appsettings.json和注入ICO

    https://www.cnblogs.com/knowledgesea/p/7079880.html 引入Nuget的两个类库 Microsoft.Extensions.Configuration ...

  10. hdu6621 二分加主席树

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6621 Problem Description You have an array: a1, a2,  ...