程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#開發QQ農場外掛實踐

C#開發QQ農場外掛實踐

編輯:C#入門知識

閒來無聊,國慶期間看別人在玩農場,我也開通了一下,發現錢不夠,偷起來很麻煩,所以想寫一個自動偷菜的程序,因此有了這篇文章:

QQ農場是基於http協議的,因此只要通過工具軟件截取http數據包,從而進一步進行分析提交和接收到的數據含義,然後再模擬一個flash client和服務器打交道即可。

為了實現以上目標,下載安裝截獲tcp/ip數據包的工具軟件ethereal,安裝好以後,登陸QQ進入農場,然後開啟ethereal軟件開始截獲數據包,然後在農場裡點刷新好友列表按鈕,然後去ethereal裡看看截獲到的數據包,發現讀取好友列表的url地址是:

http://happyfarm.qzone.qq.com/api.php?mod=friend

需要的參數有:login_time 、skey、uin 三個

知道這個地址以後,可以用apache httpclient模擬一個flash client,具體代碼如下:

String login_time = ConfigProperties.getProperty("login_time");
   String skey = ConfigProperties.getProperty("skey");
   String _s_ = ConfigProperties.getProperty("_s_");
   String uin = ConfigProperties.getProperty("uin");
   HttpClient hc = new HttpClient();
   // 創建GET方法的實例
   GetMethod getMethod = new GetMethod(url);
   //
   getMethod.addRequestHeader("Accept", "*/*");
   getMethod
     .addRequestHeader(
       "User-Agent",
       "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727; 360SE)");
   getMethod.addRequestHeader("Accept-Encoding", "gzip, deflate");
   getMethod.addRequestHeader("Accept-Language", "zh-CN");
   getMethod.addRequestHeader("Connection", "Keep-Alive");
   getMethod.addRequestHeader("Pragma", "no-cache");
   hc.getState().clearCookies();
   //
   String cookies = "1" + "; _s_=" + _s_ + "; uin=" + uin + "; skey="
     + skey + "; login_time=" + login_time;
   hc.getState().addCookie(
     new Cookie("happyfarm.qzone.qq.com", "jump", cookies, "/",
       new Date(2011, 12, 8), false));

   // 執行getMethod
   int statusCode = hc.executeMethod(getMethod);
   //
   String result = getMethod.getResponseBodyAsString();

按照這種方法,可以找到獲取某個好友農場信息的url地址是:

http://nc.qzone.qq.com/cgi-bin/cgi_farm_index?mod=user&act=run&ownerId=

偷某個好友某塊或多塊地的url地址是:

http://nc.qzone.qq.com/cgi-bin/cgi_farm_steal?mod=farmlandstatus&act=scrounge

ok,這些都搞定了,另外偷菜的 url地址需要提交一個參數farmKey,這個生成方法有點難度,具體方法為:

int curTime = (int) (System.currentTimeMillis() / 1000L);

String s = "sdoit78sdopig7w34057";
int yushu = curTime % 10;
s = s.substring(yushu, 20);
String farmKey = com.sourceware.util.StringUtil
       .getMD5(curTime + s);
 

另外需要分析一下服務器返回的數據包格式,目前看到的都是 json格式,

比如得到好友列表的數據為:

[{"userId":1905432,"userName":"u6c38u8fdcu7684u9ed1","headPic":"http://qlogo2.store.qq.com/qzonelogo/1265877/1/1242884728","yellowlevel":0,"yellowstatus":0,"exp":7776,"money":38961,"pf":0},{"userId":159805,"userName":"u8f7bu63cfu6de1u5199","headPic":"http://imgcache.qq.com/qzone_v4/client/userinfo_icon/5001.gif","yellowlevel":0,"yellowstatus":0,"exp":20332,"money":22665,"pf":0},{"userId":65178,"userName":"Air-F","headPic 後面省略...

如果是用java開發的話可以用json-lib包來解析。

另外根據返回的錯誤提示語整理如下:

如果返回{"code":0,"direction":"這塊地沒東西可摘的!","farmlandIndex":2,"fkey":"8297832f9f305bd1ad2d083c35148d815069b5c61da3382c0119b74f65b8e42e6d597313b9101acb","poptype":1}
應該是這塊地已經成熟,且被人摘光了(成熟的地都有一個產量,剩余數,最小的剩余數《通過這個可以得到最多可以被偷幾個》)。

如果返回的是{"code":0,"direction":"獲取農田信息失敗","fkey":"e3c2806e13df1092281157971b0f9466dcfbe7433a368f4d2398b0721398add7afc8c76f889555d5","poptype":0}
那麼應該是這塊地還沒成熟就去偷了;或者已經被主人收割了;或者這塊地什麼都沒種;

如果返回的是:{"code":0,"direction":"做人不能貪得無厭!","farmlandIndex":1,"fkey":"2848bb16cb28e1929822cb716b0e87292864ea9068ebe95b5d6d51580fb4b13718e3c2787af58294","poptype":1},{"code":0,"direction":"做人不能貪得無厭!","farmlandIndex":2,"poptype":1}
 那說明你已經偷過了還要去偷;

大致功能有:

1。我的資料,查看我的等級,經驗,金錢等信息

2。我的農場:可以查看我的農場信息,種了哪些作物,什麼時候成熟

3。我的倉庫,可以浏覽倉庫裡的物品,並可以賣掉

4。我的背包:可以浏覽背包裡的東西,並可以自動播鏟(沒用的種子種了馬上鏟掉又種獲取經驗)

5。我的裝飾:查看我購買的所有裝飾

6。商店:可以購買全部值得購買的裝飾用品(沒2點經驗需要120塊以內的裝飾)

7。日志:偷竊日志,刷新日志,被狗咬日志等等

8。設置:可以按自己需要設置一些自動除草之類的東西

9。手機控制:可以利用手機短信警報你出入驗證碼,然後手機通過wap網站浏覽驗證碼圖片,輸入驗證碼。(這樣即使人不在電腦前,也可以用手機輸入驗證碼了)
 

\
C#代碼如下: //得到所有好友列表的c#代碼:
public static int getFriendList()
        {
            string url = "http://happyfarm.qzone.qq.com/api.php?mod=friend";             Program.allFriend.Clear();
            Program.mainFrm.myFriendList.Items.Clear();
            try
            {
                int curTime = com.sourceware.util.DateUtil.getCurTime();//得到當前時間;                   String s = "sdoit78sdopig7w34057";
                int yushu = curTime % 10;
                s = s.Substring(yushu, 20 - yushu);
     &n

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved