From 5e33205ffdaf0a1fc09bf214520848e6c5760fab Mon Sep 17 00:00:00 2001 From: tianfenghan Date: Thu, 28 Dec 2023 17:21:43 +0800 Subject: [PATCH] Update 3 --- cases/break.py | 10 + cases/cmp.py | 13 + cases/global.py | 822 ++++++++++++++++++++++++++++++++++++++++++++++++ conv.php | 234 +++++++++----- 4 files changed, 1002 insertions(+), 77 deletions(-) create mode 100644 cases/break.py create mode 100644 cases/cmp.py create mode 100644 cases/global.py diff --git a/cases/break.py b/cases/break.py new file mode 100644 index 00000000..14bcf043 --- /dev/null +++ b/cases/break.py @@ -0,0 +1,10 @@ +add = "http://c.biancheng.net/python/,http://c.biancheng.net/shell/" +# 一个简单的for循环 +for i in add: + if i == ',': + # 忽略本次循环的剩下语句 + print('\n') + continue + elif i == '.': + break + print(i, end="") diff --git a/cases/cmp.py b/cases/cmp.py new file mode 100644 index 00000000..82929fa1 --- /dev/null +++ b/cases/cmp.py @@ -0,0 +1,13 @@ +import time +import driver +import json + +file_username = 'js' +current_time = time.time() # 获取当前时间 +one_day = 86400 # 定义时间间隔为一天(86400秒) +# 检查是否需要重新获取cookies +if 'last_cookie_time' not in driver.__dict__ or current_time - driver.last_cookie_time >= one_day: + pass + +if 'last_cookie_time' not in driver.__dict__ and current_time - driver.last_cookie_time >= one_day: + pass diff --git a/cases/global.py b/cases/global.py new file mode 100644 index 00000000..c9155f19 --- /dev/null +++ b/cases/global.py @@ -0,0 +1,822 @@ +#!/usr/bin/python +# -*- coding: UTF-8 -*- +from selenium import webdriver +from selenium.webdriver.edge.options import Options +from selenium.webdriver.common.by import By +from selenium.common.exceptions import NoSuchElementException,InvalidArgumentException +from selenium.webdriver import ActionChains +from selenium.webdriver.common.actions.action_builder import ActionBuilder +import json,base64,time,random,hashlib,math,operator,sys,os,sqlite3,_thread,atexit +from PIL import Image +from functools import reduce + +# 程序初始化 +global randarr,game,driver,file_username,sqlite3_cur,isCreateImage,isCityWar,isLog,runUsername +isLog = False +isCityWar = False +isCreateImage = False +isGarrisonQueueRand = True +randarr = {} + +# ----------------程序功能函数库--------------- +def mkdirs(dirs): + if not os.path.exists(dirs): + os.makedirs(dirs) + +def ocr(path): + pass + # ocr = PaddleOCR(enable_mkldnn=True,use_angle_cls=False,use_gpu=False, lang="ch") + # result = ocr.ocr(path, cls=False) + # return result +def connetctDb(): + global sqlite3_cur + sqlite3_conn = sqlite3.connect('data/ttapp.db') + print ("sqlite3数据库连接成功") + sqlite3_cur = sqlite3_conn.cursor() +def initDb(): + global sqlite3_cur,isLog + if isLog: + connetctDb() + try: + create_tb_cmd=''' + CREATE TABLE IF NOT EXISTS game_resource_grain_data_log + (id INTEGER PRIMARY KEY AUTOINCREMENT, + uid TEXT NOT NULL, + estimated_quantity INTEGER NOT NULL, + quantity INTEGER NOT NULL, + create_time INTEGER NOT NULL + ); + ''' + sqlite3_cur.execute(create_tb_cmd) + create_tb_cmd=''' + CREATE TABLE IF NOT EXISTS game_resource_timber_data_log + (id INTEGER PRIMARY KEY AUTOINCREMENT, + uid TEXT NOT NULL, + estimated_quantity INTEGER NOT NULL, + quantity INTEGER NOT NULL, + create_time INTEGER NOT NULL + ); + ''' + sqlite3_cur.execute(create_tb_cmd) + create_tb_cmd=''' + CREATE TABLE IF NOT EXISTS game_resource_stone_data_log + (id INTEGER PRIMARY KEY AUTOINCREMENT, + uid TEXT NOT NULL, + estimated_quantity INTEGER NOT NULL, + quantity INTEGER NOT NULL, + create_time INTEGER NOT NULL + ); + ''' + sqlite3_cur.execute(create_tb_cmd) + create_tb_cmd=''' + CREATE TABLE IF NOT EXISTS game_resource_iron_data_log + (id INTEGER PRIMARY KEY AUTOINCREMENT, + uid TEXT NOT NULL, + estimated_quantity INTEGER NOT NULL, + quantity INTEGER NOT NULL, + create_time INTEGER NOT NULL + ); + ''' + #主要就是上面的语句 + sqlite3_cur.execute(create_tb_cmd) + except Exception as err: + print("Create table failed") + print(err) + return False +def init(): + global driver,runUsername + mkdirs('data') + mkdirs('runtime/temp') + initDb() + options = Options() + # prefs = {'download.default_directory' : '/dev/null', + # 'download.prompt_for_download': False, + # 'download.directory_upgrade': True, + # 'safebrowsing.enabled': True} + # options.add_experimental_option('prefs', prefs) + options.add_experimental_option("excludeSwitches",["enable-automation"]) + options.add_experimental_option("useAutomationExtension",False) + options.add_argument("--allow-reporter-logs=false") + options.add_argument('--disable-dev-shm-usage') + options.add_argument('--disable-blink-features=AutomationControlled') + if sys.platform == 'linux': + # options.add_argument("--disable-gpu") + # options.add_argument('--no-sandbox') + # options.add_argument('--user-data-dir=./'+file_username) + pass + driver = webdriver.Edge(options=options) + driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { + "source": """ + Object.defineProperty(navigator, 'webdriver', { + get: () => undefined + }) + """ + }) + # driver.set_window_size(700, 950) + driver.set_window_size(700, 950) + driver.implicitly_wait(30) + driver.get("https://www.huya.com/myfollow") + with open(file_username+'.cookies.json', 'r') as cookies_file: + cookies_data = json.load(cookies_file) + for cookie in cookies_data: + driver.add_cookie(cookie) + + # runUsername = driver.get_cookie('username')['value'] + runUsername = '' + +# 流程第一步刷新页面 +def refresh(time = 15,initOneLoad = False): + driver.get('https://www.huya.com/16695719') + if initOneLoad: + driver.find_element(By.ID,'player-gift-word').click() + find_element_game() + wait(time,'程序加载中。。。') + +# 找到Canvas +def find_element_game(): + driver.find_element(By.CSS_SELECTOR,'.more-activity-icon').click() + driver.find_element(By.ID,'front-0cenz7bj_web_video_com').click() + app = driver.find_element(By.CSS_SELECTOR,'.videoComp-90808de0[style="width: 566px; height: 788px; top: 50%; left: 50%;"]') + driver.switch_to.frame(app.find_element(By.CSS_SELECTOR,'iframe')) + driver.switch_to.frame(driver.find_element(By.CSS_SELECTOR,'body > iframe')) + global game + game = driver.find_element(By.ID,'GameCanvas') + +# 等待游戏加载 +def wait(n,msg=''): + for i in range(0,n): + time.sleep(1) + print (msg+str(i+1)+'s') + +# take_element_screenshot +def take_element_screenshot(path=''): + name = '' + if path != '': + name = str(random.randint(11,999999999)) + runtimename = 'runtime'+os.sep+path+'Screenshot'+name+'.'+file_username+'.png'; + screenshotjs = ''' + let callback = arguments[arguments.length - 1]; + cc.director.on(cc.Director.EVENT_AFTER_DRAW, () => { + // 获取画布元素 + let gameCanvas = document.getElementById("GameCanvas") + // 图片转换为(base64)dataURL + let imagebase64 = gameCanvas.toDataURL() + // 取消渲染注册 + cc.director.off(cc.Director.EVENT_AFTER_DRAW) + callback(imagebase64) + }) + ''' + screenshot = driver.execute_async_script(screenshotjs) + screenshot = screenshot.replace('data:image/png;base64,','') + screenshot = base64.urlsafe_b64decode(screenshot) + with open(runtimename, "wb") as screenshot_file: + screenshot_file.write(screenshot) + return runtimename +def load_config(): + with open(file_username+'.config.json', 'r') as config_file: + config = json.load(config_file) + return config +def random_game_type(config): + global randarr + sha256 = hashlib.sha256() + sha256.update(str(config).encode('utf-8')) + key = sha256.hexdigest() + print(key) + max = 0 + if not key in randarr: + randarr.update({key:[]}) + print(config.values()) + for temp in config.values(): + max += float(temp) + for k,v in config.items(): + v = float(v)/max*10000 + + for val in range(0,int(v)): + # print(k) + randarr[key].append(k) + + return randarr[key][random.randint(0,len(randarr[key]))] +def actions_game_click(x,y,time = 1): + global driver,game + w = 283 + h = 394 + if x == w: + x = 0 + else: + x = x-w + if y == h: + y = 0 + else: + y = y-h + + # action = ActionBuilder(driver) + # action.pointer_action.move_to_location(x,y)\ + # .click() + # action.perform() + ActionChains(driver)\ + .move_to_element_with_offset(game, x, y)\ + .click()\ + .perform() + wait(time,'操作等待。。') +def page_drag(x,y,x1,y1): + # 鼠标拖动页面 + action_builder = ActionBuilder(driver) + action_builder.pointer_action.move_to_location(x,y).click_and_hold() + action_builder.pointer_action.move_to_location(x1,y1) + action_builder.key_action.pause() + action_builder.pointer_action.release() + action_builder.key_action.pause() + action_builder.perform() +def image_compare(image1,image2): + ''' + :param pic1: 图片1路径 + :param pic2: 图片2路径 + :return: 返回对比的结果 + ''' + histogram1 = image1.histogram() + histogram2 = image2.histogram() + + differ = math.sqrt(reduce(operator.add, list(map(lambda a,b: (a-b)**2,histogram1, histogram2)))/len(histogram1)) + print('图片相识度',differ) + return differ < 15.0 + +def image_crop(path,w,h,x1,y1): + ''' + :param path: 图片1路径 + :param w: 宽度 + :param h: 高度 + :param x1: x坐标 + :param y1: y坐标 + :return: 返回对比的结果 + ''' + im = Image.open(path) + #crop(x1,y1,x2,y2) 裁剪的是矩形 左上(x1,y1) 到右下(x2,y2) + cropim = im.crop((x1, y1, x1+w, y1+h)) + # cropim.save("cropim.png") + global isCreateImage + if isCreateImage: + cropim.save(path) + return cropim + +def check_equal(runtimename,name,w,h,x1,y1): + cropim = image_crop(runtimename,w,h,x1,y1) + name = 'static'+ os.sep + name + im = Image.open(name) + return image_compare(im,cropim) +def ocr_list(cropim): + runtimename = 'runtime/ScreenshotCropOcr.'+file_username+'.png' + cropim.save(runtimename) + result = ocr(runtimename) + temp = [] + for line in result: + temp.append(line[1][0]) + return temp +def check_equal_ocr(runtimename,w,h,x1,y1): + cropim = image_crop(runtimename,w,h,x1,y1) + return ocr_list(cropim) + +# --------------------------业务动作函数库-------------------------- +yyy = 45 # 不同的显示偏移 +def home_resource_points(): + actions_game_click(35,597+25+yyy) + print('当前函数:',sys._getframe().f_code.co_name) + +def resource_points_ok(): + actions_game_click(267-67,543+25+yyy) + print('当前函数:',sys._getframe().f_code.co_name) + +def resource_points_my(): + actions_game_click(106-67,189+25+yyy) + print('当前函数:',sys._getframe().f_code.co_name) + +def resource_points_snatch(): + actions_game_click(117-67,264+25+yyy) + print('当前函数:',sys._getframe().f_code.co_name) + +def resource_points_farmland_garrison(t=3): + actions_game_click(500-67,146+25+yyy,t) + print('当前函数:',sys._getframe().f_code.co_name) + +def resource_points_logging_yard_garrison(t=3): + actions_game_click(500-67,193+25+yyy,t) + print('当前函数:',sys._getframe().f_code.co_name) + +def resource_points_quarry_garrison(t=3): + actions_game_click(500-67,245+25+yyy,t) + print('当前函数:',sys._getframe().f_code.co_name) + +def resource_points_iron_ore_stationed(t=3): + actions_game_click(500-67,291+25+yyy,t) + print('当前函数:',sys._getframe().f_code.co_name) + +def go_resource_points(): + actions_game_click(100-67,95+25+yyy) + print('当前函数:',sys._getframe().f_code.co_name) + +def resource_points_details_close(): + actions_game_click(555-67,35+25+yyy) + print('当前函数:',sys._getframe().f_code.co_name) + +def resource_points_details_garrison(): + actions_game_click(345-67,571+25+yyy) + print('当前函数:',sys._getframe().f_code.co_name) + +def resource_points_details_obtain_ok(): + actions_game_click(345-67,525+25+yyy) + print('当前函数:',sys._getframe().f_code.co_name) +def resource_points_next_page(): + # 资源列表下一页 + page_drag(343-67,564+25+yyy,343-67,564+25+yyy-260) +def resource_points_pre_page(): + # 资源列表上一页 + page_drag(343-67,330+25+yyy,343-67,330+25+yyy+260) +def resource_points_ok2(): + actions_game_click(488-67,543+25+yyy) + print('当前函数:',sys._getframe().f_code.co_name) +def resource_points_ok3(): + # 起始位为默认位置 否则使用resource_points_ok + resource_points_next_page() + actions_game_click(267-67,543+25+yyy) + print('当前函数:',sys._getframe().f_code.co_name) +# 首页王城入口 +def city_home(): + actions_game_click(43,188,3) + print('当前函数:',sys._getframe().f_code.co_name) +# 关闭王城说明 +def city_close_say(): + actions_game_click(531,158,3) + print('当前函数:',sys._getframe().f_code.co_name) +# 展开王城资源列表 +def city_open_resource_list(): + actions_game_click(516,277) + print('当前函数:',sys._getframe().f_code.co_name) +# 一键收取王城资源 +def city_one_key_resource_list(): + actions_game_click(416,649) + print('当前函数:',sys._getframe().f_code.co_name) +def city_go_home(): + actions_game_click(31,31) + print('当前函数:',sys._getframe().f_code.co_name) +# --------------------------业务函数库----------------------------- +def ok_over(): + resource_points_snatch() + resource_points_my() + +def check_garrison(): + runtimename = take_element_screenshot() + result = check_equal(runtimename,'noGarrisonCompare.png',360, 32,103,304) + # os.remove(runtimename) + print('当前函数:',sys._getframe().f_code.co_name) + return result +def check_garrison_idle_barracks(): + runtimename = take_element_screenshot() + result = check_equal(runtimename,'noIdleBarracksCompare.png',50,25,420,180) + # os.remove(runtimename) + print('当前函数:',sys._getframe().f_code.co_name) + return result + +def check_garrison_has_idle_barracks(): + runtimename = take_element_screenshot() + result = check_equal(runtimename,'IdleBarracksCompare.png',50,25,420,180) + # os.remove(runtimename) + print('当前函数:',sys._getframe().f_code.co_name) + return result +def check_garrison_has_or_no_idle_barracks(): + runtimename = take_element_screenshot() + result = False + if check_equal(runtimename,'noIdleBarracksCompare.png',50,25,420,180): + result = 1 + elif check_equal(runtimename,'IdleBarracksCompare.png',50,25,420,180): + result = 2 + # os.remove(runtimename) + print('当前函数:',sys._getframe().f_code.co_name) + return result +def check_resource_points_not_stationed(): + runtimename = take_element_screenshot() + result = check_equal(runtimename,'ResourcePointsAreNotStationedAtThisTimeCompare.png',115, 65,110,410) + # os.remove(runtimename) + print('当前函数:',sys._getframe().f_code.co_name) + return result + +def check_resource_points_cancel(): + runtimename = take_element_screenshot() + result = check_equal(runtimename,'CancelGarrisonCompare.png',73, 20,198,599) + # os.remove(runtimename) + print('当前函数:',sys._getframe().f_code.co_name) + return result +def check_resource_points_ok(): + runtimename = take_element_screenshot() + result = check_equal(runtimename,'okGarrisonCompare.png',60, 20,157,599) + # os.remove(runtimename) + print('当前函数:',sys._getframe().f_code.co_name) + return result +def check_resource_points_ok2(): + runtimename = take_element_screenshot() + result = check_equal(runtimename,'okGarrisonCompare2.png',73, 20,198,599) + # os.remove(runtimename) + print('当前函数:',sys._getframe().f_code.co_name) + return result +def check_resource_points_has_ok(): + runtimename = take_element_screenshot() + if check_equal(runtimename,'okGarrisonCompare.png',60, 20,157,599): + result = 1 + elif check_equal(runtimename,'okGarrisonCompare2.png',73, 20,198,599): + result = 2 + elif check_equal(runtimename,'CancelGarrisonCompare.png',73, 20,198,599): + result = 3 + else: + result = False + # os.remove(runtimename) + print('当前函数:',sys._getframe().f_code.co_name) + return result +def check_resource_points_details_cancel(): + runtimename = take_element_screenshot() + result = check_equal(runtimename,'CancelGarrisonCompare2.png',70, 28,196,624) + # os.remove(runtimename) + print('当前函数:',sys._getframe().f_code.co_name) + return result +def check_resource_points_page(): + runtimename = take_element_screenshot() + result = check_equal(runtimename,'resourcePointsPage.png',238,60,20,205) + # os.remove(runtimename) + print('当前函数:',sys._getframe().f_code.co_name) + return result + +def over_garrison_xy(xy=0): + if xy == 0: + resource_points_ok() + elif xy==1: + resource_points_ok2() + elif xy==2: + resource_points_ok3() + else: + pass +# 取消驻守 +def over_garrison(n = 1,xy= 0): + i = 0 + while i < n: + print('取消驻守循环:',i,'-',n) + if not check_resource_points_page(): + refresh() + home_resource_points() + if check_resource_points_not_stationed(): + # 是否有资源驻守 + print('未有驻守的资源点1') + return False + result = check_resource_points_has_ok() + print('xxxxxxx',result,'xxxxxxx') + if result == 1: + over_garrison_xy(xy) + if check_resource_points_ok(): + continue + elif result == 2: + over_garrison_xy(xy) + if check_resource_points_ok2(): + continue + elif result == 3: + over_garrison_xy(xy) + resource_points_details_garrison() + if check_resource_points_details_cancel(): + resource_points_details_close() + continue + else: + if check_resource_points_not_stationed(): + print('未有驻守的资源点2') + return False + if check_resource_points_details_cancel(): + resource_points_details_close() + continue + resource_points_details_obtain_ok() + i += 1 +# 驻守 +def run_garrison(n = 1,types = ''): + i = 0 + step = 0 + sleep = 3 + if isGarrisonQueueRand == False: + type = random_game_type(types) + print('本轮驻守类型'+type) + while i < n: + if isGarrisonQueueRand: + type = random_game_type(types) + print('本轮该兵营驻守类型'+type) + type = int(type) + if type == 1: + resource_points_farmland_garrison(sleep) + elif type == 2: + resource_points_logging_yard_garrison(sleep) + elif type == 3: + resource_points_quarry_garrison(sleep) + elif type == 4: + resource_points_iron_ore_stationed(sleep) + else: + print('资源类型判断失败') + if check_resource_points_page(): + print('------0----信息更新-----') + continue + + if not check_garrison(): + # 有人占了 没有到资源点详情 + print('------1----check_garrison-----') + step = step + 1 + # 临时处理 页面空白情况 等待延迟到6秒 + sleep = sleep * 2 + if sleep > 6: + sleep = 6 + if step > 10: + take_element_screenshot('temp'+os.sep) + refresh() + home_resource_points() + step = 0 + continue + resource_points_details_close() + go_resource_points() + continue + resource_points_details_garrison() + if check_garrison(): + # true 表示 卡住了 有人占了 + print('------2----check_garrison-----') + resource_points_details_close() + go_resource_points() + continue + resource_points_details_garrison() + res = check_garrison_has_or_no_idle_barracks() + if res == 1: + # 驻守中 + resource_points_details_close() + elif res == 2: + # 空闲 有人驻守了 跳出循环重新选资源 + resource_points_details_close() + go_resource_points() + continue + else: + pass + go_resource_points() + if check_resource_points_page(): + print('-------go home----------') + else: + print('-------go home fail reload go home ----------') + go_resource_points() + + sleep = 3 + i = i+1 + +#一键 王城 +def resource_one_key_king_over(): + # 关掉资源页 + resource_points_details_close() + # 进入王城争夺 + city_home() + # 关闭说明 + city_close_say() + # 展开占领资源 + city_open_resource_list() + # 一键领取 + city_one_key_resource_list() + resource_points_details_obtain_ok() + city_go_home() + home_resource_points() + pass + +def resource_points_xy_screenshot_ocr(filename,xy=0): + if xy == 0: + cropim = image_crop(filename,180,230,100,400) + else: + cropim = image_crop(filename,337,30,120,140) + return ocr_list(cropim) +def check_resource_points_over(n=1,t=1,times=0): + i = 0 + temp = n + # 更新游戏截图 + filename = take_element_screenshot() + while i < n: + if i < 2: + result = resource_points_xy_screenshot_ocr(filename,i) + if '收取' in result: + over_garrison(n=1,xy=i) + filename = take_element_screenshot() + n-=1 + else: + i+=1 + else: + resource_points_next_page() + filename = take_element_screenshot() + result = resource_points_xy_screenshot_ocr(filename,0) + if '收取' in result: + over_garrison(n=1,xy=0) + n-=1 + else: + i+=1 + ok_over() + # 根据 n 剩余等待时间 开始补充驻守 + if temp-n > 0 and times > 60*3: + run_garrison(temp-n,t) + +def check_over_resource_points_thread(msg,n=1,type=1,times= 0): + print('OCR截图检测线程',n,type,msg) + check_resource_points_over(n,type,times) + print('OCR截图检测线程结束') + +# -----------------------主程序--------------------------- +def run_image(name='run'): + global file_username,isCityWar,driver,game,isCreateImage + file_username = name + isCreateImage = True + init() + refresh(5) + home_resource_points() + ok_over() + # ---------------------------- + # check_resource_points_page() + # check_resource_points_not_stationed() + # check_resource_points_ok() + # check_resource_points_ok2() + # ---------------------------- + resource_points_farmland_garrison() + # ----------------------------- + check_garrison() + # ----------------------------- + # resource_points_details_garrison() + # ---------------------------- + # check_garrison_has_idle_barracks() + # check_garrison_idle_barracks() + # ---------------------------- + # resource_points_details_close() + # go_resource_points() + # ---------------------------- + # check_resource_points_cancel() + # ---------------------------- + # resource_points_ok() + # ------------------------ + # check_resource_points_details_cancel() + # ------------------------ + # resource_points_details_garrison() + # resource_points_details_obtain_ok() + pass + +def run(numberOfBarracks = 1,type = '',times = 600): + global isCityWar,isLog,file_username + if not check_resource_points_page(): + refresh() + home_resource_points() + ok_over() + over_garrison(numberOfBarracks) + run_garrison(numberOfBarracks,type) + if isLog: + over_nums_log() + if isCityWar: + resource_one_key_king_over() + + # 休眠开始写入时间 + timeFileName = file_username + '.runtime' + startSleepTime = int(round(time.time() * 1000)) + endSleepTime = startSleepTime + (times*1000) + timeFile = str(startSleepTime) + ',' + str(endSleepTime) + with open(timeFileName, "wb") as timeFile_file: + timeFile_file.write(timeFile.encode('utf-8')) + # 更新 cookies + current_time = time.time() # 获取当前时间 + one_day = 86400 # 定义时间间隔为一天(86400秒) + # 检查是否需要重新获取cookies + if 'last_cookie_time' not in driver.__dict__ or current_time - driver.last_cookie_time >= one_day: + # 更新cookies + cookies = driver.get_cookies() + if cookies: + cookies = json.dumps(cookies) + with open(file_username + '.cookies.json', 'wb') as cookies_file: + cookies_file.write(cookies.encode('utf-8')) + + # 更新最后获取cookie的时间 + driver.last_cookie_time = current_time + # 休眠 + for i in range(0,times): + # 取10 并且不等于0 + # if i > 0 and not i%60: + # 截图进行检测 + # print('开启线程截图检测') + # _thread.start_new_thread(check_over_resource_points_thread,('thread-check_over_resource_points-1',numberOfBarracks,type,i,)) + time.sleep(1) + print (file_username+'程序休眠中。。。'+str(i+1)+'s') + # 休眠结束写入时间 + timeFile = ''; + with open(timeFileName, "wb") as timeFile_file: + timeFile_file.write(timeFile.encode('utf-8')) +def over_nums_log(): + global runUsername + sqlite3_conn = sqlite3.connect('data/ttapp.db') + print ("sqlite3数据库连接成功") + sqlite3_cur = sqlite3_conn.cursor() + runtimename = take_element_screenshot() + cropim = image_crop(runtimename,566,88,0,700) + runtimename = 'runtime/ScreenshotCropOcr.'+file_username+'.png' + cropim.save(runtimename) + reslut = ocr(runtimename) + # print (reslut) + temp = [] + for line in reslut: + if not line[1][0] == '+' and not line[1][0] == '旅': + temp.append(line[1][0]) + print (temp) + t = time.time() + t = int(t) + try: + sql='''INSERT INTO game_resource_grain_data_log (uid,estimated_quantity,quantity,create_time) VALUES ('%s',0,%s,%s);''' + sql = sql % (runUsername,temp[0],t) + print(sql) + sqlite3_cur.execute(sql) + sql='''INSERT INTO game_resource_timber_data_log (uid,estimated_quantity,quantity,create_time) VALUES ('%s',0,%s,%s);''' + sql = sql % (runUsername,temp[1],t) + print(sql) + sqlite3_cur.execute(sql) + sql='''INSERT INTO game_resource_stone_data_log (`uid`,`estimated_quantity`,`quantity`,`create_time`) VALUES ('%s',0,%s,%s);''' + sql = sql % (runUsername,temp[2],t) + print(sql) + sqlite3_cur.execute(sql) + sql = '''INSERT INTO game_resource_iron_data_log (`uid`,`estimated_quantity`,`quantity`,`create_time`) VALUES ('%s',0,%s,%s);''' + sql = sql % (runUsername,temp[3],t) + print(sql) + sqlite3_cur.execute(sql) + sqlite3_conn.commit() + except Exception as e: + print('资源数据记录',e) +def run_game_shell(name = 'run'): + global file_username,isCityWar + file_username = name + init() + initOneLoad = True + if sys.platform == 'linux': + initOneLoad = False + refresh(15,initOneLoad) + home_resource_points() + while True: + # 每次循环 重新加载配置 + config = load_config() + # + isCityWar = config['cityWar']['isOpen'] + type = config['arr'] + if 'isGarrisonQueueRand' in config: + isGarrisonQueueRand = config['isGarrisonQueueRand'] + try: + run(config['numberOfBarracks'],type,config['time']) + except Exception as err: + print(err) + refresh() + wait(30) + home_resource_points() + continue; +def login(name='run'): + options = Options() + global driver + driver = webdriver.Edge(options=options) + driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", { + "source": """ + Object.defineProperty(navigator, 'webdriver', { + get: () => undefined + }) + """ + }) + driver.implicitly_wait(10) + driver.get('https://www.huya.com/myfollow') + wait(100,'请在倒计时结束前完成登录。。。') + cookies = driver.get_cookies() + if not cookies == []: + cookies = json.dumps(cookies) + with open(name+'.cookies.json', 'wb') as cookies_file: + cookies_file.write(cookies.encode('utf-8')) + configPath = name+'.config.json' + if not os.path.exists(configPath): + configtext = '''{"arr":{"1":"0.1","2":"0.1","3":"0.1","4":"0.1"},"numberOfBarracks":3,"time":840,"cityWar":{"isOpen":false}}''' + with open(configPath, 'wb') as cookies_file: + cookies_file.write(configtext.encode('utf-8')) + + driver.quit() + +@atexit.register +def cleanExit(): + timeFile = sys.argv[1:][0] + '.runtime' + if os.path.exists(timeFile): + os.unlink(timeFile) + +def main(argv): + print(argv) + if not argv == [] and argv[0] == 'login': + print('login ...') + if len(argv) > 1: + login(argv[1]) + else: + login() + print('login over') + elif not argv == [] and argv[0] == 'image': + run_image(argv[1]) + pass + else: + print('rungame ...') + if len(argv) == 1: + run_game_shell(argv[0]) + elif len(argv) == 2: + global isCreateImage + isCreateImage = True + run_game_shell(argv[0]) + else: + print('not give argv') +main(sys.argv[1:]) diff --git a/conv.php b/conv.php index 7573db6b..5cc303c9 100644 --- a/conv.php +++ b/conv.php @@ -4,6 +4,8 @@ if ($argc < 2) { } define('DEBUG', getenv('PY2PHP_DEBUG')); +define('STEP', getenv('PY2PHP_STEP')); + $py_script = __DIR__ . '/dump.py'; $result = shell_exec('python ' . $py_script . ' ' . $argv[1]); $json = json_decode($result); @@ -272,6 +274,8 @@ class Translator return $this->parseIfExp($value); case 'Yield': return $this->parseYield($value); + case 'Lambda': + return $this->parseLambda($value); default: debug($value); break; @@ -357,6 +361,8 @@ class Translator return $this->parseTest($target); case 'Slice': return $this->parseSlice($target); + case 'BoolOp': + return $this->parseBoolOp($target); default: debug($target); break; @@ -404,12 +410,21 @@ class Translator function parseTest($test) { - $left = $this->parseValue($test->left); - $ops = $test->ops; - $comparators = $test->comparators; - - $op = $ops[0]->_type; - $comparator = $comparators[0]; + $comparator = null; + $left = $test->left ? $this->parseValue($test->left) : ''; + if ($test->ops) { + $ops = $test->ops; + if (count($ops) != 1) { + debug($test); + } + $op = $ops[0]->_type; + $comparators = $test->comparators; + $comparator = $comparators[0]; + } elseif ($test->op) { + $op = $test->op->_type; + } else { + $op = ''; + } switch ($op) { case 'Is': @@ -419,6 +434,8 @@ class Translator return $left . ' != ' . $this->parseValue($comparator); case 'In': return $this->parseValue($comparator) . '->__contains__(' . $left . ')'; + case 'NotIn': + return '!' . $this->parseValue($comparator) . '->__contains__(' . $left . ')'; case 'Gt': return $left . ' > ' . $this->parseValue($comparator); case 'Lt': @@ -427,8 +444,14 @@ class Translator return $left . ' >= ' . $this->parseValue($comparator); case 'LtE': return $left . ' <= ' . $this->parseValue($comparator); + case 'Not': + return '!' . $this->parseValue($test->operand); + case 'Or': + return $this->parseOr($test->values); + case 'And': + return $this->parseAnd($test->values); default: - debug($test); + return $this->parseTarget($test); } } @@ -512,86 +535,104 @@ class Translator private function addLine($line, array &$lines) { - if ($this->mode == 'cli') { -// echo $line . PHP_EOL; + if ($this->mode == 'cli' && STEP) { + echo $line . PHP_EOL; } $lines[] = $line; } + private function parseLine($node, &$lines) + { + switch ($node->_type) { + case 'ImportFrom': + $line = $this->parseImportFrom($node) . ';'; + break; + case 'Assign': + $target = $this->parseTarget($node->targets[0]); + $value = $this->parseValue($node->value); + if ($node->targets[0]->_type == 'Subscript') { + $this->addLine('$__value = ' . $value . ';', $lines); + $line = "$target;"; + } else { + $line = "$target = $value;"; + } + break; + case 'AugAssign': + $target = $this->parseTarget($node->target); + $value = $this->parseValue($node->value); + $line = "$target += $value;"; + break; + case 'Import': + $line = $this->parseImport($node) . ';'; + break; + case 'Expr': + $line = $this->parseExpr($node); + break; + case 'FunctionDef': + $line = $this->parseFunctionDef($node); + break; + case 'Return': + $line = $this->parseReturn($node) . ';'; + break; + case 'If': + $line = $this->parseIf($node); + break; + case 'For': + $line = $this->parseFor($node); + break; + case 'While': + $line = $this->parseWhile($node); + break; + case 'Try': + $line = $this->parseTry($node); + break; + case 'Raise': + $line = $this->parseRaise($node) . ';'; + break; + case 'Subscript': + $line = $this->parseSubscript($node) . ';'; + break; + case 'With': + $line = $this->parseWith($node); + break; + case 'Compare': + $line = $this->parseTest($node); + break; + case 'Delete': + $line = $this->parseDelete($node); + break; + case 'Continue': + $line = $this->parseContinue($node) . ';'; + break; + case 'Break': + $line = $this->parseBreak($node) . ';'; + break; + case 'Global': + $line = $this->parseGlobal($node) . ';'; + break; + case 'Pass': + $line = $this->parsePass($node) . ';'; + break; + case 'BinOp': + $line = $this->parseBinOp($node) . ';'; + break; + default: + debug($node); + $line = ''; + break; + } + $this->addLine($line, $lines); + } + function parseBody($tree) { $lines = []; foreach ($tree as $node) { - switch ($node->_type) { - case 'ImportFrom': - $line = $this->parseImportFrom($node) . ';'; - break; - case 'Assign': - $target = $this->parseTarget($node->targets[0]); - $value = $this->parseValue($node->value); - if ($node->targets[0]->_type == 'Subscript') { - $this->addLine('$__value = ' . $value . ';', $lines); - $line = "$target;"; - } else { - $line = "$target = $value;"; - } - break; - case 'AugAssign': - $target = $this->parseTarget($node->target); - $value = $this->parseValue($node->value); - $line = "$target += $value;"; - break; - case 'Import': - $line = $this->parseImport($node) . ';'; - break; - case 'Expr': - $line = $this->parseExpr($node); - break; - case 'FunctionDef': - $line = $this->parseFunctionDef($node); - break; - case 'Return': - $line = $this->parseReturn($node) . ';'; - break; - case 'If': - $line = $this->parseIf($node); - break; - case 'For': - $line = $this->parseFor($node); - break; - case 'While': - $line = $this->parseWhile($node); - break; - case 'Try': - $line = $this->parseTry($node); - break; - case 'Raise': - $line = $this->parseRaise($node) . ';'; - break; - case 'Subscript': - $line = $this->parseSubscript($node) . ';'; - break; - case 'With': - $line = $this->parseWith($node); - break; - case 'Compare': - $line = $this->parseTest($node); - break; - case 'Delete': - $line = $this->parseDelete($node); - break; - default: - debug($node); - $line = ''; - break; - } - $this->addLine($line, $lines); + $this->parseLine($node, $lines); } - foreach ($lines as &$line) { $line = $this->getIndent() . $line; } - return implode(PHP_EOL, $lines); } @@ -743,7 +784,7 @@ class Translator foreach ($values as $v) { $targets[] = $this->parseTarget($v); } - return implode(' && ', $targets); + return implode(' and ', $targets); } private function parseOr($values) @@ -752,7 +793,7 @@ class Translator foreach ($values as $v) { $targets[] = $this->parseTarget($v); } - return implode(' || ', $targets); + return implode(' or ', $targets); } private function parseDelete(mixed $node) @@ -841,6 +882,45 @@ class Translator { return '$' . $value->id; } + + private function parseContinue(mixed $node) + { + return 'continue'; + } + + private function parseBreak(mixed $node) + { + return 'break'; + } + + private function parseGlobal(mixed $node) + { + $names = []; + foreach ($node->names as $name) { + $names[] = '$' . $name; + } + return 'global ' . implode(', ', $names); + } + + private function parsePass(mixed $node) + { + return 'return'; + } + + private function parseLambda($value) + { + $lines = []; + $args = $this->parseArguments($value->args); + $code = 'function (' . $args . ') {' . PHP_EOL; + $this->indentLevel++; + $this->parseLine($value->body, $lines); + $this->indentLevel--; + if (count($lines) != 1) { + debug($value); + } + $code = 'return ' . $lines[0] . PHP_EOL; + return $code . PHP_EOL . $this->getIndent() . '}'; + } } error_reporting(E_ERROR);