迅雷第一次登录是不需要验证码的,就很方便了。首先还是要解决登录的问题,也不是那么容易解决的,这个是在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. 【Spring Cloud 源码解读】之 【如何配置好OpenFeign的各种超时时间!】

    关于Feign的超时详解: 在Spring Cloud微服务架构中,大部分公司都是利用Open Feign进行服务间的调用,而比较简单的业务使用默认配置是不会有多大问题的,但是如果是业务比较复杂,服务 ...

  2. 使用ASP.NET Core 3.x 构建 RESTful API - 4.2 过滤和搜索

    向Web API传递参数 数据可以通过多种方式来传给API. Binding Source Attributes 会告诉 Model 的绑定引擎从哪里找到绑定源. 共有以下六种 Binding Sou ...

  3. 「CH2101」可达性统计 解题报告

    CH2101 可达性统计 描述 给定一张N个点M条边的有向无环图,分别统计从每个点出发能够到达的点的数量.N,M≤30000. 输入格式 第一行两个整数N,M,接下来M行每行两个整数x,y,表示从x到 ...

  4. Django进阶一

    目录 表关系创建 django请求生命周期流程 路由层 无名分组 有名分组 反向解析 路由分发 名称空间 虚拟环境 django版本区别 伪静态 视图层 三板斧 JsonResponse前后端交互数据 ...

  5. js绑定下拉框数据源

    ··· buildRule:function (ruleId) { var ruleList = internal.ruleList; if(ruleList){ var programme_sel= ...

  6. 【Python系统学习03】错误类型整理(一)

    错误类型与可能原因分析 A.语法错误: 1.syntaxError:invalid syntax 无效的语法 print(2019小石头) # print(2019小石头) # ^ # SyntaxE ...

  7. JUnit 5和Selenium基础(一)

    Gradle.JUnit 5和Jupiter Selenium Selenium是一组支持浏览器自动化的工具,主要用于Web应用程序测试.Selenium的组件之一是Selenium WebDrive ...

  8. VMware下Hadoop 2.4.1完全分布式集群平台安装与设置

    1 VM下Ubuntu安装和配置 1.1 安装Ubuntu系统  这个就不说了,不知道的可以去看看其他的博文.   1.2 集群配置     搭建一个由3台机器组成的集群: IP user/passw ...

  9. Go 每日一库之 flag

    缘起 我一直在想,有什么方式可以让人比较轻易地保持每日学习,持续输出的状态.写博客是一种方式,但不是每天都有想写的,值得写的东西. 有时候一个技术比较复杂,写博客的时候经常会写着写着发现自己的理解有偏 ...

  10. 一个DNS数据包的惊险之旅

    踏上旅程 “小子,快去查一下www.paypal.com的IP地址,我急用,晚了我弄你!”,暴躁老哥一把关上了门,留我一个DNS数据包在冷冰冰的房间. 过了一会儿,一位大叔打开了门,带着我来到了一座叫 ...