예제 #1
0
파일: login.py 프로젝트: jacksyen/pyastd
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