from kivy.lang.builder import Builder from kivy.uix.boxlayout import BoxLayout from kivy.app import App import requests import time import re import threading from kivy.uix.widget import Widget from kivy.config import Config from kivy.uix.popup import Popup from kivy.uix.label import Label from kivy.uix.filechooser import FileChooserListView Config.set('kivy', 'default_font', [ 'msgothic', 'DroidSansFallback.ttf']) tem = Builder.load_string(''' <TitleRow> orientation: 'horizontal' Label: text:'name' Label: text:'level' Label: text:'map' Label: text:'attack' Label: text:'warn' <DataRow> name:name level:level map:map attack:attack warn:warn orientation: 'horizontal' Label: id:name text:'' Label: id:level text:'' Label: id:map text:'' Label: id:attack text:'' Label: id:warn text:'' <SelectFile> fc:fc orientation:'vertical' FileChooserListView path:'./' id:fc size_hint_y:None height:root.height*0.85 BoxLayout: orientation:'horizontal' Button: size_hint_y:None height:root.height*0.1 text:'confirm' on_release:root.confirm(root.fc) Button: size_hint_y:None height:root.height*0.1 text:'cancel' on_release:root.parent.parent.parent.dismiss() <Check> name:'check window' run:run fileaddr:fileaddr orientation:'vertical' TitleRow: id:row1 DataRow: id:row2 DataRow: id:row3 DataRow: id:row4 DataRow: id:row5 DataRow: id:row6 DataRow: id:row7 DataRow: id:row8 DataRow: id:row9 DataRow: id:row10 DataRow: id:row11 BoxLayout: orientation:'horizontal' Button: id:run text:'run' on_release:self.parent.parent.click(self) disabled:False Button: id:reset text:'reset' on_release:self.parent.parent.reset() Button: id:fileaddr size_hint_y:None height:'40px' addr:'test_file_addr' text:'select account file' on_release:self.parent.select(self) ''') class SelectFile(BoxLayout): def confirm(self, instance): file = str(instance.selection[0]) self.parent.parent.parent.parent.children[1].fileaddr.addr = file self.parent.parent.parent.dismiss() class GetInfo(object): def __init__(self, txtfile): super(GetInfo, self).__init__() with open(txtfile, 'r', encoding='utf-8') as f: a = f.readlines() f.close() self.accounts = [] for account in a: self.accounts.append(account.strip().split(',')) if len(self.accounts) > 13: self.accounts = self.accounts[:13] self.qty = len(self.accounts) def status(self, Check): for i in range(self.qty): Check.ids['row' + str(i + 2)].name.text = 'pending' Check.ids['row' + str(i + 2)].level.text = 'pending' Check.ids['row' + str(i + 2)].map.text = 'pending' Check.ids['row' + str(i + 2)].attack.text = 'pending' Check.ids['row' + str(i + 2)].warn.text = 'pending' def details(self, Check): self.status(Check) userinfo = [] for user in self.accounts: try: fcsrf = self.getcsrf() time.sleep(1) info = self.getinfo(user, fcsrf) time.sleep(1) except Exception as e: info = '' userinfo.append(eval(info)) results = [] for info in userinfo: try: warn = '' if info['weight'] / info['maxweight'] > 0.5: warn = warn + 'weight,' if int(info['hp']) < 2: warn = warn + 'died,' if info['autoattack'] != 49: warn = warn + 'no auto' if warn == '': warn = 'ok' attack = 'yes_auto' if info['autoattack'] == 49 else 'no_auto' result = [info['name'], info['base_level'], info['last_map'],attack, warn] except Exception: result = [None, None, None, None, None] results.append(result) for i in range(self.qty): try: Check.ids['row'+ str(i+2)].name.text = str(results[i][0]) Check.ids['row'+ str(i+2)].level.text = str(results[i][1]) Check.ids['row'+ str(i+2)].map.text = str(results[i][2]) Check.ids['row'+ str(i+2)].attack.text = str(results[i][3]) Check.ids['row'+ str(i+2)].warn.text = str(results[i][4]) except Exception: Check.ids['row' + str(i+2)].name.text = 'none' Check.ids['row' + str(i+2)].level.text = 'none' Check.ids['row' + str(i+2)].map.text = 'none' Check.ids['row' + str(i+2)].attack.text = 'none' Check.ids['row' + str(i+2)].warn.text = 'none' Check.ids.reset.disabled = False return True def getinfo(self, user, keys): header = { 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7,la;q=0.6,zh-TW;q=0.5', 'AlexaToolbar - ALX_NS_PH': 'AlexaToolbar / alx - 4.0.3', 'Connection': 'keep-alive', 'Cookie': keys[0], 'Content-Length': '125', 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'Host': 'www.zizi.cn', 'Origin': 'http://www.zizi.cn', 'Referer': 'http://www.zizi.cn/?r=mn/index', 'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Mobile Safari/537.36', } url = 'http://www.zizi.cn/?r=mn/search' data = { '_csrf': keys[1], 'Login[userid]': user[0], 'Login[user_pass]': user[1], } response = requests.post(url=url, headers=header, data=data) content = response.content.decode('utf-8') return content def getcsrf(self): url = 'http://www.zizi.cn/?r=mn/index' index = requests.get(url=url) cookie = str(index.cookies) patt = r'\ (.*)\ for' cookie = re.findall(patt, cookie)[0] index = index.content.decode('utf-8') pattern = r'id=\"_csrf\"\ value=\"(.*)\"' csrf = re.findall(pattern, index)[0] return [cookie, csrf] class TitleRow(BoxLayout): pass class DataRow(BoxLayout): pass class Check(BoxLayout): def click(self, obj): file = self.fileaddr.addr t = threading.Thread(target=GetInfo(file).details, args=[self]) t.start() self.ids.reset.disabled = True obj.disabled = True def reset(self): for i in range(10): self.ids['row'+str(i+2)].name.text = '' self.ids['row'+str(i+2)].level.text = '' self.ids['row'+str(i+2)].map.text = '' self.ids['row'+str(i+2)].attack.text = '' self.ids['row'+str(i+2)].warn.text = '' self.ids.run.disabled = False self.fileaddr.addr = '' def select(self, instance): content = SelectFile() self.popup = Popup(title="select file...", content=content,size_hint=(0.9, 0.9)) self.popup.open() class GameRo(App): def build(self): return Check() if __name__ == '__main__': GameRo().run()