QQ空间及邮箱验证码登录的校验方式及自动登录的解决方案

目前有很多的SNS社区或类SNS的网站,例如开心、51、校内等,但是发现大多数社区在邀请好友的时候都没有提供对QQ邮箱或者QQ空间好友列表获取的功能,不过似乎海内支持,但是网上相关QQ的文章还不是很多,希望这篇文章能给你带来一些帮助。

QQ空间及邮箱登陆的校验方式:

QQ空间及邮箱登陆的时候,用户输入的密码首先会被页面中的一段Js加密,然后加密过后的密码会加上验证码形成一个新的字串,接着这个新的字串被MD5(32位)加密,加密过后形成最终的密码,这就是我们为什么经常会发现我们在提交的时候我们的密码框中的密码个数会增长的原因,接着在你提交的时候,当前的这个请求会将前一次获取验证码返回的set-cookie值加入到当前请求头的cookie中以保持验证码请求与当前请求的一致性,然后再一并将新的密码和用户名Post到QQ的服务器上去。

好了,看了上面的QQ校验方式以后,我们再来看看怎样使用代码来登录QQ空间及邮箱来获取我们需要的好友和联系人。

QQ空间及邮箱自动登录获取联系人的解决方案:

QQ空间及邮箱登陆首先我们需要将用户输入的密码进行Js加密,但是我们在使用代码登录的时候我们并没有使用到浏览器,那我们怎样驱动Js呢?不用怕,在Java和.NET中都有相应的方式在服务器代码端驱动JS,这里着重讲一下.NET的方法:

首先到微软的网站上下载Windows Script Control,它是一个ActiveX(R) 控件。下载安装完成后,新建一个C#应用程序项目,在解决方案资源管理器中选中引用节点, 右键点击选择添加引用菜单,弹出添加引用对话框,单击浏览找到安装Windows Script Control的目录,选取msscript.ocx文件确定。那么在引用节点下会增加一个MSScriptControl组件,下面是他Interop 后的所有对象。

<!--[if !vml]--><!--[endif]-->

ScriptControl 对支持 ActiveX(TM) Script 的宿主 Script 引擎提供简单接口。接下来我们对被转化成ScriptControlClass类的ScriptControl的属性和方法进行一些说明。

属性

AllowUI 属性:应用于 ScriptControl 本身或 Scirpt 引擎显示的用户界面元素,可读写。

CodeObject 属性:返回对象,该对象用于调用指定模块的公用成员。只读。

Error 属性:返回 Error 对象,其中包含所发生的最后一个错误的相关详细信息。只读。

Language 属性:设置或返回正在使用的 Script 语言名称。可读写。

Modules 属性:为 ScriptControl 对象返回模块集合。只读。

Procedures 属性:返回在指定模块中定义的过程集合。只读。

SitehWnd 属性:设置或返回窗口的 hWnd,通过执行 Script 代码,此窗口用于显示对话框和其他用户界面元素。可读写。

State 属性:设置或返回 ScriptControl 对象的模式。可读写。

Timeout 属性:设置或返回时间(毫秒),此时间后用户可选择中止 Script 代码的执行或允许代码继续执行。可读写。

UseSafeSubset 属性:设置或返回 Boolean 值,指明宿主应用程序是否有保密性要求。如果宿主应用程序需要安全控制,则 UseSafeSubset 为 True,否则为 False。可读写。

方法

AddCode 方法:向模块添加指定代码。可多次调用 AddCode 方法。

AddObject 方法:使主机对象模型对 Script 引擎可用。

Eval 方法:计算表达式并返回结果。

ExecuteStatement 方法:执行指定的语句。

Reset 方法:放弃所有已经添加到 ScriptControl 中的 Script 代码和对象。

Run 方法:运行指定过程。

事件

Error 事件:出现运行时错误时,发生此事件。

Timeout 事件:当超出了 Timeout 属性指定的时间且用户在结果对话框中选定了 End 时,发生此事件。

说明:

AllowUI 属性如果设置为false,则显示对话框之类的语句不起作用,如在 VBScript 中MsgBox 语句,JavaScript中的alert等,并且如果执行的脚本超出TimeOut设置的毫秒数,也不会跳出超出时间提醒的对话框,反之则相反;重新设 置 Language 属性会清空AddCode加载的代码;对于TimeOut属性,发生超时时,ScriptControl 检查对象的 AllowUI 属性,确定是否允许显示用户界面元素。

为了使控件更容易使用,用ScriptEngine类封装一下,下面是完整代码:

using System;

using MSScriptControl;

using System.Text;

namespace ScriptNameSpace

{

/// <summary>

/// 脚本类型

/// </summary>

public enum ScriptLanguage

{

/// <summary>

/// JScript脚本语言

/// </summary>

JScript,

/// <summary>

/// VBscript脚本语言

/// </summary>

VBscript,

/// <summary>

/// JavaScript脚本语言

/// </summary>

JavaScript

}

/// <summary>

/// 脚本运行错误代理

/// </summary>

public delegate void RunErrorHandler();

/// <summary>

/// 脚本运行超时代理

/// </summary>

public delegate void RunTimeoutHandler();

/// <summary>

/// ScriptEngine类

/// </summary>

public class ScriptEngine

{

private ScriptControl msc;

//定义脚本运行错误事件

public event RunErrorHandler RunError;

//定义脚本运行超时事件

public event RunTimeoutHandler RunTimeout;

/// <summary>

///构造函数

/// </summary>

public ScriptEngine()

: this(ScriptLanguage.VBscript)

{ }

/// <summary>

/// 构造函数

/// </summary>

/// <param name="language">脚本类型</param>

public ScriptEngine(ScriptLanguage language)

{

this.msc = new ScriptControlClass();

this.msc.UseSafeSubset = true;

this.msc.Language = language.ToString();

((DScriptControlSource_Event)this.msc).Error += new DScriptControlSource_ErrorEventHandler(ScriptEngine_Error);

((DScriptControlSource_Event)this.msc).Timeout += new DScriptControlSource_TimeoutEventHandler(ScriptEngine_Timeout);

}

/// <summary>

/// 运行Eval方法

/// </summary>

/// <param name="expression">表达式</param>

/// <param name="codeBody">函数体</param>

/// <returns>返回值object</returns>

public object Eval(string expression, string codeBody)

{

msc.AddCode(codeBody);

return msc.Eval(expression);

}

/// <summary>

/// 运行Eval方法

/// </summary>

/// <param name="language">脚本语言</param>

/// <param name="expression">表达式</param>

/// <param name="codeBody">函数体</param>

/// <returns>返回值object</returns>

public object Eval(ScriptLanguage language, string expression, string codeBody)

{

if (this.Language != language)

this.Language = language;

return Eval(expression, codeBody);

}

/// <summary>

/// 运行Run方法

/// </summary>

/// <param name="mainFunctionName">入口函数名称</param>

/// <param name="parameters">参数</param>

/// <param name="codeBody">函数体</param>

/// <returns>返回值object</returns>

public object Run(string mainFunctionName, object[] parameters, string codeBody)

{

this.msc.AddCode(codeBody);

return msc.Run(mainFunctionName, ref parameters);

}

/// <summary>

/// 运行Run方法

/// </summary>

/// <param name="language">脚本语言</param>

/// <param name="mainFunctionName">入口函数名称</param>

/// <param name="parameters">参数</param>

/// <param name="codeBody">函数体</param>

/// <returns>返回值object</returns>

public object Run(ScriptLanguage language, string mainFunctionName, object[] parameters, string codeBody)

{

if (this.Language != language)

this.Language = language;

return Run(mainFunctionName, parameters, codeBody);

}

/// <summary>

/// 放弃所有已经添加到 ScriptControl 中的 Script 代码和对象

/// </summary>

public void Reset()

{

this.msc.Reset();

}

/// <summary>

/// 获取或设置脚本语言

/// </summary>

public ScriptLanguage Language

{

get { return (ScriptLanguage)Enum.Parse(typeof(ScriptLanguage), this.msc.Language, false); }

set { this.msc.Language = value.ToString(); }

}

/// <summary>

/// 获取或设置脚本执行时间,单位为毫秒

/// </summary>

public int Timeout

{

get { return 0; }

}

/// <summary>

/// 设置是否显示用户界面元素

/// </summary>

public bool AllowUI

{

get { return this.msc.AllowUI; }

set { this.msc.AllowUI = value; }

}

/// <summary>

/// 宿主应用程序是否有保密性要求

/// </summary>

public bool UseSafeSubset

{

get { return this.msc.UseSafeSubset; }

set { this.msc.UseSafeSubset = true; }

}

/// <summary>

/// RunError事件激发

/// </summary>

private void OnError()

{

if (RunError != null)

RunError();

}

/// <summary>

/// OnTimeout事件激发

/// </summary>

private void OnTimeout()

{

if (RunTimeout != null)

RunTimeout();

}

private void ScriptEngine_Error()

{

OnError();

}

private void ScriptEngine_Timeout()

{

OnTimeout();

}

}

}

在找到.NET驱动JS的方法以后,那么我们还需要找到QQ用来加密的那个JS文件,具体的JS文件大家可以到QQ的登录页面去DownLoad,如果不知道是哪一个JS大家可以通过抓包的方式去找到,这里就不再赘述了。下面我们就可以用MSScriptControl来驱动JS获取第一次加密的密码了,方法如下:

/// <summary>

/// 得到第一次加密后的密码

/// </summary>

/// <param name="jsFilePath">js文件</param>

/// <param name="funcName">加密的方法名</param>

/// <param name="paramers">加密方法需要传进的参数(一个是密码,另一个是页面上可获取的一个标志码)</param>

/// <returns>加密过后的密码</returns>

private object GetPassword(string jsFilePath, string funcName, params object[] paramers)

{

StreamReader reader = new StreamReader(jsFilePath);

string sScript = reader.ReadToEnd();

ScriptEngine se = new ScriptEngine(ScriptLanguage.JavaScript);

object obj = se.Run(funcName, paramers, sScript);

return obj;

}

通过上面的这个函数我们就可以对密码进行第一次加密了,下一步我们需要获取验证码。

我们可以使用HttpWebRequest类来Get请求这个地址:http://ptlogin2.qq.com/getimage来获取验证码,不过一定要记住把这次请求返回的cookie保存下来,我们可以将它保存到CookieContainer对象中,以便将这次返回的cookie加入到登录POST请求的头当中保持前后请求的一致性。

现在我们将获得的验证码转化成流或者其他的方式供不同的平台输出,我们发现QQ空间及邮箱的验证码生成的图像不是太复杂,所以可以考虑使用图像识别的方式自动的获取图像对应的字符(现在有很多第三方验证码识别软件),当然为了成功率考虑,最好还是让用户手动的输入。

好了有了验证码了,我们现在就将验证码字符加上刚刚我们加过密的密码形成新字串,再通过MD5加密

string pwd=FormsAuthentication.HashPasswordForStoringInConfigFile(this.Password, "MD5").ToLower()

形成最终我们需要的密码。

最后我们就可以将用户输入的用户名、密码一并POST到QQ相应的地址上去,这样我们就成功登陆QQ空间或邮箱了。登录成功过后你当然就可以获取联系人好友等等的操作了。

好了,文章就写到这了,希望对大家有用。^^ Brave chen

转载于:https://www.cnblogs.com/l1b2q31/articles/2767269.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

❤ CSDN精心打造一款插件,让你的浏览器:解锁黑科技、个性十足、沉浸式体验 ❤

&#x1f345; 作者&#xff1a;不吃西红柿 &#x1f345; 简介&#xff1a;CSDN博客专家&#x1f3c6;、HDZ核心组成员&#x1f4aa;、C站总榜前10名✌ &#x1f345; 粉丝专属福利&#xff1a;简历模板、PPT模板、学习资料、面试题库。文末领取 &#x1f345; 如觉得文章…

马云:新一轮技术革命来袭,未来90%的制造业会在互联网上

来源&#xff1a;世界科技创新论坛摘要&#xff1a;这一次技术革命带来的变化远远超出我们的想象&#xff0c;传统制造业必须向新制造转变才有机会。”8月23日&#xff0c;首届中国国际智能产业博览会在重庆开幕&#xff0c;阿里巴巴董事局主席马云表示&#xff0c;新零售之后&…

《算法小白历险记》3.最长公共前缀【python-简单】

&#x1f345; 粉丝专属福利&#xff1a;简历模板、PPT模板、学习资料、面试题库。直接去文末领取 &#x1f345; 如觉得文章不错&#xff0c;欢迎点赞、收藏、评论 题目&#xff1a; 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀&#xff0c;返回空字…

这四大因素决定了中国将在2030年领先全球人工智能市场

来源&#xff1a;资本实验室去年7月&#xff0c;中国制定了《新一代人工智能发展规划》&#xff0c;引起了众多外媒的关注。著名未来学家、奇点大学创始人彼得戴曼迪斯对此也表达了自己的看法。他认为四个方面的因素决定了中国将在2030年领导全球AI市场&#xff1a;丰富的数据资…

❤️《10个超级常用Python方法总结》复制即用丨小白捷径【文末赠书2本】❤️

&#x1f345; 作者&#xff1a;不吃西红柿 &#x1f345; 简介&#xff1a;CSDN博客专家&#x1f3c6;、HDZ核心组成员&#x1f4aa;、C站总榜前10名✌ 欢迎点赞、收藏、评论 &#x1f345; 粉丝专属福利&#xff08;文末送书2本&#xff09;&#xff1a;简历模板、PPT模板…

前端开发推荐-创建一个精美的jquery图片库效果

在Web和图形设计的世界&#xff0c;jquery它是使用最广泛的技术。 在他的帮助下&#xff0c;我们可以创建很多伟大的事情。丰富的jQuery插件&#xff0c;在互联网上&#xff0c;使我们能够毫不费力地创建幻灯片&#xff0c;表格&#xff0c;动画和其他各种良好的效果 在本教程中…

Python爬虫实现:三连文章参与抽奖

&#x1f345; 作者&#xff1a;不吃西红柿 &#x1f345; 简介&#xff1a;CSDN博客专家&#x1f3c6;、HDZ核心组成员&#x1f4aa;、C站总榜前10名✌ &#x1f345; 粉丝专属福利&#xff1a;简历模板、PPT模板、学习资料、面试题库。文末领取 &#x1f345; 如觉得文章…

万维网之父正投身的“互联网去中心化”事业,目前仍有这几大难题

来源&#xff1a;DeepTech深科技本月初&#xff0c;去中心化网络峰会&#xff08;The Decentralized Web Summit&#xff09;在美国旧金山举行。与会的不仅有一众互联网名人——“万维网之父”Tim Berners-Lee、美国非营利性科技组织“互联网档案馆”&#xff08;Internet Arch…

❤ CSDN榜一博主,半年文章汇总【答谢粉丝、文末送书4本】❤

&#x1f345; 作者主页&#xff1a;不吃西红柿 &#x1f345; 简介&#xff1a;CSDN博客专家&#x1f3c6;、HDZ核心组成员&#x1f4aa;、C站周榜第一✌ 欢迎点赞、收藏、评论 &#x1f345; 粉丝专属福利&#xff08;包邮送书4本&#xff0c;书单里自己选&#xff09;&a…

刚刚,特斯拉宣布终止私有化,马斯克最终没能说服大股东

来源&#xff1a;网易智能据外媒报道&#xff0c;刚刚&#xff0c;马斯克在特斯拉官网发布公告称&#xff0c;决定将放弃特斯拉私有化。这位CEO表示&#xff0c;私有化方案比预期的要难。8月7日&#xff0c;现年47岁的马斯克在推特上称&#xff0c;他希望将特斯拉私有化&#x…

阅读作业2王冬篇

No Silver Bullet - Essence and Accidents of Software Engineering&#xff1a; 银弹能杀死狼人。如果我没记错的话&#xff0c;在漫画中柯南对黑暗组织而言就是一颗银弹。生活中是不是真的有银弹我还是不太确定。假如有&#xff0c;银弹就是 一点弱点也没有么&#xff1f;如…

谷歌、脸书、微软、亚马逊、苹果、百度等AI巨头发展路径探析

来源&#xff1a;中国信息通信研究院、造奇智能作者&#xff1a;张婷&#xff0c;中国信息通信研究院产业与规划研究所工程师随着云计算、大数据、算法技术等条件的成熟&#xff0c;人工智能&#xff08;AI&#xff09;在产品优化、消费提升、攻克顽疾、应对气候变化等方面表现…

Python技能树丨Python简介

&#x1f345; 作者主页&#xff1a;不吃西红柿 一、为什么要学Python 短短 20 年间&#xff0c;「计算机和互联网」以一种前所未有的速度&#xff0c;改变了人类的生活 。 我们使用微信 「交流」&#xff0c;使用淘宝 「购物」&#xff0c;使用搜索引擎 「获取信息」&#…

清华自动驾驶前沿报告!解密六大关键技术,全球人才分布【附下载】| 智东西内参...

来源&#xff1a;智东西摘要&#xff1a;清华-中国工程院知识智能联合研究中心从技术、人才、应用和趋势的维度盘点自动驾驶的发展。从传统车企到新造车势力&#xff0c;再到互联网大佬&#xff0c;都在加注自动驾驶。自动驾驶既指向了更高效安全的交通运营系统&#xff0c;也意…

【送书啦】Python操作Mysql(连接、数据探查、写Excel)

&#x1f345; 作者主页&#xff1a;不吃西红柿 &#x1f345; 简介&#xff1a;CSDN博客专家&#x1f3c6;、HDZ核心组成员&#x1f4aa; 欢迎点赞、收藏、评论 &#x1f345; 粉丝专属福利&#xff1a;简历模板、PPT模板、知识体系、面试题库、技术互助。直接去文末领取 &a…

心得14--jsp遍历所有数据标签与转义标签

1. 开发遍历所有类型数据的标签 标签处理类&#xff1a;package com.csdn.web.example;import java.io.IOException;import java.lang.reflect.Array;import java.util.ArrayList;import java.util.Collection;import java.util.HashMap;import java.util.Iterator;import jav…

IBM长文解读人工智能、机器学习和认知计算

来源&#xff1a;人工智能产业链联盟人工智能的发展曾经经历过几次起起伏伏&#xff0c;近来在深度学习技术的推动下又迎来了一波新的前所未有的高潮。近日&#xff0c;IBM 官网发表了一篇概述文章&#xff0c;对人工智能技术的发展过程进行了简单梳理&#xff0c;同时还图文并…

【包邮送书活动】20210928期-开奖通知

【抽奖活动开奖&#xff1a;20210928期】 奖品&#xff1a;包邮实体书 参与方式&#xff1a;CSDN点赞评论收藏文章即可参与、或公众号 开奖通知方式&#xff08;老是有人中奖联系不上&#xff0c;我很郁闷&#xff09;&#xff1a;朋友圈、blink、私信、发文 抽奖文章链接&…

师生脑信息传递的证据:部分学习还是整体学习?

来源 &#xff1a;华东师范大学心理与认知科学学院官网2018年8月&#xff0c;胡谊课题组的研究论文Interpersonal synchronization of inferior frontal cortices tracks social interactive learning of a song被神经影像国际权威期刊《NeuroImage》接受。该研究采用基于功能性…

第十四章 集合(List)

一、集合框架体系 集合&#xff1a; &#xff08;1&#xff09;可以动态保存任意多个对象。 &#xff08;2&#xff09;提供了一系列方便的操作对象的方法&#xff1a;add、remove、set、get等。 二、Collection 1. Collection 接口常用方法 &#xff08;1&#xff09;add&a…