在上篇手记《开心网辅助程序开发手记》中,简单记录了如何登录开心网,获取“争车位”的相关数据:玩家(泊车者)信息、玩家车辆停车信息、玩家私家车位停车情况等。在这篇手记中,将简单描述如和获取玩家好友信息及玩家私家车位停车情况。话不多说,进入正文。
一、获取玩家好友信息
其实在上篇手记中,有提到v_frienddata变量,其实玩家好友信息就是以JSON格式保存在该变量里的,我们只需要写好对应的实体,再利用Json.NET做个转换就可以了。由于上篇没有详细介绍如何使用Json.NET对JSON进行转换,这里补充介绍一下。
先来看一下变量中JSON的树状结构:
其中,uid为1、2的是系统给玩家添加的默认邻居。下面是实体类(关于EntityBase实体请参见上篇手记附带的源码):
Code
using System;
using System.Collections.Generic;
using System.Text;
namespace SNSHelper.Kaixin001.Entity
{
public class ParkerFriendInfo : EntityBase
{
public ParkerFriendInfo(object obj)
: base(obj)
{
}
public string UId
{
get
{
return jsobj["uid"].ToString();
}
}
public string RealName
{
get
{
return Utility.Unicode2Character(jsobj["real_name"].ToString());
}
}
public string Ta
{
get
{
return Utility.Unicode2Character(jsobj["ta"].ToString());
}
}
public string Full
{
get
{
return jsobj["full"].ToString();
}
}
public string SceneMoney
{
get
{
return jsobj["scenemoney"].ToString();
}
}
public string SceneName
{
get
{
return Utility.Unicode2Character(jsobj["scenename"].ToString());
}
}
public string Neighbor
{
get
{
return jsobj["neighbor"].ToString();
}
}
public string Online
{
get
{
return jsobj["online"].ToString();
}
}
}
}
下面是Json.NET对JSON的转换代码:
Code
string friendData = Utility.GetMidString(parkingHTML, "var v_frienddata = ", "\n"); // 获取v_frienddata变量
friendData = friendData.Trim().Replace("\\/", "/").Replace("\\u", "\\\\u");
o = Newtonsoft.Json.JavaScriptConvert.DeserializeObject(friendData);
Newtonsoft.Json.JavaScriptArray jsaFriend = o as Newtonsoft.Json.JavaScriptArray;
for (int i = 0; i < jsaFriend.Count; i++)
{
parkerFriendInfoList.Add(new SNSHelper.Kaixin001.Entity.ParkerFriendInfo(jsaFriend[i]));
}
由于v_frienddata中的JSON包含的是一个数组,固可以把object对象o转换成Newtonsoft.Json.JavaScriptArray。
二、获取玩家好友私家车位停车情况
在获取玩家好友私家车位停车情况时,让我们先打开《开心网》“争车位”页面,研究一下:在页面上应该怎样操作才能获取玩家好友私家车位停车情况。
1. 点击下图红色线条框内的好友名字(李敏杰)
2. 点击好友名字时,你会发现页面中部队flash数据已经转变为好友私家车位的数据。
那么好友私家车位的数据是怎么来的呢,你可以使用HTTP抓包工具Http Analyzer来进行抓包分析一下,这里我用的是Firebug。下面介绍一下如何利用Firebug进行抓包。
1. 为了排除历史数据对我们的分析造成影响,请你重新在Firefox中打开“争车位”页面;
2. 点击好友名字(李敏杰)
3. 在Firefox中按下F12调出Firebug
4. 在console面板下,我们可以发现有一个POST
5. 点开这个POST,我们可以清楚的看到这次请求想服务器发送到Post Data(puid: 11948259; verify: 12813044_1040_12813044_1228739520_e83ef7b74ff97a1c788d1454fc327724)和服务器的Response
6. 单击Response,再单击Load Response,你能查看服务器的Response数据,呵,又是JSON,好友私家车位的停车情况就藏在里面了,只需要用Json.NET对其做一下转换就可以了。
现在,让我们会过头来看一下Post Data,其中puid就是好友的编号,我们可以从好友实体中获得;另一个verify是从哪来的呢?让我们分析一下。
1. 单击Firebug中的Inspect,再单击一下好友名字(李敏杰),在Firebug中就自动在HTML中帮我们定位好了,如下图:
2. 很直接的看到:在我们单击好友名字时,系统调用了一个gotouser方法
3. 借助Firebug,我们轻易的就在Parking-7.js中找到了gotouser方法
Code
function gotouser(v_uid)
{
if (parseInt(v_uid) == parseInt(v_userdata["user"]["vuid"]))
{
gotoMyself();
return;
}
g_direction2 = g_direction;
var url = "/parking/user.php"; // 请求服务器的地址
var pars = "verify=" + g_verify + "&puid=" + v_uid; // Post Data
var myAjax = new Ajax.Request(url, {method: "post", parameters: pars, onComplete: function (req) { gotouserAjaxShow(req); } });
}
4. 在这段JS中,不难发现verify是从变量g_verify中来的,那么g_verify又是从哪来的呢?我猜是在app.php?aid=1040中
5. 从上图可以看到g_verify变量的值和上文提到的Post Data中的Verify中的数据是一样的,那就说明我们找得没错了。
6. 下面就是在程序中模拟这个Post请求了
Code
/// <summary>
/// 获取好友私家车位停车情况
/// </summary>
/// <param name="friendUId">好友编号</param>
/// <returns></returns>
public List<ParkingInfo> GetFirendParkingInfo(string friendUId)
{
string url = "http://www.kaixin001.com/parking/user.php";
string postParams = string.Format("puid={0}&verify={1}&_=", friendUId, verify);
string friendParkingJSON = new HttpHelper().GetHtml(url, postParams, true, Utility.Cookies);
if (string.IsNullOrEmpty(friendParkingJSON))
{
return null;
}
friendParkingJSON = friendParkingJSON.Replace("\\/", "/").Replace("\\u", "\\\\u");
List<ParkingInfo> friendParkingInfoList = new List<ParkingInfo>();
object o = Newtonsoft.Json.JavaScriptConvert.DeserializeObject(friendParkingJSON);
Newtonsoft.Json.JavaScriptObject jo = o as Newtonsoft.Json.JavaScriptObject;
Newtonsoft.Json.JavaScriptArray jsa = jo["parking"] as Newtonsoft.Json.JavaScriptArray;
for (int i = 0; i < jsa.Count; i++)
{
friendParkingInfoList.Add(new SNSHelper.Kaixin001.Entity.ParkingInfo(jsa[i]));
}
return friendParkingInfoList;
}
个人觉得:到此为止,制作《开心网-争车位助手》的分析和基本数据获取已经准备得差不多了,接下去就是实现真正的模拟争车位了,很是期待,但也一定得等有空时才能继续了。
点击下载实例源码 (由于目前源码中没有任何界面,若有兴趣的朋友想测试的话请修改SNSHelper_UnitTest/App.config中的帐号信息,然后再测试视图中测试)