一、登录的状态信息维护
这个是开门钥匙,如果登录信息的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; }
}