开心网辅助程序开发手记(二):获取好友私家车位信息

  在上篇手记《开心网辅助程序开发手记》中,简单记录了如何登录开心网,获取“争车位”的相关数据:玩家(泊车者)信息、玩家车辆停车信息、玩家私家车位停车情况等。在这篇手记中,将简单描述如和获取玩家好友信息及玩家私家车位停车情况。话不多说,进入正文。

     一、获取玩家好友信息

      其实在上篇手记中,有提到v_frienddata变量,其实玩家好友信息就是以JSON格式保存在该变量里的,我们只需要写好对应的实体,再利用Json.NET做个转换就可以了。由于上篇没有详细介绍如何使用Json.NET对JSON进行转换,这里补充介绍一下。

      先来看一下变量中JSON的树状结构:

开心网辅助程序开发手记(二):获取好友私家车位信息_第1张图片

      其中,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");
= 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张图片

      2.  点击好友名字时,你会发现页面中部队flash数据已经转变为好友私家车位的数据。

      那么好友私家车位的数据是怎么来的呢,你可以使用HTTP抓包工具Http Analyzer来进行抓包分析一下,这里我用的是Firebug。下面介绍一下如何利用Firebug进行抓包。

      1. 为了排除历史数据对我们的分析造成影响,请你重新在Firefox中打开“争车位”页面;

      2. 点击好友名字(李敏杰)

      3. 在Firefox中按下F12调出Firebug

      4. 在console面板下,我们可以发现有一个POST

开心网辅助程序开发手记(二):获取好友私家车位信息_第3张图片

       5. 点开这个POST,我们可以清楚的看到这次请求想服务器发送到Post Data(puid: 11948259; verify: 12813044_1040_12813044_1228739520_e83ef7b74ff97a1c788d1454fc327724)和服务器的Response

      6. 单击Response,再单击Load Response,你能查看服务器的Response数据,呵,又是JSON,好友私家车位的停车情况就藏在里面了,只需要用Json.NET对其做一下转换就可以了。

 开心网辅助程序开发手记(二):获取好友私家车位信息_第4张图片

 

      现在,让我们会过头来看一下Post Data,其中puid就是好友的编号,我们可以从好友实体中获得;另一个verify是从哪来的呢?让我们分析一下。

      1. 单击Firebug中的Inspect,再单击一下好友名字(李敏杰),在Firebug中就自动在HTML中帮我们定位好了,如下图:

开心网辅助程序开发手记(二):获取好友私家车位信息_第5张图片

      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中

开心网辅助程序开发手记(二):获取好友私家车位信息_第6张图片 

      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中的帐号信息,然后再测试视图中测试)

你可能感兴趣的:(开心网辅助程序开发手记(二):获取好友私家车位信息)