迅雷第一次登录是不需要验证码的,就很方便了。首先还是要解决登录的问题,也不是那么容易解决的,这个是在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. html页脚固定在底部的方法

    <style type="text/css"> html { height: 100%; } body { height: 100%; margin: 0; paddi ...

  2. 你的IDEA过期了?跃哥四大招帮你稳住

    作者:Dimple Solgan:当你的才华还无法撑起你的野心时候,那应该静下心来好好学习 前天晚上在群里风风火火组建了两个学习小组,一个是面向Java初学,一个是面向Python初学,把我搞的兴奋不 ...

  3. js中的事件委派

    在介绍JS中事件委派之前先来看看一个简单的需求:为每一个超链接绑定一个单击响应函数并在控制台打印一句话,内容是:” a 标签的单击响应函数“.下面是这个需求的代码: <!DOCTYPE html ...

  4. 比特币学习笔记(一)---在windows下编译搭建比特币环境

    最近打算研究下比特币源码,却发现这套源码正常情况下得在linux下编译运行,而我的机器是windows的. 怎么办呢? 起初打算用mingw和cygwin搞搞看,试了许久后发现行不通,必须转到linu ...

  5. Faceted project metadata file "/.settings/org.eclipse.wst.common.project.facet.core.xml" could not be read

    转载自 https://blog.csdn.net/qing_gee/article/details/79397052 Eclipse启动后项目报了下图这个错误,说是org.eclipse.wst.c ...

  6. 多态(C++)

    #include <iostream> using namespace std; class HeroFighter { public: virtual int power() { ; } ...

  7. mac-air 搭建vue开发环境

    周末没事干,自己搭建个vue环境. 我用的是mac-air,自带brew很好用. 要安装vue 得先安装node.js的包管理工具npm. brew install npm 等待安装完成,查看node ...

  8. Go 每日一库之 fsnotify

    简介 上一篇文章Go 每日一库之 viper中,我们介绍了 viper 可以监听文件修改进而自动重新加载. 其内部使用的就是fsnotify这个库,它是跨平台的.今天我们就来介绍一下它. 快速使用 先 ...

  9. Unity3D游戏开发培训

    Unity3D游戏开发培训 作者:Jesai 时间:2017-01-08 修改:2017-01-09 12:36:15 1         项目的构成 图1-1 如图1-1所示,Unity3D的项目构 ...

  10. git 工作实用创建删除分支

    一.创建分支 .创建本地分支并切换 git checkout -b dev_wt2 .创建切换并关联远程分支 git checkout -b dev_wt3 orgin/dev_wt3 .创建远程分支 ...