开篇:润墨网以专业的文秘视角,为您筛选了一篇浅谈以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