def __init__(self,username=None,password=None,serverid=295): self.include = Include(username) self.config = Config() self.username = username self.password = password self.serverid = serverid self.timehelp = TimeHelp()
def __init__(self,include,serverid,playerinfo,config): threading.Thread.__init__(self) self.stoped = False self.request = Request(include) self.serverid = serverid self.playerinfo = playerinfo self.config = config self.timehelp = TimeHelp() self.armiesId = self.request.include.legion_battle.get(self.config._defaultConfig.get("battle-legion"))
def __init__(self, include, serverid, playerinfo, config): threading.Thread.__init__(self) self.stoped = False self.include = include self.request = Request(include) self.config = config self.serverid = serverid self.playerinfo = playerinfo self.timehelp = TimeHelp()
class BattleThread(threading.Thread): def __init__(self,include,serverid,playerinfo,config): threading.Thread.__init__(self) self.stoped = False self.request = Request(include) self.serverid = serverid self.playerinfo = playerinfo self.config = config self.timehelp = TimeHelp() self.armiesId = self.request.include.legion_battle.get(self.config._defaultConfig.get("battle-legion")) def stop(self): self.request.include.logger.info(u"自动刷军团线程停止") if self.config._defaultConfig.get("battle-autoformat"): # 调整阵型为雁行阵 formatThread = FormationThread(self.request.include,self.serverid,160) formatThread.start() self.stoped = True def isStoped(self): return self.stoped def run(self): self.request.include.logger.info(u"自动刷%s军团功能启动" %(self.config._defaultConfig.get("battle-legion"))) # 调整阵型为:八卦阵 if self.config._defaultConfig.get("battle-autoformat"): formatThread = FormationThread(self.request.include,self.serverid,120) formatThread.start() while True: if self.stoped: return if self.playerinfo.forces<=10000: draughtThread = DraughtThread(self.request.include,self.serverid,self.playerinfo) draughtThread.start() if self.playerinfo.token==0: self.request.include.logger.info(u"军令数量为0") self.stop() return if self.playerinfo.tokencdflag==1: if self.playerinfo.tokencd>0: chatSendThread = ChatSendThread(self.request.include,self.serverid,u"征战CD中,剩余:%s" %(self.timehelp.getDownTime(self.playerinfo.tokencd)),u"国家") chatSendThread.start() self.request.include.logger.info(u"征战CD中,剩余 %s" %(self.timehelp.getDownTime(self.playerinfo.tokencd))) self.stop() return # 获得征战队伍信息 battleTeamInfo = self.getTeamInfo() role = None if len(battleTeamInfo.memberlist)>0: for member in battleTeamInfo.memberlist: if member.playerid == int(self.playerinfo.playerid): if member.role=="CREATER": # 解散队伍 self.dismissTeam() elif member.role=="COMMON": # 退出队伍 self.quitTeam() break # 重新获得队伍信息 battleTeamInfo = self.getTeamInfo() # 判断是否存在合适的征战队伍,返回合适的队伍 team = self.isExistsTeam(battleTeamInfo) if team: # 加入征战队伍 if not self.joinTeam(team): self.stop() return role = "COMMON" else: # 若配置文件中不可以创建征战队伍,就跳过继续等待加入队伍 if not self.config._defaultConfig.get("battle-autocreate"): while True: battleTeamInfo = self.getTeamInfo() team = self.isExistsTeam(battleTeamInfo) if team: # 加入征战队伍 if not self.joinTeam(team): self.stop() return role = "COMMON" break time.sleep(3) else: # 创建征战队伍 url = "http://s%d.as.yaowan.com/root/multiBattle!createTeam.action?%d" %(self.serverid,int(time.time()*1000)) data = {"rule":"4:0;2", "armiesId":self.armiesId} reqinfo = self.request.request(url,data,jsonFormat=False) res = zlib.decompress(reqinfo.read()) print "create:",res role = "CREATER" sendnum = 0 battlePer = {} while True: battleTeamInfo = self.getTeamInfo() # 判断加入的队伍是否已经开始 if battleTeamInfo.sceneevent: playerbattleinfo = battleTeamInfo.sceneevent.playerbattleinfo if playerbattleinfo: self.playerinfo.token = playerbattleinfo.token self.playerinfo.tokencd = playerbattleinfo.tokencd self.playerinfo.tokencdflag = playerbattleinfo.tokencdflag self.playerinfo.forces = playerbattleinfo.forces #print "剩余总军工:",playerbattleinfo.jyungong self.request.include.logger.info(u"剩余总军工:%d" %(playerbattleinfo.jyungong)) break # 判断加入的队伍是否存在 if len(battleTeamInfo.memberlist)==0: self.request.include.logger.info(u"征战队伍解散") break if role=="CREATER": for member in battleTeamInfo.memberlist: if member.playername.find("u老鬼")>=0: battlePer.setdefault("laogui",1) elif member.playername.find(u"米粥")>=0: battlePer.setdefault("mizhou",1) elif member.playername.find(u"不停")>=0: battlePer.setdefault("buting",1) elif member.playername.find(u"豆包")>=0: battlePer.setdefault("doubao",1) elif member.playername.find(u"人民")>=0: battlePer.setdefault("renming",1) elif member.playername.find(u"猪猪")>=0: battlePer.setdefault("zhuzhu",1) elif member.playername.find(u"亚特")>=0: battlePer.setdefault("yate",1) elif member.playername.find(u"来时")>=0: battlePer.setdefault("laishi",1) elif member.playername.find(u"小馬")>=0: battlePer.setdefault("xiaomage",1) elif member.playername.find(u"睡觉")>=0: battlePer.setdefault("shuijiao",1) # 自己创建的队伍需要6个成员以上才能开启 if battleTeamInfo.currentnum>=5 or (len(battlePer.items())>=2 and battleTeamInfo.currentnum>=4): # 开始征战,获得征战结果 battleInfo = self.getBattleInfo() if battleInfo.sceneevent: playerbattleinfo = battleInfo.sceneevent.playerbattleinfo if playerbattleinfo: self.playerinfo.token = playerbattleinfo.token self.playerinfo.tokencd = playerbattleinfo.tokencd self.playerinfo.tokencdflag = playerbattleinfo.tokencdflag self.playerinfo.forces = playerbattleinfo.forces print u"剩余总军工:",playerbattleinfo.jyungong break else: print u"征战队伍已开启,需要%d个成员才能开始..." %(5-battleTeamInfo.currentnum) if (5-battleTeamInfo.currentnum)<=1: if sendnum<=1: chatSendThread = ChatSendThread(self.request.include,self.serverid,u"闯王=%d" %(5-battleTeamInfo.currentnum),"国家") chatSendThread.start() sendnum = sendnum + 1 time.sleep(3) time.sleep(3) ''' # 未知 url = "http://s%d.as.yaowan.com/root/battle.action?%d " %(self.serverid,int(time.time()*1000)) reqinfo = self.request.request(url) res = zlib.decompress(reqinfo.read()) print reqinfo ''' ''' 加入征战队伍 team: 队伍信息 ''' def joinTeam(self,team): url = "http://s%d.as.yaowan.com/root/multiBattle!joinTeam.action?%d" %(self.serverid,int(time.time()*1000)) data = {"teamId":team.teamid} reqinfo = self.request.request(url,data,jsonFormat=False) res = zlib.decompress(reqinfo.read()) if res.find(u"军令还没有冷却")>=0: self.request.include.logger.warning(u"军令还没有冷却,不可以征战") return False self.request.include.logger.info(u"加入由玩家:%s 创建的征战队伍" %team.teamname) print 'join:',res return True ''' 退出队伍 ''' def quitTeam(self): self.request.include.logger.info(u"退出队伍") url = "http://s%d.as.yaowan.com/root/multiBattle!quit.action?%d" %(self.serverid,int(time.time()*1000)) reqinfo = self.request.request(url) res = zlib.decompress(reqinfo.read()) print 'quit:',res ''' 解散队伍 ''' def dismissTeam(self): self.request.include.logger.info(u"解散队伍") url = "http://s%d.as.yaowan.com/root/multiBattle!dismiss.action?%d" %(self.serverid,int(time.time()*1000)) reqinfo = self.request.request(url) res = zlib.decompress(reqinfo.read()) print 'dismiss:',res ''' 判断是否存在合适的征战队伍 ''' def isExistsTeam(self,battleTeamInfo): for team in battleTeamInfo.teamlist: if self.playerinfo.league==2: if team.condition.find(u"魏国")>=0 and (team.currentnum!=team.maxnum): return team if team.condition.find(u"吴国")>=0 and (team.currentnum!=team.maxnum): return team if team.condition.find(u"英雄")>=0 and (team.currentnum!=team.maxnum): return team return None ''' 玩家自己创建,获得征战结果 返回BattleInfo对象 ''' def getBattleInfo(self): url = "http://s%d.as.yaowan.com/root/multiBattle!battle.action?%d" %(self.serverid,int(time.time()*1000)) reqinfo = self.request.request(url) res = zlib.decompress(reqinfo.read()) if res: res = res[res.find("<?xml"):] resXML = etree.XML(res) childli = resXML.getchildren() battleInfo = BattleInfo() for child in childli: if child.tag=="state": battleInfo.state = child.text if child.tag=="message": battleInfo.message = child.text if child.tag=="sceneevent": sceneevent = SceneEvent() for cchild in child: if cchild.tag=="scene": sceneevent.scene = child.text if cchild.tag=="kfzonestate": sceneevent.kfzonestate = child.text if cchild.tag=="playerbattleinfo": print 'battle playerbattleinfo:',cchild.getchildren() forces = int(cchild.find("forces").text) if cchild.findtext("jyungong"): jyungong = int(cchild.find("jyungong").text) else: jyungong = -1 token = int(cchild.find("token").text) tokencd = int(cchild.find("tokencd").text) tokencdflag = int(cchild.find("tokencdflag").text) kfzonestate = cchild.find("kfzonestate").text playerbattleinfo = PlayerBattleInfo(forces,jyungong,token,tokencd,tokencdflag,kfzonestate) sceneevent.playerbattleinfo = playerbattleinfo battleInfo.sceneevent = sceneevent return battleInfo ''' 获得征战队伍信息 ''' def getTeamInfo(self): url = "http://s%d.as.yaowan.com/root/multiBattle!getTeamInfo.action?%d" %(self.serverid,int(time.time()*1000)) data = {"armiesId":self.armiesId} reqinfo = self.request.request(url,data,jsonFormat=False) res = zlib.decompress(reqinfo.read()) if res: res = res[res.find("<?xml"):] resXML = etree.XML(res) childli = resXML.getchildren() battleTeamInfo = BattleTeamInfo() teamlist = [] memberlist = [] for child in childli: if child.tag=="state": battleTeamInfo.state = child.text if child.tag=="maxnum": battleTeamInfo.maxnum = int(child.text) if child.tag=="currentnum": battleTeamInfo.currentnum = int(child.text) if child.tag=="armies": _id = child.find("id").text name = child.find("name").text level = child.find("level").text minplayer = child.find("minplayer").text maxplayer = child.find("maxplayer").text maxwinnum = child.find("maxwinnum").text battlenum = child.find("battlenum").text honor = child.find("honor").text itemname = child.find("itemname").text armynum = child.find("armynum").text _filter = child.find("filter").text itempic = child.find("itempic").text armies = Armies(_id,name,level,minplayer,maxplayer,maxwinnum,battlenum,honor,itemname,armynum,_filter,itempic) battleTeamInfo.armies = armies if child.tag=="team": teamid = child.find("teamid").text teamname = child.find("teamname").text maxnum = int(child.find("maxnum").text) targetname = child.find("targetname").text currentnum = int(child.find("currentnum").text) condition = child.find("condition").text team = Team(teamid,teamname,maxnum,targetname,currentnum,condition) teamlist.append(team) if child.tag=="member": playername = child.find("playername").text playerid = int(child.find("playerid").text) playerlevel = child.find("playerlevel").text role = child.find("role").text attlv = child.find("attlv").text deflv = child.find("deflv").text makemode = child.find("makemode").text maxsolidernum = child.find("maxsolidernum").text solidernum = child.find("solidernum").text member = Member(playername,playerid,playerlevel,role,attlv,deflv,makemode,maxsolidernum,solidernum) memberlist.append(member) if child.tag=="sceneevent": sceneevent = SceneEvent() for cchild in child: if cchild.tag=="scene": sceneevent.scene = child.text if cchild.tag=="kfzonestate": sceneevent.kfzonestate = child.text if cchild.tag=="playerbattleinfo": print 'playerbattleinfo:',cchild.getchildren() if cchild.findtext("forces"): forces = int(cchild.find("forces").text) else: forces = -1 if cchild.findtext("jyungong"): jyungong = int(cchild.find("jyungong").text) else: jyungong = -1 if cchild.findtext("token"): token = int(cchild.findtext("token")) else: token = -1 tokencd = int(cchild.find("tokencd").text) tokencdflag = int(cchild.find("tokencdflag").text) kfzonestate = cchild.find("kfzonestate").text playerbattleinfo = PlayerBattleInfo(forces,jyungong,token,tokencd,tokencdflag,kfzonestate) sceneevent.playerbattleinfo = playerbattleinfo battleTeamInfo.sceneevent = sceneevent battleTeamInfo.teamlist = teamlist battleTeamInfo.memberlist = memberlist return battleTeamInfo
class TradeThread(threading.Thread): """ include: include对象 serverid: 服务器ID playerinfo: playerinfo对象 userconfig: 用户配置对象 """ def __init__(self, include, serverid, playerinfo, config): threading.Thread.__init__(self) self.stoped = False self.include = include self.request = Request(include) self.config = config self.serverid = serverid self.playerinfo = playerinfo self.timehelp = TimeHelp() def stop(self): self.stoped = True def isStoped(self): return self.stoped def run(self): # 获得玩家的委派商人信息 playerMerchant = self.getPlayerMerchant() # 判断钱币是否达到最低限制和是否正在CD中 mincoins = self.config._defaultConfig.get("coins-minlimit") if int(self.playerinfo.copper) < mincoins: print "钱币小于%d,停止委派" % (mincoins) self.stoped = True print "auto market cdflag:", int(playerMerchant.cdflag), ",cd:", int(playerMerchant.cd) if int(playerMerchant.cdflag) == 1 and int(playerMerchant.cd) > 0: print "委派CD中,停止委派,剩余:%s" % (self.timehelp.getDownTime(int(playerMerchant.cd))) self.include.tradeCD = int(playerMerchant.cd) self.include.tradeCDFlag = True self.stoped = True while True: if self.stoped: print "自动委派线程停止" return # 委派马商 if not playerMerchant: self.stoped = True print "委派失败,返回值为空" return playerMerchant = self.marketTrade(playerMerchant) if not playerMerchant.tradesn: print "委派失败,未获取到委派结果" self.stoped = True return print playerMerchant.message marketresult = self.marketConfirm(playerMerchant) if marketresult: # 卖出货物成功 # 判断委派返回的玩家钱币是否达到最低限制,true:则停止委派 if int(marketresult.playerupdateinfo.copper) < mincoins: print "钱币小于%d,停止委派" % (mincoins) self.stoped = True return else: # 卖出货物失败 if playerMerchant.playerupdateinfo and playerMerchant.playerupdateinfo.copper: if int(playerMerchant.playerupdateinfo.copper) < mincoins: print "钱币小于%d,停止委派" % (mincoins) self.stoped = True return if int(playerMerchant.cdflag) == 1: msg = "委派CD中,停止委派,剩余:%s" % (self.timehelp.getDownTime(int(playerMerchant.cd))) print msg self.include.tradeCD = int(playerMerchant.cd) self.include.tradeCDFlag = True self.stoped = True return time.sleep(1) """ 获得玩家的马商信息 """ def getPlayerMerchant(self): url = "http://s%d.as.yaowan.com/root/market!getPlayerMerchant.action?%d" % ( self.serverid, long(time.time() * 1000), ) reqinfo = self.request.request(url) res = zlib.decompress(reqinfo.read()) print "market res:", res # get xml str return self.resolveMerXML(res) """ 解析玩家的马商信息和委派过后的马商信息 content: 要解析的内容 返回 PlayerMerchant 对象 """ def resolveMerXML(self, content): res = content[content.find("<?xml") :] if not res: return None results = etree.XML(res) childli = results.getchildren() playerMerchant = PlayerMerchant() merchantlist = [] for child in childli: # 委派结果 if child.tag == "merchandise": merchandiseid = child.find("merchandiseid").text merchandisename = unicode(child.find("merchandisename").text).encode("utf-8") merchandiselv = child.find("merchandiselv").text merchandisequality = child.find("merchandisequality").text limitlv = child.find("limitlv").text pic = child.find("pic").text equiptype = child.find("equiptype").text attribute = child.find("attribute").text hp = child.find("hp").text cost = child.find("cost").text stagename = child.find("stagename").text merchandise = Merchandise( merchandiseid, merchandisename, merchandiselv, merchandisequality, limitlv, pic, equiptype, attribute, hp, cost, stagename, ) playerMerchant.merchandise = merchandise if child.tag == "merchant": merchantid = child.find("merchantid").text merchantname = unicode(child.find("merchantname").text).encode("utf-8") merchantintro = child.find("merchantintro").text cost = child.find("cost").text nextcharge = child.find("nextcharge").text merchant = Merchant(merchantid, merchantname, merchantintro, cost, nextcharge) merchantlist.append(merchant) if child.tag == "playerupdateinfo": # print 'trade playerupdateinfo:',child.getchildren() if child.find("copper"): copper = child.find("copper").text updateinfo = PlayerUpdateInfo() updateinfo.copper = copper playerMerchant.playerupdateinfo = updateinfo if child.tag == "state": state = child.text playerMerchant.state = state if child.tag == "cd": cd = child.text playerMerchant.cd = cd if child.tag == "cdflag": cdflag = child.text playerMerchant.cdflag = cdflag if child.tag == "free": free = child.text playerMerchant.free = free if child.tag == "gold": gold = child.text playerMerchant.gold = gold if child.tag == "tradesn": tradesn = child.text playerMerchant.tradesn = tradesn if child.tag == "message": message = unicode(child.text).encode("utf-8") playerMerchant.message = message playerMerchant.merchantlist = merchantlist return playerMerchant """ 马商委派 """ def marketTrade(self, param): # 得到marketfile中最高的那个商人 merchant = param.merchantlist[0] for i in range(len(param.merchantlist)): if int(param.merchantlist[i].merchantid) == 5: merchant = param.merchantlist[i - 1] break data = {"merchantId": int(merchant.merchantid), "gold": int(param.gold)} url = "http://s%d.as.yaowan.com/root/market!trade.action?%d" % (self.serverid, long(time.time() * 1000)) reqinfo = self.request.request(url, data, jsonFormat=False) res = zlib.decompress(reqinfo.read()) # 得到返回的委派货物和商人信息 playerMerchant = self.resolveMerXML(res) return playerMerchant """ 判断委派的货物是否需要卖出 """ def marketConfirm(self, playerMerchant): if (int(playerMerchant.merchandise.limitlv) < self.config._defaultConfig.get("trade-limitlv")) or ( int(playerMerchant.merchandise.attribute) < self.config._defaultConfig.get("trade-attribute") ): # 卖出货物 data = {"tradeSN": playerMerchant.tradesn} url = "http://s%d.as.yaowan.com/root/market!confirm.action?%d" % (self.serverid, long(time.time() * 1000)) reqinfo = self.request.request(url, data, jsonFormat=False) res = zlib.decompress(reqinfo.read()) res = res[res.find("<?xml") :] if not res: print "卖出货物%s失败" % (playerMerchant.merchandise.merchandisename) return None results = etree.XML(res) childli = results.getchildren() # 返回结果对象 marketresult = MarketResult() for child in childli: if child.tag == "state": state = child.text if int(state) != 1: print "卖出货物%s失败" % (playerMerchant.merchandise.merchandisename) return None marketresult.state = state if child.tag == "usesize": # 使用大小 usesize = child.text marketresult.usesize = usesize if child.tag == "cost": cost = child.text marketresult.cost = cost if child.tag == "playerupdateinfo": copper = child.find("copper").text updateinfo = PlayerUpdateInfo() updateinfo.copper = copper marketresult.playerupdateinfo = updateinfo msg = "卖出货物%s成功,获得%d钱币" % (playerMerchant.merchandise.merchandisename, int(cost)) print msg return marketresult else: msg = "货物%s属性或级别大于配置参数,没有卖出" % (playerMerchant.merchandise.merchandisename) print msg return None
class yaowan(object): def __init__(self,username=None,password=None,serverid=295): self.include = Include(username) self.config = Config() self.username = username self.password = password self.serverid = serverid self.timehelp = TimeHelp() def start(self): self.include.addheaders = [('Content-Type', 'application/x-www-form-urlencoded'), ('User-agent','Mozilla/5.0 (X11; Linux x86_64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1'),#'Mozilla/5.0(X12;Unixx86_64;9.0.0) By JackSyen'), ('Accept','text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), ('Accept-Language','zh-cn,zh;q=0.5'), ('Accept-Encoding','gzip,deflate'), ('Accept-Charset','GB2312,utf-8;q=0.7,*;q=0.7'), ('Referer','http://as.yaowan.com'), ('Host','as.yaowan.com'), ('Connection','keep-alive'), ('Cookie','pageReferrInSession=; cnzz_a2184393=0; sin2184393=; rtime=0; ltime=1326903486641; cnzz_eid=66719180-1326902030-; cnzz_a2343924=0; sin2343924=; AJSTAT_ok_pages=1; AJSTAT_ok_times=1')] self.Request = Request(self.include) self.include.logger.info(u"-------%s开始登录--------" %(self.username)) if self.username and self.password: self.login() else: self.include.logger.warning(u"用户名或密码为空,程序退出...") exit(-1) #print "login last cookie:",self.include.cj self.initAS() def login(self): url = 'http://as.yaowan.com/Default.php?m=user&action=loginform&astd=1' data = {'username' : self.username, 'password' : self.password, 'buttion' : ''} self.Request.request(url,data,jsonFormat=False) # check login result #print "cj:",self.include.cj if len(re.findall("userid=\d+",str(self.include.cj)))>0: self.include.logger.info(u"登录成功") else: self.include.logger.error(u"登录失败,程序退出...") exit(-1) ''' def getXmlName(self,url): if url: result = re.findall(r"root/(\w+!?\w+)",url) if len(result)>0: return str(self.serverid)+"_"+str(result[0])+'.xml' return str(self.serverid)+"_"+str(int(time.time()))+"unknown.xml" ''' def initAS(self): url = "http://www.yaowan.com/?m=game&game_id=15&district_id=%d" %(683) #print "url:",url self.Request.request(url) # redicet to http://s322.as.yaowan.com url = "http://s%d.as.yaowan.com/root/server!getServerTime.action?%d" %(self.serverid,int(time.time()*1000)) reqinfo = self.Request.request(url) servertime = self.getServerTime(reqinfo) self.include.serverTime = servertime self.include.logger.info(u"服务器时间:%s" %(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime(self.include.serverTime/1000)))) self.gameTimer = GameTimer(self.include) self.gameTimer.start() url = "http://s%d.as.yaowan.com/root/server!getPlayerInfoByUserId.action?%d" %(self.serverid,int(time.time()*1000)) reqinfo = self.Request.request(url) #zlib decompress res = zlib.decompress(reqinfo.read()) res = res[res.find("<?xml"):] #print 'playerinfo res:',res self.playerinfo = self.getPlayerInfo(res) if not self.playerinfo.playerid: self.include.logger.error(u"未获取到玩家ID,程序退出...") exit(-1) self.include.logger.info(u"玩家ID:%d,名称:%s,级别:%d" %(self.playerinfo.playerid,self.playerinfo.playername,self.playerinfo.playerlevel)) url = "http://s%d.as.yaowan.com/root/server!getSessionId.action?%d" %(self.serverid,int(time.time()*1000)) reqinfo = self.Request.request(url) url = "http://s%d.as.yaowan.com/root/mainCity.action?%d" %(self.serverid,int(time.time()*1000)) reqinfo = self.Request.request(url) #zlib decompress res = zlib.decompress(reqinfo.read()) res = res[res.find("<?xml"):] self.cityinfo = self.getCityInfo(res) # 如果获取主城信息失败,则表示有验证码 if len(self.cityinfo.buildlist)==0: self.include.logger.error(u"未获取到主城信息,程序退出") exit(-1) url = "http://s%d.as.yaowan.com/root/validateCode!redirect.action?%d" %(self.serverid,int(time.time()*1000)) reqinfo = self.Request.request(url) #zlib decompress res = zlib.decompress(reqinfo.read()) res = res[res.find("<?xml"):] print 'validatecode res:',res url = "http://s%d.as.yaowan.com/root/validateCode.action?%d" %(self.serverid,int(time.time()*1000)) reqinfo = self.Request.request(url) #image/jpeg decomress print 'validateCode img res:',reqinfo.read() #send validate code ''' url = "http://s%d.as.yaowan.com/root/validateCode!code.action?%d" %(self.serverid,int(time.time()*1000)) #zlib decompress res = zlib.decompress(reqinfo.read()) res = res[res.find("<?xml"):] print 'send validate code:',res ''' # 聊天线程 chatThread = ChatThread(self.include,self.serverid,self.playerinfo) chatThread.start() # 开发区线程 if self.playerinfo.isinkfzone == "true": self.include.logger.info(u"当前正在开发区中") # 全局设置线程 # 自动委派 self.tradeThread = None if self.config._defaultConfig.get("trade-autostate"): self.include.logger.log(u"自动委派功能开启") self.tradeThread = TradeThread(self.include,self.serverid,self.playerinfo,self.config) self.tradeThread.start() # 自动贸易 if self.config._defaultConfig.get("stock-autostate"): self.stockThread = StockThread(self.include,self.serverid,self.playerinfo,self.config) self.stockThread.start() # 自动征战 self.battleThread = None #print "CD:",self.playerinfo.tokencd,",flag:",self.playerinfo.tokencdflag if self.config._defaultConfig.get("battle-autostate"): # 在军攻加成时间段才开始(13:00~14:00/20:00~23:00) servertime = self.gameTimer.include.serverTime localtime = time.localtime(servertime/1000) print 'battle localtime:',time.strftime("%Y-%m-%d %H:%M:%S",localtime) # 开始征战线程 #self.battleThread = BattleThread(self.include,self.serverid,self.playerinfo,self.config) #self.battleThread.start() if 20<=localtime.tm_hour<23 or (13<=localtime.tm_hour<14): #if 11<=localtime.tm_hour<14 or 20<=localtime.tm_hour<23: # 开始征战线程 self.battleThread = BattleThread(self.include,self.serverid,self.playerinfo,self.config) self.battleThread.start() # 自动宴会 if self.config._defaultConfig.get("dinner-autostate"): self.dinnerThread = None # 自动秘书线程(领取俸禄/粮食) if self.config._defaultConfig.get("secreatry-auto"): self.secretaryThread = SecretaryThread(self.include,self.serverid,self.playerinfo) self.secretaryThread.start() # 自动采集线程 self.outcityThread = OutCityThread(self.include,self.serverid,self.playerinfo,self.config) self.outcityThread.start() # 自动粮食买卖 self.foodBandCThread = FoodBandCThread(self.include,self.serverid,self.playerinfo) self.foodBandCThread.start() # 自动开启训练师 if self.config._defaultConfig.get("trainer-autoopen"): self.generalThread = GeneralThread(self.include,self.serverid,self.playerinfo,self.config) self.generalThread.start() # 精炼工人线程 if self.playerinfo.playerlevel>=130 and self.config._defaultConfig.get("refine-autostate"): self.refineThread = RefineThread(self.include,self.serverid,self.playerinfo) self.refineThread.start() # 主线程 while True: # 判断委派线程 if self.config._defaultConfig.get("trade-autostate"): if self.tradeThread.include.tradeCDFlag: self.tradeThread.include.tradeCD = self.tradeThread.include.tradeCD - 1000 if self.tradeThread.include.tradeCD<1000*10 and self.tradeThread.include.tradeCD>0: print u"委派倒计时:",self.tradeThread.include.tradeCD/1000 if self.tradeThread.include.tradeCD<0: if self.tradeThread: self.tradeThread = TradeThread(self.tradeThread.include,self.tradeThread.serverid,self.tradeThread.playerinfo,self.config) self.tradeThread.start() # 判断征战线程 if self.config._defaultConfig.get("battle-autostate"): servertime = self.gameTimer.include.serverTime localtime = time.localtime(servertime/1000) if 20<=localtime.tm_hour<23 or (13<=localtime.tm_hour<14): #if 20<=localtime.tm_hour<23 or (localtime.tm_hour==13 and localtime.tm_min<30): #if 11<=localtime.tm_hour<14 or 20<=localtime.tm_hour<23: if not self.battleThread: self.battleThread = BattleThread(self.include,self.serverid,self.playerinfo,self.config) self.battleThread.start() else: # 继续开始征战 if self.battleThread.playerinfo.token>0: if self.battleThread.playerinfo.tokencdflag==1: self.battleThread.playerinfo.tokencd = self.battleThread.playerinfo.tokencd - 1000 ''' if self.battleThread.playerinfo.tokencd<1000*10 and self.battleThread.playerinfo.tokencd>0: print "征战倒计时:",self.battleThread.playerinfo.tokencd/1000 if self.battleThread.playerinfo.tokencd<=1000*3 and self.battleThread.playerinfo.tokencd>0: chatSendThread = ChatSendThread(self.include,self.serverid,"征战倒计时 %d" %(self.battleThread.playerinfo.tokencd/1000),"guojia") chatSendThread.start() ''' if self.battleThread.playerinfo.tokencd<=0: if self.battleThread.stoped: self.battleThread = BattleThread(self.include,self.battleThread.serverid,self.battleThread.playerinfo,self.battleThread.config) self.battleThread.start() else: self.battleThread.stoped = True else: if self.battleThread: self.battleThread.stoped = True # 判断宴会线程 if self.config._defaultConfig.get("dinner-autostate"): servertime = self.gameTimer.include.serverTime localtime = time.localtime(servertime/1000) if 10<=localtime.tm_hour<14 or 19<=localtime.tm_hour<23: if not self.dinnerThread: self.dinnerThread = DinnerThread(self.include,self.serverid,self.playerinfo) self.dinnerThread.start() else: self.dinnerThread = None time.sleep(1) ''' 获得CityInfo对象 res: 请求URL返回的XML字符串 ''' def getCityInfo(self,res): if not res: print "playerinfo result is null,exit..." exit(-1) return infoXML = etree.XML(res) cityinfo = CityInfo() buildlist = [] corlist = [] for child in infoXML.getchildren(): # 主城建筑 if child.tag=="maincitydto": id_ = child.find("id").text buildid = child.find("buildid").text buildname = child.find("buildname").text intro = child.find("intro").text cityid = child.find("cityid").text playerid = child.find("playerid").text buildlevel = child.find("buildlevel").text nextcopper = child.find("nextcopper").text cdtime = child.find("cdtime").text lastcdtime = child.find("lastcdtime").text lastupdatetime = child.find("lastupdatetime").text citybuild = CityBuild(id_,buildid,buildname,intro,cityid,playerid, buildlevel,nextcopper,cdtime,lastcdtime,lastupdatetime) buildlist.append(citybuild) # 建造队列 if child.tag=="constructordto": cid = int(child.find("cid").text) cdflag = int(child.find("cdflag").text) ctime = int(child.find("ctime").text) buildcd = BuildCD(ctime,cid,cdflag) #正在建造CD中 if cdflag: endtime = int(time.time()+ctime) buildcd.endtime = endtime corlist.append(buildcd) cityinfo.buildlist = buildlist cityinfo.buildcdlist = corlist return cityinfo ''' 获得PlayerInfo对象 res: 请求URL返回的XML字符串 ''' def getPlayerInfo(self,res): if not res: print "playerinfo result is null,exit..." exit(-1) return infoXML = etree.XML(res) for child in infoXML.getchildren(): if child.tag=="player": tokencd = int(child.find("tokencd").text) tokencdflag = int(child.find("tokencdflag").text) imposecd = child.find("imposecd").text imposecdflag = child.find("imposecdflag").text protectcd = child.find("protectcd").text playerid = int(child.find("playerid").text) playername = child.find("playername").text playerlevel = int(child.find("playerlevel").text) copper = child.find("copper").text food = child.find("food").text forces = int(child.find("forces").text) sys_gold = child.find("sys_gold").text user_gold = child.find("user_gold").text jyungong = child.find("jyungong").text prestige = child.find("prestige").text nation = child.find("nation").text year = child.find("year").text season = child.find("season").text token = int(child.find("token").text) maxtoken = child.find("maxtoken").text isinkfzone = child.find("isinkfzone").text kfzoneid = child.find("kfzoneid").text kfzonesate = int(child.find("kfzonesate").text) transfercd = child.find("transfercd").text traincurrentnum = child.find("traincurrentnum").text maxtrainnum = child.find("maxtrainnum").text stockcd = child.find("stockcd").text inspirestate = child.find("inspirestate").text inspirecd = child.find("inspirecd").text league = int(child.find("league").text) playerinfo = PlayerInfo(tokencd,tokencdflag,imposecd,imposecdflag,protectcd,playerid,playername,playerlevel, copper,food,forces,sys_gold,user_gold,jyungong,prestige,nation,year,season, token,maxtoken,transfercd,traincurrentnum,maxtrainnum,stockcd,inspirestate,inspirecd) playerinfo.isinkfzone = isinkfzone playerinfo.kfzoneid = kfzoneid playerinfo.kfzonesate = kfzonesate playerinfo.league = league elif child.tag=="limitvalue": if playerinfo: playerinfo.maxfood = child.find("maxfood").text playerinfo.maxcoin = child.find("maxcoin").text playerinfo.maxforce = child.find("maxforce").text return playerinfo ''' 获得服务器时间 ''' def getServerTime(self,res): #zlib decompress resXML = zlib.decompress(res.read()) resXML = resXML[resXML.find("<?xml"):] timexml = etree.XML(resXML) rtime = int(timexml.find("time").text) # 因为傲视服务器的时间比当前大8小时,这里减去,便于用户查看 rtime = rtime - 8*60*60*1000 print "rtime:",self.timehelp.getStrTime(rtime) return rtime