人人网小小战争辅助工具分析
话说,闲的会蛋疼。过不是,最近无事,而又在玩
人人网的小小战争,觉得还不错,每天一
开机就是
上线,然后收食物,收
兵,生产食物,生产兵,完了就去占领好友消磨兵力,打劫好友,偷食物,打怪。。。觉得还是不错的,可天天这样重复的
步骤又让我觉得有点烦。。。
于是想开发个辅助工具,我只要运行一下,就可以自动帮我完成食物和兵力的生产及收取,以及访问所有好友,偷偷拿拿。
。。
使用firefox firebug
研究了一下小小战争调用后台的api
接口,并且记录下来,分析参数。
小小战争的api所有数据格式使用json,因此很容易分析。分析时,
发现很多操作需要传输requestSig这个值,而这个值不是
从服务器取的,猜想应该是客户端根据某一
算法和某一值算出来的,在提交请求时传递此参数,而服务器使用相同方法和相
同值进行验证,以判断是不是非法请求,那现在的关键就是如何求requestSig了,反编译swf发现有个文件一反编译就死循环
了、、、最后在网上发现某位大牛不知道如何反编译出来的其加密方法(原因早就有人深入研究了),最后算出requestSig
了。事实上,每次登陆小小战争,服务器会随机生产一个key和keyname给客户端,客户端根据keyname再从服务器下载一个有
加密方法的swf文件,然后根据key和下载这个swf的算法,算出requestSig,试了下,总共才10个keyname,于是便
枚举的列
出来了。。。
下面开始
编码了,登陆人人网,打开小小战争页面,挨个调用接口。。。完毕。。。
后面是代码。。仅供学习和研究。。。。
这个类生成requestSig
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
public class Util {
private static Map<String, Integer> map = new HashMap<String, Integer>();
private static int getIncByName(String keyName){
if(map.size() == 0){
map.put("97ba558178f22af9", 1);
map.put("8a57faa3ff0c2cd0", 2);
map.put("b05395426617a666", 3);
map.put("8054b38ece415448", 4);
map.put("5a0815d2500be4c3", 5);
map.put("cb47e040c444bb13", 6);
map.put("4f0b466d4e838204", 7);
map.put("9bb033dd03a03a21", 8);
map.put("a548d6aefbeb32e0", 9);
map.put("c156d1c03531d5f6", 10);
}
if(map.containsKey(keyName)){
int v = map.get(keyName);
return v;
}
throw new RuntimeException("无法找到keyName:"+keyName);
}
/**
* 取到sig
*/
public static String getSig(String key, String keyName){
int inc = getIncByName(keyName);
String _local2 = Md5(key);
System.out.println(_local2);
_local2 = Md5(_local2);
_local2 = _local2.substring(1, 7);
_local2 = Md5(_local2);
String p1 = _local2;
String a = p1.substring(0, 6);
int v = Integer.parseInt(a, 16);
v = v + inc;
System.out.println(v);
a = Md5(v+"");
return a;
}
public static String Md5(String str){
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update(str.getBytes("UTF-8"));
} catch (NoSuchAlgorithmException e) {
System.out.println("NoSuchAlgorithmException caught!");
System.exit(-1);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
byte[] byteArray = messageDigest.digest();
StringBuffer md5StrBuff = new StringBuffer();
for (int i = 0; i < byteArray.length; i++) {
if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
else
md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
}
return md5StrBuff.toString();
}
}
启动类
public class LWStart {
private static LittleWar client = null;
public static void main(String[] args) {
if(client == null){
client = new LittleWar(args[0], args[1]);
}
try {
do{
LittleWar.log("开始访问游戏");
client.start();
LittleWar.log("结束访问游戏,等待1小时候重新开始访问");
Thread.sleep(3600* 1000);//暂停1小时
}while(true);
} catch (Exception e) {
e.printStackTrace();
}
}
}
处理类。简单实现的
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import atg.taglib.json.util.JSONArray;
import atg.taglib.json.util.JSONObject;
public class LittleWar {
// The configuration items
//人人网账号
private String userName = "";
//人人网密码
private String password = "";
private static String redirectURL = "http://www.renren.com/home";
// Don't change the following URL
private static String renRenLoginURL = "http://www.renren.com/PLogin.do";
// The HttpClient is used in one session
private HttpResponse response;
private DefaultHttpClient httpclient = null;;
public LittleWar(String userName, String password){
this.userName = userName;
this.password = password;
}
public static void log(Object t){
System.out.println(new Date().toLocaleString()+t);
}
private boolean login() {
if(httpclient != null){
log("已经登陆人人网,无需再次登陆");
return true;
}
httpclient = new DefaultHttpClient();
HttpPost httpost = new HttpPost(renRenLoginURL);
// All the parameters post to the web site
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("origURL", redirectURL));
nvps.add(new BasicNameValuePair("domain", "renren.com"));
nvps.add(new BasicNameValuePair("autoLogin", "true"));
nvps.add(new BasicNameValuePair("formName", ""));
nvps.add(new BasicNameValuePair("method", ""));
nvps.add(new BasicNameValuePair("submit", "登录"));
nvps.add(new BasicNameValuePair("email", userName));
nvps.add(new BasicNameValuePair("password", password));
try {
httpost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
response = httpclient.execute(httpost);
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
httpost.abort();
}
String redirectLocation = getRedirectLocation();
if (redirectLocation != null) {
//System.out.println(getText(redirectLocation));
//跳到首页,现在登录完成
getText(redirectLocation);
}
return true;
}
private String getRedirectLocation() {
Header locationHeader = response.getFirstHeader("Location");
if (locationHeader == null) {
return null;
}
return locationHeader.getValue();
}
private String getText(String redirectLocation) {
HttpGet httpget = new HttpGet(redirectLocation);
// Create a response handler
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = "";
try {
responseBody = httpclient.execute(httpget, responseHandler);
} catch (Exception e) {
e.printStackTrace();
responseBody = null;
} finally {
httpget.abort();
//httpclient.getConnectionManager().shutdown();
}
return responseBody;
}
private String postText(String url, Map<String, String> values) {
HttpPost httppost = new HttpPost(url);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
for(Map.Entry<String, String> e:values.entrySet()){
nvps.add(new BasicNameValuePair(e.getKey(), e.getValue()));
}
// Create a response handler
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = "";
try {
httppost.setEntity(new UrlEncodedFormEntity(nvps, HTTP.UTF_8));
responseBody = httpclient.execute(httppost, responseHandler);
} catch (Exception e) {
e.printStackTrace();
responseBody = null;
} finally {
httppost.abort();
//httpclient.getConnectionManager().shutdown();
}
return responseBody;
}
//
private String inuId;
private String sig;
private String keyName;
private User u = null;
private int apiCount = 0;//接口调用次数
private JSONObject userRun;
private void checkApi(){
apiCount ++;
if(apiCount > 100){
//需要重新调用userRun,重新生成sig
log("sig过期,重新初始化");
try {
init();
} catch (Exception e) {
e.printStackTrace();
}
apiCount = 0;
}
}
private void init() throws Exception{
log("开始初始化游戏");
//获得后,开始初始化小小战争页面
String initUrl = "http://xnapi.lw.fminutes.com/api.php?inuId="+inuId+"&method=Scene.init";
Map<String, String> values = new HashMap<String, String>();
values.put("data", null);
String res1 = postText(initUrl, values);
log("初始化完成");
u = new User();
//先取得keyName
JSONObject jsonInit = new JSONObject(res1);
log("玩家信息:"+res1);
//获取玩家信息
JSONObject jsonu = jsonInit.getJSONObject("info").getJSONObject("player_info");
u.updateNoTime(jsonu);
u.setSystemTime(jsonInit.getJSONObject("info").getLong("time"));
//这个2个很重要,后面通讯的基础
keyName = jsonInit.getJSONObject("info").getJSONObject("getKey").getString("keyName");
String key = jsonInit.getJSONObject("info").getJSONObject("getKey").getString("key");
sig = Util.getSig(key, keyName);
String runUrl = "http://xnapi.lw.fminutes.com/api.php?inuId="+inuId+"&method=Scene.run";
values = new HashMap<String, String>();
values.put("keyName", keyName);
values.put("requestSig", sig);
values.put("data","{fid:\""+u.getId()+"\"}");
res1 = postText(runUrl, values);
userRun = new JSONObject(res1);
}
/**
* 开始执行
*/
public void start() throws Exception{
if (login()) {
//打开小小战争。
String lturl = "http://apps.renren.com/littlewar?origin=103";
String ltPage = getText(lturl);
Pattern p = Pattern.compile("\\\"iframe_canvas\\\"\\ssrc=\\\"([^\\\"]+)\\\"");
Matcher m = p.matcher(ltPage);
String ltifurl = "";
if(m.find()){
ltifurl = m.group(1);
ltifurl = ltifurl.replace("&", "&");
log(ltifurl);
}
String ltifpage = getText(ltifurl);
//获取inuId
p = Pattern.compile("inuId=([\\w_]+)\\&");
m = p.matcher(ltifpage);
if(m.find()){
inuId = m.group(1);
log("inuId="+inuId);
}
//获得后,开始初始化小小战争页面
init();
//下面干嘛呢?查询的请求不需要requestSig=,但是操作类的都需要
//进入游戏后,先收取和生产。
//先看看有没有奴隶主,有就先反抗,如果兵不够则看看自己的兵是否可以收取,如果再不够则调整奴隶兵(如果有的话)。实在不够,则不反抗
//功能:自动生产食物,自动生产兵,自动收取食物,兵,打怪。反抗。
//好友:挨个访问,然后偷食物、dajie、解救(一定攻击范围内)、打怪,(记住好友食物成熟时间,准点去。后期功能)
//定时还是周期操作,定时最好记住多久后收获、生产。
//1.获取建筑物列表,看看有没有要生产的食物,有则生产product.1
//--先调整驻兵,将所有奴隶的兵调过来,那边只留下一个兵。
//--如果被占领了,并且自己的攻击力够反抗则反抗
//生产收获食物和兵力
this.gainAndProduceFood(userRun, 2);
this.gainAndProduceForce(userRun, 2);
//打怪
this.attackBeast(userRun, u.getId());
//看看有没有奴隶主,有就反抗。这个要计算兵力,比较麻烦,先不做
//挨个访问好友,然后偷窃和打怪物。攻打怪物需要调整驻兵
String friendUrl = "http://xnapi.lw.fminutes.com/api.php?inuId="+inuId+"&method=Friend.run";
Map<String, String> values = new HashMap<String, String>();
values.put("keyName", keyName);
values.put("requestSig", "");
values.put("data","{friendlistVer:\""+u.getSystemTime()+"\"}");
String res1 = postText(friendUrl, values);
JSONObject friendsJson = new JSONObject(res1);
JSONObject friendsGameDataJson = friendsJson.getJSONObject("info").getJSONObject("gameData").getJSONObject("data");
log("好友列表:"+friendsGameDataJson);
List<String> friendIds = new ArrayList<String>();
Iterator<String> it = friendsGameDataJson.keys();
while(it.hasNext()){
friendIds.add(it.next());
}
//将friendIds随机排列。。原数组id逐渐变大,会有问题的
Random r = new Random();
for(int i=0;i< friendIds.size(); i++){
int ri = r.nextInt(friendIds.size());
String t = friendIds.get(ri);
friendIds.set(ri, friendIds.get(i));
friendIds.set(i, t);
}
for(String fid: friendIds){
if(fid.equals(u.getId()))continue;
//暂停1秒-4秒
Thread.sleep(1000+r.nextInt(3000));
try {
this.visitFriend(fid);
} catch (Exception e) {
e.printStackTrace();
log("出错了!"+e.getMessage());
init();
}
}
}
}
/**
* //访问好友
* 首先是偷取食物,打怪,然后是趁火打jie
* 如果自己兵力够则顺便救一下
*/
public void visitFriend(String fId) throws Exception{
if("1".equals(fId)) return;
log("开始访问好友:"+fId);
//1.获取好友信息
String runUrl = "http://xnapi.lw.fminutes.com/api.php?inuId="+inuId+"&method=Scene.run";
Map<String, String> values = new HashMap<String, String>();
values.put("keyName", keyName);
values.put("requestSig", sig);
values.put("data","{\"fid\":\""+fId+"\"}");
String res = postText(runUrl, values);
JSONObject jsonRun = new JSONObject(res);
try {
u.setLoot_times(jsonRun.getJSONObject("info").getJSONObject("enter_scene").getInt("loot_times"));
} catch (Exception e) {
e.printStackTrace();
}
//2.看看能不能偷
JSONObject buildList = jsonRun.getJSONObject("info").
getJSONObject("enter_scene").
getJSONObject("build_info").
getJSONObject("build_list");
Iterator<String> it = buildList.keys();
List<JSONObject> foodBuild = new ArrayList<JSONObject>();
while(it.hasNext()){
JSONObject build = buildList.getJSONObject(it.next());
int buildId = build.getInt("build_id");
if(buildId >= 30000 && buildId < 40000){
foodBuild.add(build);
}
}
//看看食物列表里哪个能收获的
JSONArray foodBuildIds = new JSONArray();//ids
for(JSONObject build: foodBuild){
foodBuildIds.add(build.getInt("id"));
}
log("好友食物工厂有:"+foodBuildIds);
//针对每个食物进行处理
for(JSONObject build : foodBuild){
//看看是不是空的,可以生产,或者已经生产完成可以收获
long st = build.getLong("start_time");
long et = build.getLong("end_time");
if(st == 0){ }
else if(et <= u.getSystemTime()){
//表示已经完成了,看看我自己偷过没有,没有就偷
//先看看剩余的够不够偷?
int stolen = build.getInt("stolen");
int remain = build.getInt("remain_food");
int takeTax = build.getInt("takeTax");
//只能偷10%
if((stolen + takeTax)*100/(stolen + remain+takeTax) < 10){
JSONArray stealList = build.getJSONArray("stealing_list");
boolean bsteal = false;
for(int i=0;i<stealList.size(); i++){
String id = stealList.getString(i);
if(id.equals(u.getId())){
bsteal = true;
break;
}
}
if(bsteal){
//log("已经偷过该好友食物所以不去偷取了");
continue;//已经偷过了
}
//偷啊!
checkApi();
String stealFoodUrl = "http://xnapi.lw.fminutes.com/api.php?inuId="+inuId+"&method=Social.stealingFood";
values = new HashMap<String, String>();
values.put("keyName", keyName);
values.put("requestSig", sig);
values.put("data","{\"desc_id\":\""+fId+"\",\"factory_id\":"+build.getInt("id")+",\"ids\":"+foodBuildIds+"}");
res = postText(stealFoodUrl, values);
JSONObject jsonR = new JSONObject(res);
if(jsonR.getInt("result") == 0 && jsonR.get("info") != null
&& jsonR.getJSONObject("info").get("player_info") != null){
//生产成功:
log("偷取好友食物:"+values.get("data")+"成功!食物+"+jsonR.getJSONObject("info"));
JSONObject jsonu = jsonR.getJSONObject("info").getJSONObject("player_info");
u.updateNoTime(jsonu);
}else{
log("偷取好友食物:"+values.get("data")+"失败!");
}
Thread.sleep(500);
}else{
//log("好友食物不多,不能在偷取了");
}
}
}
//3.看看有没有怪物打
this.attackBeast(jsonRun, fId);
//4.看看好友是不是被占领了
Object t = jsonRun.getJSONObject("info").getJSONObject("enter_scene").get("master_info");
if(t instanceof JSONObject){
JSONObject jsonMaster = (JSONObject) t;
//看看是不是打jie过了
Object t1 = jsonRun.getJSONObject("info").getJSONObject("enter_scene").get("loot_flag");
if(t1 != null && -1 == Integer.valueOf(t1.toString()).intValue()){
log("已经趁火打jie:"+values.get("data")+"过了!");
return;
}
if(u.getLoot_times() <=0 ){
log("趁火打jie没有机会了!");
return ;
}
checkApi();
//被占领了耶。先趁火打jie,再营救
String dajieUrl = "http://xnapi.lw.fminutes.com/api.php?inuId="+inuId+"&method=Defence.loot";
values = new HashMap<String, String>();
values.put("keyName", keyName);
values.put("requestSig", sig);
values.put("data","{\"desc_id\":\""+fId+"\"}");
res = postText(dajieUrl, values);
JSONObject jsonR = new JSONObject(res);
if(jsonR.getInt("result") == 0 && jsonR.get("info") != null
&& jsonR.getJSONObject("info").get("player_info") != null){
//打jie成功:
// log(jsonR);
log("趁火打jie好友:"+values.get("data")+"成功!食物+"+jsonR.get("info"));
JSONObject jsonu = jsonR.getJSONObject("info").getJSONObject("player_info");
u.updateNoTime(jsonu);
}else{
log("趁火打jie:"+values.get("data")+"失败!");
}
//看看自己的战斗力够不
User master = new User();
master.updateNoTime(jsonMaster);
if(u.getForce() > master.getForce()){
//TODO 营救
}
}
}
/**
* 攻击好友或者我自己的怪物
*/
public void attackBeast(JSONObject jsonRun, String toUid)throws Exception{
if(!(jsonRun.getJSONObject("info").getJSONObject("enter_scene").get("pve")
instanceof JSONObject)){
//没怪物就返回
return ;
}
//如果攻击力不够则不攻击了
if(u.getForce() <= 20){
log("攻击力不足,无法攻击!");
return ;//
}
JSONObject pve = jsonRun.getJSONObject("info").getJSONObject("enter_scene").getJSONObject("pve");
Iterator<String> pveKeys = pve.keys();
while(pveKeys.hasNext()){
checkApi();
JSONObject beast = pve.getJSONObject(pveKeys.next());
String attackBeastUrl = "http://xnapi.lw.fminutes.com/api.php?inuId="+inuId+"&method=Pve.attackBeast";
//log(beast);
Map<String, String> values = new HashMap<String, String>();
values.put("keyName", keyName);
values.put("requestSig", sig);
values.put("data","{\"pointId\":"+beast.getInt("pointId")+",\"fId\":\""+toUid+"\"}");
log(values.get("data"));
String res = postText(attackBeastUrl, values);
log(res);
JSONObject jsonR = new JSONObject(res);
if(jsonR.getInt("result") == 0 && jsonR.get("info") != null
&& jsonR.getJSONObject("info").get("awardItemList") != null){
//生产成功:
log("攻击怪物:"+beast+"成功!得到:"+jsonR.getJSONObject("info").get("awardItemList"));
JSONObject jsonu = jsonR.getJSONObject("info").getJSONObject("player_info");
u.updateNoTime(jsonu);
}else{
log("攻击怪物:"+beast+"失败!原因:"+jsonR.get("info"));
}
Thread.sleep(500);
}
}
/**
* 生产和收取兵力
*/
public void gainAndProduceForce(JSONObject jsonRun, int forceId) throws Exception{
JSONObject buildList = jsonRun.getJSONObject("info").getJSONObject("enter_scene").getJSONObject("build_info").getJSONObject("build_list");
Iterator<String> it = buildList.keys();
while(it.hasNext()){
JSONObject build = null;
try {
build = buildList.getJSONObject(it.next());
} catch (Exception e) {
e.printStackTrace();
break;//跳出循环
}
int buildId = build.getInt("build_id");
if(buildId >= 30000 && buildId < 40000){
//这个是食物
}else if(buildId >= 40000 && buildId < 50000){
//兵工厂
long st = build.getLong("start_time");
long et = build.getLong("end_time");
if(st == 0){
//空的 。可以直接生产兵
String data = "{\"produce_id\":"+forceId+",\"id\":"+build.getInt("id")+"}";
this.produceForce(data);
}else if(et <= u.getSystemTime()){
//先收兵,再生产兵
String data = "{\"id\":"+build.getInt("id")+"}";
this.gainForce(data);
data = "{\"produce_id\":"+forceId+",\"id\":"+build.getInt("id")+"}";
this.produceForce(data);
}
}
}
}
/**
* 生产和收获食物
*/
public void gainAndProduceFood(JSONObject jsonRun,
int foodId ) throws Exception{
JSONObject buildList = jsonRun.getJSONObject("info").getJSONObject("enter_scene").getJSONObject("build_info").getJSONObject("build_list");
List<JSONObject> foodBuild = new ArrayList<JSONObject>();
Iterator<String> it = buildList.keys();
while(it.hasNext()){
JSONObject build = null;
try {
build = buildList.getJSONObject(it.next());
} catch (Exception e) {
e.printStackTrace();
break;//跳出循环
}
int buildId = build.getInt("build_id");
if(buildId >= 30000 && buildId < 40000){
//这个是食物
//看看是不是空的,可以生产,或者已经生产完成可以收获
//添加到列表
foodBuild.add(build);
long st = build.getLong("start_time");
long et = build.getLong("end_time");
if(st == 0){
//空的
String data = "{\"produce_id\":"+foodId+",\"id\":"+build.getInt("id")+"}";
this.produceFood(data);
}else if(et <= u.getSystemTime()){
}
}
}
//看看食物列表里哪个能收获的
JSONArray foodBuildIds = new JSONArray();
for(JSONObject build: foodBuild){
foodBuildIds.add(build.getInt("id"));
}
//收获生产食物
for(JSONObject build: foodBuild){
long st = build.getLong("start_time");
long et = build.getLong("end_time");
if(et != 0 && et <= u.getSystemTime()){
//可以收获了
String data = "{\"ids\":"+foodBuildIds+",\"id\":"+build.getInt("id")+"}";
log(data);
this.gainFood(data);
//收获后再生产
data = "{\"produce_id\":"+foodId+",\"id\":"+build.getInt("id")+"}";
this.produceFood(data);
}
}
}
/**
* 收获兵力
*/
public String gainForce(String data) throws Exception{
checkApi();
String gainFoodUrl = "http://xnapi.lw.fminutes.com/api.php?inuId="+inuId+"&method=Produce.gainRecruitment";
Map<String, String> values = new HashMap<String, String>();
values.put("keyName", keyName);
values.put("requestSig", sig);
values.put("data", data);
log(values.get("data"));
String res1 = postText(gainFoodUrl, values);
log(res1);
JSONObject jsonR = new JSONObject(res1);
if(jsonR.getInt("result") == 0 && jsonR.get("info") != null
&& jsonR.getJSONObject("info").get("player_info") != null){
//生产成功:
log("收获兵力在build:"+data+"成功!");
JSONObject jsonu = jsonR.getJSONObject("info").getJSONObject("player_info");
u.updateNoTime(jsonu);
}else{
log("收获兵力在build:"+data+"失败!");
}
return res1;
}
/**
* 生产兵力
*/
public String produceForce(String data) throws Exception{
checkApi();
String produceFoodUrl = "http://xnapi.lw.fminutes.com/api.php?inuId="+inuId+"&method=Produce.recruiteSoldier";
Map<String, String> values = new HashMap<String, String>();
values.put("keyName", keyName);
values.put("requestSig", sig);
values.put("data", data);
log(values.get("data"));
String res = postText(produceFoodUrl, values);
log(res);
JSONObject jsonR = new JSONObject(res);
if(jsonR.getInt("result") == 0 && jsonR.get("info") != null
&& jsonR.getJSONObject("info").get("player_info") != null){
//生产成功:
log("生产兵力在build:"+data+"成功!");
JSONObject jsonu = jsonR.getJSONObject("info").getJSONObject("player_info");
u.updateNoTime(jsonu);
}else{
log("生产兵力在build:"+data+"失败!");
}
return res;
}
/**
* 生产食物
*/
public String produceFood(String data) throws Exception{
checkApi();
String produceFoodUrl = "http://xnapi.lw.fminutes.com/api.php?inuId="+inuId+"&method=Produce.produceFood";
Map<String, String> values = new HashMap<String, String>();
values.put("keyName", keyName);
values.put("requestSig", sig);
values.put("data", data);
log(values.get("data"));
String res = postText(produceFoodUrl, values);
log(res);
JSONObject jsonR = new JSONObject(res);
if(jsonR.getInt("result") == 0 && jsonR.get("info") != null
&& jsonR.getJSONObject("info").get("player_info") != null){
//生产成功:
log("生产食物在build:"+data+"成功!");
JSONObject jsonu = jsonR.getJSONObject("info").getJSONObject("player_info");
u.updateNoTime(jsonu);
}else{
log("生产食物在build:"+data+"失败!");
}
return res;
}
/**
* 收获食物
*/
public String gainFood(String data) throws Exception{
checkApi();
String gainFoodUrl = "http://xnapi.lw.fminutes.com/api.php?inuId="+inuId+"&method=Produce.gainFood";
Map<String, String> values = new HashMap<String, String>();
values.put("keyName", keyName);
values.put("requestSig", sig);
values.put("data", data);
log(values.get("data"));
String res1 = postText(gainFoodUrl, values);
log(res1);
JSONObject jsonR = new JSONObject(res1);
if(jsonR.getInt("result") == 0 && jsonR.get("info") != null
&& jsonR.getJSONObject("info").get("player_info") != null){
//生产成功:
log("收获食物在build:"+data+"成功!");
JSONObject jsonu = jsonR.getJSONObject("info").getJSONObject("player_info");
u.updateNoTime(jsonu);
}else{
log("收获食物在build:"+data+"失败!");
}
return res1;
}
}
用户信息类
import atg.taglib.json.util.JSONException;
import atg.taglib.json.util.JSONObject;
public class User {
private String id;//id
private long systemTime;//服务器时间
private int food;//食物
private int force;//兵力
private int grade;//等级
private int population_limit;//人口
private int population_all;//总人口
private int mp;//魔法值
private int loot_times;//打劫次数
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public int getFood() {
return food;
}
public void setFood(int food) {
this.food = food;
}
public int getForce() {
return force;
}
public void setForce(int force) {
this.force = force;
}
public long getSystemTime() {
return systemTime;
}
public void setSystemTime(long systemTime) {
this.systemTime = systemTime;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public int getPopulation_all() {
return population_all;
}
public void setPopulation_all(int populationAll) {
population_all = populationAll;
}
public int getMp() {
return mp;
}
public void setMp(int mp) {
this.mp = mp;
}
public int getPopulation_limit() {
return population_limit;
}
public void setPopulation_limit(int populationLimit) {
population_limit = populationLimit;
}
public void updateNoTime(JSONObject jsonu){
try {
this.setId(jsonu.getString("uid"));
this.setFood(jsonu.getInt("food"));
this.setForce(jsonu.getInt("population"));
this.setPopulation_all(jsonu.getInt("population_all"));
this.setPopulation_limit(jsonu.getInt("population_limit"));
this.setGrade(jsonu.getInt("grade"));
this.setMp(jsonu.getInt("mp"));
} catch (JSONException e) {
e.printStackTrace();
}
}
public int getLoot_times() {
return loot_times;
}
public void setLoot_times(int lootTimes) {
loot_times = lootTimes;
}
}
附近是我弄的辅助工具,每天运行一次,可以节省很多时间。、。。。
- rrlw.rar (880.3 KB)
- 下载次数: 981
- rrlw1.rar (887 KB)
- 下载次数: 260