TypePHP 编译器
https://swoole.com/aot/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
822 lines
28 KiB
822 lines
28 KiB
#!/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:])
|
|
|