研究“QQ开心农场”一点心得
2009-08-19 17:27
330 查看
一、登录的状态信息维护
这个是开门钥匙,如果登录信息的COOKIE保存不了,后面操作没办法谈起了。在网上找了下,有比较多的解决办法。
最傻瓜的解决办法就是用火狐登录,然后通过插件得到QQ农场所有的COOKIE信息,在自己的程序里使用CookieContainer 类将这些COOKIE逐个填充,后续抓取页面的操作都使用这个COOKIE容器即可。
网上看到最多的一种办法就是用webbrowser控件登录,然后通过docuement.cookie属性得到COOKIE,然后做解析,再将解析的COOKIE写入CookieContainer ,这样有一个弊病,就是没办法设置COOKIE的域,估计有些情况下这种办法登录有问题。
博客园上看到一种办法,就是使用WebRequest对象,自己构造CookieContainer ,然后找到QQ登录的入口,向对应的登录页面提交。这样解决方式比较好,可以得到完整的CookieContainer ,但相对复杂点,因为QQ登录的时候密码做过加密,首先要找到加密的方法(博客园上的那位兄弟很聪明,使用webbrowser来调用加密的JS方法),然后要找到提交的页面(这个得通过分析HTML源码得到)。
最后我想到一个办法,也是傻瓜式的,同样使用webbrowser控件,加载QQ的登录页面,通过QQ自己的登录页实现登录,省去一系列的登录麻烦,登录完成后,webbrowser控件来加载需要获得的抓取指定页面的信息,这样也不用WebRequest对象来获取页面的数据了,一举两得。
二、页面数据的获得
这个是核心,用于获取好友的信息,农场的种子,地,作物等页面信息,关键是找到页面的地址和发送的数据格式。
网上看到很多分析HTTP抓包的数据都是用IE的插件完成的,可以查看到IE向WEB服务器提交的表单信息。我网上找了下有几种,下载了还没来得及试用。
我是通过分析开心农场的SWF反编译代码得到的,比较详细。
接下来是数据的转换,开心农场使用JSON来交换数据,在。NET中有专门的序列化和反序列化的类它们是:JsonQueryStringConverter 类和 DataContractJsonSerializer 类
JsonQueryStringConverter 有两个方法 ConvertStringToValue,ConvertValueToString 分别将JSON字符串转化为对象和将对象转化为JSON字符串,这里有一个注意的地方(红色标注) 这样将qq对象序列化之后的JSON字符串 {"userId":xx;userName:xx ...} ,否则 。NET会序列化成{"<userId>k__BackingField":xx,"<userName>k__BackingField":... 这样并不是想要的预期结果
[DataContract]
class qq
{
[DataMember]
public string userId { set; get; }
[DataMember]
public string userName { set; get; }
[DataMember]
public string headPic { set; get; }
[DataMember]
public int yellowlevel { set; get; }
[DataMember]
public int yellowstatus { set; get; }
[DataMember]
public int exp { set; get; }
[DataMember]
public int money { set; get; }
[DataMember]
public int pf { set; get; }
}
这个是开门钥匙,如果登录信息的COOKIE保存不了,后面操作没办法谈起了。在网上找了下,有比较多的解决办法。
最傻瓜的解决办法就是用火狐登录,然后通过插件得到QQ农场所有的COOKIE信息,在自己的程序里使用CookieContainer 类将这些COOKIE逐个填充,后续抓取页面的操作都使用这个COOKIE容器即可。
网上看到最多的一种办法就是用webbrowser控件登录,然后通过docuement.cookie属性得到COOKIE,然后做解析,再将解析的COOKIE写入CookieContainer ,这样有一个弊病,就是没办法设置COOKIE的域,估计有些情况下这种办法登录有问题。
博客园上看到一种办法,就是使用WebRequest对象,自己构造CookieContainer ,然后找到QQ登录的入口,向对应的登录页面提交。这样解决方式比较好,可以得到完整的CookieContainer ,但相对复杂点,因为QQ登录的时候密码做过加密,首先要找到加密的方法(博客园上的那位兄弟很聪明,使用webbrowser来调用加密的JS方法),然后要找到提交的页面(这个得通过分析HTML源码得到)。
最后我想到一个办法,也是傻瓜式的,同样使用webbrowser控件,加载QQ的登录页面,通过QQ自己的登录页实现登录,省去一系列的登录麻烦,登录完成后,webbrowser控件来加载需要获得的抓取指定页面的信息,这样也不用WebRequest对象来获取页面的数据了,一举两得。
二、页面数据的获得
这个是核心,用于获取好友的信息,农场的种子,地,作物等页面信息,关键是找到页面的地址和发送的数据格式。
网上看到很多分析HTTP抓包的数据都是用IE的插件完成的,可以查看到IE向WEB服务器提交的表单信息。我网上找了下有几种,下载了还没来得及试用。
我是通过分析开心农场的SWF反编译代码得到的,比较详细。
接下来是数据的转换,开心农场使用JSON来交换数据,在。NET中有专门的序列化和反序列化的类它们是:JsonQueryStringConverter 类和 DataContractJsonSerializer 类
JsonQueryStringConverter 有两个方法 ConvertStringToValue,ConvertValueToString 分别将JSON字符串转化为对象和将对象转化为JSON字符串,这里有一个注意的地方(红色标注) 这样将qq对象序列化之后的JSON字符串 {"userId":xx;userName:xx ...} ,否则 。NET会序列化成{"<userId>k__BackingField":xx,"<userName>k__BackingField":... 这样并不是想要的预期结果
[DataContract]
class qq
{
[DataMember]
public string userId { set; get; }
[DataMember]
public string userName { set; get; }
[DataMember]
public string headPic { set; get; }
[DataMember]
public int yellowlevel { set; get; }
[DataMember]
public int yellowstatus { set; get; }
[DataMember]
public int exp { set; get; }
[DataMember]
public int money { set; get; }
[DataMember]
public int pf { set; get; }
}
相关文章推荐
- 一点研究心得
- qWikiOffice研究一点心得
- 交易网站的架构的一点研究心得
- 关于做Andr“.NET研究”oid+J2ee系统集成开发的一点心得
- Amf3+socket开发网络游戏或应用的一点研究心得
- artoolkit学习之ARSimpleNativeCarsProj的一点研究心得
- 转载:Amf3+socket开发网络游戏或应用的一点研究心得
- Amf3+socket开发网络游戏或应用的一点研究心得
- 对OpenHpi研究的一点心得随记
- 研究ListView里的FastScroller的一点心得
- unity3D OnTriggerEnter和OnCollisionEnter的一点个人心得(主要讲区别)
- 关于SQL优化的一点心得
- 关于JQueryMobile中Slider的一点研究
- FMDB使用的一点心得:数据库创建、制表、查询等以及image转换成二进制nsdata保存到数据库中
- SQL触发器的一点心得
- 技巧心得:给拥有Google AdSense 帐户 朋友的一点忠告
- 使用开发工具的一点小心得
- itextSharp研究心得
- (转载)做需求分析一点心得
- Unity5的AssetBundle的一点使用心得