浅谈以C#模拟登录新浪腾讯微博

时间:2022-08-12 03:23:45

浅谈以C#模拟登录新浪腾讯微博

摘 要:当国务院32个单位已开政务博客之时,当微博走入教育之门的时候,当从网络营销、微博营销、微信营销走到移动营销的大

>> 微博谣言研究――以新浪微博为例 以新浪微博为媒介的营销方式研究 新浪微博与腾讯微博竞争之思考 同步腾讯微博及新浪微博 腾讯与新浪:微信与微博价值之争 玩博以乐为天新浪微博APP有趣应用(一) 新浪与腾讯微博的“性别”差异 让腾讯微博自动关联新浪博客 180digial以小博大,打造YOUSOKU新浪微博营销奇迹 玩博以乐为天!新浪微博APP有趣应用连连报(四) 玩博以乐为天 新浪微博APP有趣应用连连报(五) 新浪微博控 新浪微博 新浪微博急了 新浪官方微博 新浪微博:痒 新浪微博推广 新浪微博:前无金矿后有腾讯 路在何方 微小说的后现代性分析――以新浪微博微小说为例 腾讯微博 常见问题解答 当前所在位置:l,其中对MSScriptControl的使用及重新对AxScriptControl进行封装为ScriptEngine类都进行了详细的说明,后续的新浪微博模拟登录中的账户和密码加密也是调用相应的ScriptEngine类的方法。其封装ScriptEngine类如下:

using System;

using MSScriptControl;

using System.Text;

namespace WinFormsAppWeibo

{

public enum ScriptLanguage

{

JScript,VBscript,JavaScript

}

public delegate void RunErrorHandler();

public delegate void RunTimeoutHandler();

public class ScriptEngine

{

private ScriptControl msc;

public event RunErrorHandler RunError;

public event RunTimeoutHandler RunTimeout;

public ScriptEngine()

: this(ScriptLanguage.VBscript)

{ }

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);

}

public object Eval(string expression, string codeBody)

{

msc.AddCode(codeBody);

return msc.Eval(expression);

}

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

{

if (this.Language != language) this.Language = language;

return Eval(expression, codeBody);

}

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

{

this.msc.AddCode(codeBody);

return msc.Run(mainFunctionName, parameters);

}

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

{

if (this.Language != language)

this.Language = language;

return Run(mainFunctionName, parameters, codeBody);

}

public void Reset(){this.msc.Reset();}

public ScriptLanguage Language

{

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

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

}

public int Timeout {get { return 0; }}

public bool AllowUI

{

get { return this.msc.AllowUI; }

set { this.msc.AllowUI = value; }

}

public bool UseSafeSubset

{

get { return this.msc.UseSafeSubset; }

set { this.msc.UseSafeSubset = true; }

}

private void OnError(){if (RunError != null) RunError();}

private void OnTimeout(){if (RunTimeout != null) RunTimeout();}

private void ScriptEngine_Error(){OnError();}

private void ScriptEngine_Timeout(){OnTimeout();}

}

}

2 新浪微博模拟登录过程

之所以选择以新浪微博为例做模拟登录示意,是因为新浪微博登录过程环节较多及加密环节更细。

新浪微博的模拟登录验证过程主要分为以下5步操作:

(1)首先请求微博主页获取js文件以确定client版本及加密算法;

(2)接着带上加密后的账户请求prelogin.php页面获取servertime、nonce、pubkey、rsakv、pcid、showpin等信息,以便对密码加密使用;

(3)再请求http://.cn/sso/login.php?client=ssologin.js(v1.4.11)

(4)获取“新浪通行证”保存Cookie;

(5)带上Cookie,请求新浪通行证中location.replace后面的http,获取用户主页相关信息,为后续访问做准备

详细的模拟登录过程见图1所示:

3 实现模拟登录过程中的重要环节

首先模拟登录新浪微博主页http:///,利用FireBug就能看到,如图2所示:

复制其中一个index.js相应正文,利用JavaScript格式化工具③,将格式化结果保存为文件sina.js,其中该js文件保存了整个登录过程、ssologin.js版本、加密算法等信息。在5421行即显示的是后面client这个参数的值“ssologin.js(v1.4.11)”,如图3所示。

在微博登录框中输入账户,一旦鼠标离开文本框就是自动发送一个HTTP请求,URL为:

http://.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=dGVzdA%3D%3D&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.11)&_=1382411317984

如图4所示:

请求参数如图5所示:

其中su为账户“test”是用 sinaSSOEncoder.base64.encode 加密后的字符串,如图6:

请求返回结果为JSON数据格式:

sinaSSOController.preloginCallBack({"retcode":0,"servertime":1382411319,"pcid":"gz-4013138055558ead653a280f14c60f0b4fa2","nonce":"T1WU6E","pubkey":"EB2A38568661887FA180BDDB5CABD5F21C7BFD59C090CB2D245A87AC253062882729293E5506350508E7F9AA3BB77F4333231490F915F6D63C55FE2F08A49B353F444AD3993CACC02DB784ABBB8E42A9B1BBFFFB38BE18D78E87A0E41B9B8F73A928EE0CCEE1F6739884B9777E4FE9E88A1BBE495927AC4A799B3181D6442443","rsakv":"1330428213","showpin":0,"exectime":6})

请求的响应各参数的描述如下表所示:

retcode 0表示成功

pcid 验证码请求时传入的参数

servertime login.php登录需回传,及配合账户密码加密

nonce login.php登录需回传,及配合账户密码加密

pubkey 加密算法的公钥

rsakv 代表rsa加密算法

showpin 0表示不需要验证码

showpin为1则登录需要验证码,这时就需要把pcid传入到验证码请求的参数中,请求验证码的URL为:

http://.cn/cgi/pin.php?r=98129622&s=0&p= gz-4013138055558ead653a280f14c60f0b4fa2

r为8位随机数,p即为上面的pcid值

首先输入错误的账户和密码后,点击登录,以便确认提交HTTP请求的URL;只有这样才能在FireBug下看到请求的位置,其原因是成功登录后,有一个302网页重定向,登录请求瞬间就跳过了。还有一个办法就是直接使用Fiddler进行抓包。下面的演示是在点击“登录”时才开始使用Fiddler进行抓包:请求的URL:

http://.cn/sso/login.php?client=ssologin.js(v1.4.11)

详细的POST参数见图中Body部分,如图7所示:

5 总结

对于像腾讯微博、QQ空间以及webqq等的模拟登录,首先利用Fiddler对网页登录过程进行一次完整抓包,其中一个请求是对h_login_11.js的,里面就包括对帐号及密码的加密算法,相应的js加密函数如下:

// 对帐号加密

function uin2hex(str) {

var maxLength = 16;

str = parseInt(str);

var hex = str.toString(16);

var len = hex.length;

for (var i = len; i < maxLength; i++) {

hex = "0" + hex

}

var arr = [];

for (var j = 0; j < maxLength; j += 2) {

arr.push("\\x" + hex.substr(j, 2))

}

var result = arr.join("");

eval('result="' + result + '"');

return result

}

// 对密码的加密

function getEncryption(password, uin, vcode) {

var str1 = hexchar2bin(md5(password));

var str2 = md5(str1 + uin);

var str3 = md5(str2 + vcode.toUpperCase());

return str3

}

在各种模拟登录中,对帐号和密码的加密是主要重点解决的问题,不过,在实际操作过程中,保存各个HTTP请求结果中的Cookie以及在HTTP请求头中设置好Referer、UserAgent和Cookie也是一些必要注意的细节。在每一次开始模拟登录操作前,首先用抓包工具,对网页登录过程进行完整的了解,再实现模拟登录的过程就不是一件难事了。

参考文献:

[1]Baidu.重定向.百度百科,2013-06-10.

[2]秋枫.在C#中调用JavaScript等脚本的实现.2004-04-29.

作者简介:鲜海(1974.12-),男,四川南部县人,开发主办职务,工程系列中级,硕士研究生,研究方向:现主要从事继续、网络教育信息管理平台的开发和研究,关注于微博、微信的拓展应用开发。

作者单位:西南财经大学继续(网络)教育学院,成都 610074

注:

①重定向又称之为302即暂时性转移Temporarily Moved,英文名称302 redirect,也被认为是暂时重定向temporary redirect

②其作者:秋枫 时间:2004-4-29 9:49:05 文章来源:CSDN

③JavaScript在线格式化:http:///Tools/JsFormat.aspx

上一篇:基于LwIP通信的电液伺服控制系统 下一篇:Mocha BSM分布式监控系统在机房建设中的应用