现在玩QQ农场的朋友越来越多, 虽然整天在电脑旁工作,便由于工作忙,经常忘
记了收菜.等想起时,菜都 被别人偷光了。农民辛苦好几年,一偷回到解放前! 但
只要使用QQ农场收菜助手,就可以在菜成熟的关键 时刻提醒你,工作收菜两不误。
PS:收菜提醒的图标很可爱哦~~~
本程序永久免费.
使用流程:
选择完作物,再选择播种、第一季……
根据该作物的成熟时间及再次成熟时间来设定你需要提醒的时间,点击“定时提醒”,
例如:
白萝卜
1季作物
成熟时间:10小时
再次成熟:0小时
阶段选择中选择 播种,同时选择时间2009-12-21 11:25:20
那么在第一次成熟时:2009-12-21 21:25:20,提醒。
前些天有把以前的那本《C#网络编程》翻了下,就想着拿点东西练练手,因此就有了这个小程序。
使用的工具:
1、Microsoft Network Monitor 3.2 监视数据收发
2、Chrome 浏览器(其中的javascript console很好用)
3、vs 2008 (主要用的C#的HttpWebRequest、HttpWebResponse、正则表达式和线程对象)
一、qq登录。
有人说做外挂的话,能正确登录就成功了一半。当然对于web程序登陆要简单些。主要是所有东西都是可见的--直接看页面源代码就一目了然了
就不罗索了。 登陆采取的验证方式是这样:
pwd = md5(md5_3(pwd)+verifycode).
当然在页面中,md5算法是使用js写的,故名思意,md5_3就是做3次md5加密。上面verifycode是页面的验证码,只所以把验证码放在一起加密,
就是使得即使你通过某种手段(如网络监视工具)获得加了密的密码也不能登陆。
登陆地址:http://ptlogin2.qq.com/login
参数列表:u={0}&p={1}&verifycode={2}&aid=15000101&u1={3}&fp=loginerroralert&h=1&ptredirect=1&ptlang=0&from_ui=1
u:qq号码
p:密码(加密之后的)
verifycode: 验证码
aid:未知
u1:未知(使用"http%3A%2F%2Fimgcache.qq.com%2Fqzone%2Fv5%2Floginsucc.html%3Fpara%3Dizon:" 就可以了)
验证码获取地址:http://ptlogin2.qq.com/getimage?aid=15000101&0.6631487589329481
二、获取有业务的(可偷、可除虫、可除草等)好友信息
地址:http://happyfarm.qzone.qq.com/api.php?mod=friend&act=getListStatus&user=false
返回的消息是jason格式的如:{"AAAAAA":{"1":1259066531},"BBBBB":{"1":1259067211}}
其中AAAAAA和BBBBB表示好友id(不同于QQ号码),后面括号里面依次表示业务类型(成熟,有虫,有草等)和一个时间戳。一般来说只要前面的id就够了
三、获取自己农场信息
地址:http://nc.qzone.qq.com/cgi-bin/cgi_farm_index
参数列表:mod=user&act=run&farmKey=85f004b176ec8fdb332a27422b145a02&farmTime=1258167411
返回的消息是格式如:
{"a":1,"c":0,"exp":19188,"farmlandStatus":
[{"a":40,"b":1,"c":0,"d":0,"e":1,"f":0,"g":0,"h":1,"i":100,"j":0,"k":0,"l":0,"m":0,"n":[],"o":0,"p":[],"q":1258630576,"r":1258630576},
{"a":102,"b":4,"c":0,"d":0,"e":1,"f":0,"g":0,"h":1,"i":100,"j":2,"k":0,"l":0,"m":0,"n":[],"o":0,"p":[],"q":1258452159,"r":1258588959},
{"a":40,"b":1,"c":0,"d":0,"e":1,"f":0,"g":0,"h":1,"i":100,"j":0,"k":0,"l":0,"m":0,"n":[],"o":0,"p":[],"q":1258630578,"r":1258630578},
{"a":40,"b":1,"c":0,"d":0,"e":1,"f":0,"g":0,"h":1,"i":100,"j":0,"k":0,"l":0,"m":0,"n":[],"o":0,"p":[],"q":1258630577,"r":1258630577}
],
"items":{"1":{"itemId":233},"2":{"itemId":234},"3":{"itemId":235},"4":{"itemId":236},"9":{"itemId":90006}},
"user":{"healthMode":{"serverTime":1258651026,"set":1,"valid":1},"pf":1,"uId":XXXXXXX,"userName":"","yellowlevel":0,"yellowstatus":0},"weather":{"weatherDesc":"晴天","weatherId":1}}}
字段很多挑重要的(自己知道的)说:
exp:经验值,是flash上看到经验与等级的一个合成体,具体怎么合成的还没研究。
farmlandStatus:表示所有地块的信息。
a:作物id
b: 状态 ///
/// 0:空
/// 1:
/// 2:
/// 3:
/// 4:
/// 5:
/// 6:成熟
/// 7:枯萎
///
f:杂草数量
k:成熟数量
m:剩余数量
j:第几季
l:最少剩余数量(到这个数量就不能再偷了)
g:虫数量
p:偷菜历史(你偷了之后就不要再偷了)
q:播种时间
r:主人上次收获时间
serverTime:当前的服务器时间
pf:是否设置保护模式(0:00-6:00不能偷菜)
uid:你的农场id(以后操作都要用到它)
四、获取好友农场信息
地址:http://nc.qzone.qq.com/cgi-bin/cgi_farm_index?/cgi-bin/cgi_farm_index?mod=user&act=run&ownerId={0}
返回的消息格式和上面基本一致。
五、收自己家的菜:
地址 : http://happyfarm.qzone.qq.com/api.php?mod=farmlandstatus&act=harvest
参数列表: place={0}&ownerId={1}&farmTime={2}&farmKey={3}
place:地块号(0 based)
ownerId:自己的id
farmTime和farmKey比较麻烦,网上有介绍,算法如下:
public static string GetFarmTime()
{
return Math.Floor((DateTime.Now - new DateTime(1970, 1, 1, 8, 0, 0)).TotalSeconds).ToString();
}
public static string GetFarmKey(string farmTime)
{
return GetMd5Hash2(farmTime + "sdoit78sdopig7w34057".Substring(Convert.ToInt32(farmTime) % 10));
}
当然GetFarmTime() 应该是有问题,不过如果你电脑的时间和标准时间相同的话就没问题了,更可靠的做法是:
public static string GetFarmTime()
{
return Math.Floor((DateTime.Now - time1).TotalSeconds + servertime).ToString();
}
其中servertime为(三)中获得的服务器时间,time1是获取(三)时候的本地时间。
不过上述方法没有验证过。
六、除草
地址 :http://happyfarm.qzone.qq.com/api.php?mod=farmlandstatus&act=clearWeed
参数列表:farmKey={0}&tName=%E6%B2%90%E6%B2%90&fName=%E8%A7%89%E8%A1%BF%E7%BB%81%E8%80%8C%E7%A5%9A%E7%BB%AF&place={1}&ownerId={2}&farmTime={3}
七、除虫
地址 :http://happyfarm.qzone.qq.com/api.php?mod=farmlandstatus&act=spraying
参数列表:place={0}&tName=%E5%AE%B6%E6%9C%89%E5%B0%8F%E7%8C%AA&farmTime={1}&tId=0&ownerId={2}&uIdx={3}&fName=%2D&farmKey={4}
uidx::自己的id
ownerId:好友Id
八、挖地
地址 :http://happyfarm.qzone.qq.com/api.php?mod=farmlandstatus&act=scarify
参数列表:farmKey={0}&cropStatus={1}&farmTime={2}&ownerId={3}&place={4}
cropStatus:土地状态,一般使用7(枯萎)
九、种菜
地址 :http://happyfarm.qzone.qq.com/api.php?mod=farmlandstatus&act=planting
参数列表:farmKey={0}&cId={1}&place={2}&ownerId={3}&farmTime={4}
cid:种子id
十、获取好友列表
地址 :http://happyfarm.qzone.qq.com/api.php?mod=friend";
参数列表:farmKey={0}&user=true&farmTime={1}&refresh=true
返回数据中包括:农场id,头像、名称等信息
在偷菜的时候可以采取两种方式来操作:
1、定时扫描。
(1)每隔固定时间执行(二)获取有业务的好友,
(2)然后执行(四)获取各地块的信息,最后根据不同的地块信息(可偷、有虫)来执行不同的操作。
2、即时偷菜。
(1)执行(十)一次性获取好友列表。
(2)然后执行(四)获取各地块的信息并记录该好友最早成熟时间并保存在Dictionary里
(3)根据当前时间获取偷菜线程的等待时间为:(System.DateTime.Now - Min(Dictionary)).TotalSeconds
(若小与等于0 则立即执行)
(4)遍历地块,执行相关操作
(5)重新设置当前好友的等待时间
(6)执行(3)。
当然后一种的方法必须拥有不同物种成熟所需要的时间,
下载,而且不能预测什么时候有草,有虫。所以两种方法结合起来使用就很好了。