|
@@ -1,20 +1,22 @@
|
|
|
import hashlib
|
|
|
import json
|
|
|
-import signal
|
|
|
+import threading
|
|
|
import time
|
|
|
import tkinter
|
|
|
import uuid
|
|
|
-from time import sleep
|
|
|
+from datetime import datetime
|
|
|
from tkinter import messagebox
|
|
|
|
|
|
import requests
|
|
|
|
|
|
+from db.sql_lite import init_global_db_connection, close_global_db_connection, get_global_db_connection
|
|
|
+from logic.logic_batch_task_create import open_batch_task_create_win
|
|
|
+from logic.logic_batch_task_detail import open_batch_task_detail_win
|
|
|
+from service.batch_task import BatchTaskService
|
|
|
from service.ui import WinGUI
|
|
|
-from wcferry import Wcf
|
|
|
|
|
|
from config import load_config, conf
|
|
|
-from service.robot import Robot
|
|
|
-
|
|
|
+from service.robot import init_robot, get_robot
|
|
|
|
|
|
|
|
|
class Win(WinGUI):
|
|
@@ -22,13 +24,18 @@ class Win(WinGUI):
|
|
|
super().__init__()
|
|
|
self.__event_bind()
|
|
|
self.__style_config()
|
|
|
- self.robot = None
|
|
|
+ self.selection_batch_task_id = None
|
|
|
+ self._batch_task_service = BatchTaskService()
|
|
|
|
|
|
def __event_bind(self):
|
|
|
- self.tk_button_save.bind('<Button-1>', self.save_event)
|
|
|
- self.tk_button_start.bind('<Button-1>', self.start_event)
|
|
|
- self.tk_button_pause.bind('<Button-1>', self.stop_event)
|
|
|
- self.tk_button_version.bind('<Button-1>', self.version_event)
|
|
|
+ self.tk_tabs_main_tabs.tk_tabs_main_tabs_0.tk_button_save.bind('<Button-1>', self.save_event)
|
|
|
+ self.tk_tabs_main_tabs.tk_tabs_main_tabs_0.tk_button_start.bind('<Button-1>', self.start_event)
|
|
|
+ self.tk_tabs_main_tabs.tk_tabs_main_tabs_0.tk_button_pause.bind('<Button-1>', self.stop_event)
|
|
|
+ self.tk_tabs_main_tabs.tk_tabs_main_tabs_0.tk_button_version.bind('<Button-1>', self.version_event)
|
|
|
+ self.tk_tabs_main_tabs.tk_tabs_main_tabs_1.tk_button_create.bind('<Button-1>', self.batch_task_create_event)
|
|
|
+ self.tk_tabs_main_tabs.tk_tabs_main_tabs_1.tk_table_batch_task_list.bind('<Double-1>', self.batch_task_detail_event)
|
|
|
+ self.tk_tabs_main_tabs.tk_tabs_main_tabs_1.tk_table_batch_task_list.bind('<Button-1>',self.just_click_event)
|
|
|
+ self.tk_tabs_main_tabs.tk_tabs_main_tabs_1.tk_table_batch_task_list.bind('<Button-3>',self.batch_task_action_event)
|
|
|
pass
|
|
|
|
|
|
def __style_config(self):
|
|
@@ -38,14 +45,15 @@ class Win(WinGUI):
|
|
|
messagebox.showinfo('版本信息', '当前版本:v1.0.0')
|
|
|
|
|
|
def stop_event(self, event):
|
|
|
-
|
|
|
- if self.tk_button_pause.cget('state') == tkinter.DISABLED:
|
|
|
+ self._batch_task_service.stop_task()
|
|
|
+ if self.tk_tabs_main_tabs.tk_tabs_main_tabs_0.tk_button_pause.cget('state') == tkinter.DISABLED:
|
|
|
return
|
|
|
-
|
|
|
- self.robot.wcf.cleanup()
|
|
|
- self.robot = None
|
|
|
- self.tk_button_start.config(state=tkinter.NORMAL)
|
|
|
- self.tk_button_pause.config(state=tkinter.DISABLED)
|
|
|
+ robot = get_robot()
|
|
|
+ if robot is not None:
|
|
|
+ robot.wcf.cleanup()
|
|
|
+ robot = None
|
|
|
+ self.tk_tabs_main_tabs.tk_tabs_main_tabs_0.tk_button_start.config(state=tkinter.NORMAL)
|
|
|
+ self.tk_tabs_main_tabs.tk_tabs_main_tabs_0.tk_button_pause.config(state=tkinter.DISABLED)
|
|
|
messagebox.showinfo('提示', '助手已停止运行!')
|
|
|
|
|
|
@staticmethod
|
|
@@ -61,14 +69,12 @@ class Win(WinGUI):
|
|
|
"mac": str(mac)
|
|
|
})
|
|
|
|
|
|
-
|
|
|
headers = {
|
|
|
'Content-Type': 'application/json'
|
|
|
}
|
|
|
|
|
|
response = requests.request("POST", url, headers=headers, data=payload)
|
|
|
|
|
|
-
|
|
|
if response.status_code == 200:
|
|
|
resp = json.loads(response.text)
|
|
|
|
|
@@ -92,16 +98,14 @@ class Win(WinGUI):
|
|
|
md5_hash.update(str(mac).encode('utf-8'))
|
|
|
md5_mac = md5_hash.hexdigest()
|
|
|
|
|
|
-
|
|
|
md5_hash = hashlib.md5()
|
|
|
md5_hash.update(str(timestamp).encode('utf-8'))
|
|
|
md5_timestamp = md5_hash.hexdigest()
|
|
|
|
|
|
md5_hash = hashlib.md5()
|
|
|
- md5_hash.update((md5_token+md5_mac+md5_timestamp).encode('utf-8'))
|
|
|
+ md5_hash.update((md5_token + md5_mac + md5_timestamp).encode('utf-8'))
|
|
|
md5_sign = md5_hash.hexdigest()
|
|
|
|
|
|
-
|
|
|
if md5_sign != sign:
|
|
|
messagebox.showerror('错误', 'token验证失败!')
|
|
|
return False
|
|
@@ -109,7 +113,8 @@ class Win(WinGUI):
|
|
|
return True
|
|
|
|
|
|
else:
|
|
|
- messagebox.showerror('错误', 'token已失效 或 与当前设备未绑定,每个token只能绑定一台设备!请填入和当前设备绑定的token,或者获取新的token!')
|
|
|
+ messagebox.showerror('错误',
|
|
|
+ 'token已失效 或 与当前设备未绑定,每个token只能绑定一台设备!请填入和当前设备绑定的token,或者获取新的token!')
|
|
|
return False
|
|
|
else:
|
|
|
messagebox.showerror('错误', '您的网络状态异常!请稍候重试')
|
|
@@ -117,36 +122,68 @@ class Win(WinGUI):
|
|
|
|
|
|
def start_event(self, event):
|
|
|
|
|
|
- if self.tk_button_start.cget('state') == tkinter.DISABLED:
|
|
|
- return
|
|
|
-
|
|
|
- if not self.check_token():
|
|
|
+ if self.tk_tabs_main_tabs.tk_tabs_main_tabs_0.tk_button_start.cget('state') == tkinter.DISABLED:
|
|
|
return
|
|
|
|
|
|
- wcf = Wcf(debug=conf().get("debug", False))
|
|
|
- def handler(sig, frame):
|
|
|
- wcf.cleanup() # 退出前清理环境
|
|
|
- exit(0)
|
|
|
- signal.signal(signal.SIGINT, handler)
|
|
|
-
|
|
|
- self.robot = Robot(conf(), wcf)
|
|
|
+ # if not self.check_token():
|
|
|
+ # return
|
|
|
|
|
|
# 接收消息
|
|
|
# robot.enableRecvMsg() # 可能会丢消息?
|
|
|
- self.robot.enableReceivingMsg() # 加队列
|
|
|
+ robot = get_robot()
|
|
|
+ robot.enableReceivingMsg() # 加队列
|
|
|
|
|
|
- if self.robot.wcf.is_login():
|
|
|
- self.tk_button_start.config(state='disabled')
|
|
|
- self.tk_button_pause.config(state='normal')
|
|
|
+ if robot.wcf.is_login():
|
|
|
+ self.tk_tabs_main_tabs.tk_tabs_main_tabs_0.tk_button_start.config(state='disabled')
|
|
|
+ self.tk_tabs_main_tabs.tk_tabs_main_tabs_0.tk_button_pause.config(state='normal')
|
|
|
messagebox.showinfo('提示', '助手开始运行!')
|
|
|
+ self._batch_task_service.start_task()
|
|
|
+
|
|
|
+ wx_wxid = robot.wcf.get_self_wxid()
|
|
|
+ connection = get_global_db_connection()
|
|
|
+ cursor = connection.cursor()
|
|
|
+
|
|
|
+ def refresh_list():
|
|
|
+ query = "SELECT * FROM batch_task WHERE wx_wxid = ? ORDER BY created_at DESC"
|
|
|
+ # 执行查询
|
|
|
+ cursor.execute(query, (wx_wxid,))
|
|
|
+
|
|
|
+ # 获取查询结果
|
|
|
+ results = cursor.fetchall()
|
|
|
+ batch_tasks = []
|
|
|
+ for result in results:
|
|
|
+ if result[2] == 1:
|
|
|
+ status = "等待中"
|
|
|
+ elif result[2] == 2:
|
|
|
+ status = "已开始"
|
|
|
+ elif result[2] == 3:
|
|
|
+ status = "已停止"
|
|
|
+ else:
|
|
|
+ status = "未知"
|
|
|
+ created_at = datetime.fromtimestamp(result[1]).strftime("%Y-%m-%d %H:%M:%S")
|
|
|
+ batch_tasks.append((result[0], created_at, status, f"{result[6] + result[7]}/{result[5]}", result[7], result[4]))
|
|
|
+ # 清空列表
|
|
|
+ self.tk_tabs_main_tabs.tk_tabs_main_tabs_1.tk_table_batch_task_list.delete(*self.tk_tabs_main_tabs.tk_tabs_main_tabs_1.tk_table_batch_task_list.get_children())
|
|
|
+
|
|
|
+ for values in batch_tasks:
|
|
|
+ self.tk_tabs_main_tabs.tk_tabs_main_tabs_1.tk_table_batch_task_list.insert('', "end", iid=values[0], values=values[1:])
|
|
|
+ if values[0] == self.selection_batch_task_id:
|
|
|
+ self.tk_tabs_main_tabs.tk_tabs_main_tabs_1.tk_table_batch_task_list.selection_set(values[0])
|
|
|
+
|
|
|
+
|
|
|
+ # 每 3秒调用一次这个函数
|
|
|
+ print("refresh_list")
|
|
|
+ self.tk_tabs_main_tabs.after(3000, refresh_list)
|
|
|
+
|
|
|
+ self.tk_tabs_main_tabs.after(0, refresh_list)
|
|
|
|
|
|
# robot.keepRunningAndBlockProcess()
|
|
|
|
|
|
def save_event(self, event):
|
|
|
conf().update({
|
|
|
- "api_base":self.tk_input_api_base.get(),
|
|
|
- "api_key":self.tk_input_api_key.get(),
|
|
|
- "token":self.tk_input_token.get()
|
|
|
+ "api_base": self.tk_tabs_main_tabs.tk_tabs_main_tabs_0.tk_input_api_base.get(),
|
|
|
+ "api_key": self.tk_tabs_main_tabs.tk_tabs_main_tabs_0.tk_input_api_key.get(),
|
|
|
+ "token": self.tk_tabs_main_tabs.tk_tabs_main_tabs_0.tk_input_token.get()
|
|
|
})
|
|
|
# 将字典写入 JSON 文件
|
|
|
with open('config.json', 'w') as json_file:
|
|
@@ -154,13 +191,72 @@ class Win(WinGUI):
|
|
|
|
|
|
messagebox.showinfo('提示', '保存文件成功!')
|
|
|
|
|
|
+ def batch_task_create_event(self, event):
|
|
|
+ # win_batch_task_create = WinGUIBatchTaskCreate()
|
|
|
+ # win_batch_task_create.mainloop()
|
|
|
+ open_batch_task_create_win()
|
|
|
+
|
|
|
+ def batch_task_detail_event(self, event):
|
|
|
+ # 获取双击项的标识符
|
|
|
+ item_id = self.tk_tabs_main_tabs.tk_tabs_main_tabs_1.tk_table_batch_task_list.identify_row(event.y)
|
|
|
+ # 获取该项的值
|
|
|
+ item_values = self.tk_tabs_main_tabs.tk_tabs_main_tabs_1.tk_table_batch_task_list.item(item_id, "values")
|
|
|
+ # print("Double-clicked item:", item_values)
|
|
|
+ if len(item_values) > 0:
|
|
|
+ self.selection_batch_task_id = int(item_id)
|
|
|
+ open_batch_task_detail_win(int(item_id), item_values)
|
|
|
+ else:
|
|
|
+ self.selection_batch_task_id = None
|
|
|
+
|
|
|
+ def batch_task_action_event(self, event):
|
|
|
+ # 获取右键项的标识符
|
|
|
+ item_id = self.tk_tabs_main_tabs.tk_tabs_main_tabs_1.tk_table_batch_task_list.identify_row(event.y)
|
|
|
+ print(f"Right-clicked item: {item_id}")
|
|
|
+ self.tk_tabs_main_tabs.tk_tabs_main_tabs_1.tk_table_batch_task_list.selection_set(item_id)
|
|
|
+ # 获取该项的值
|
|
|
+ item_values = self.tk_tabs_main_tabs.tk_tabs_main_tabs_1.tk_table_batch_task_list.item(item_id, "values")
|
|
|
+ if len(item_values) > 0:
|
|
|
+ self.selection_batch_task_id = int(item_id)
|
|
|
+
|
|
|
+ # print("Right-clicked item:", item_values)
|
|
|
+
|
|
|
+ # 创建菜单
|
|
|
+ menu = tkinter.Menu(self.tk_tabs_main_tabs.tk_tabs_main_tabs_1.tk_table_batch_task_list, tearoff=0)
|
|
|
+ menu.add_command(label="查看详情", command=lambda: self.batch_task_detail_event(event))
|
|
|
+ if item_values[1] == "等待中" or item_values[1] == "已开始":
|
|
|
+ menu.add_command(label="停止", command=lambda: self.batch_task_detail_event(event))
|
|
|
+ elif item_values[1] == "已停止":
|
|
|
+ menu.add_command(label="开始", command=lambda: self.batch_task_detail_event(event))
|
|
|
+ menu.post(event.x_root, event.y_root)
|
|
|
+ else:
|
|
|
+ self.selection_batch_task_id = None
|
|
|
+
|
|
|
+ def just_click_event(self, event):
|
|
|
+ item_id = self.tk_tabs_main_tabs.tk_tabs_main_tabs_1.tk_table_batch_task_list.identify_row(event.y)
|
|
|
+ self.tk_tabs_main_tabs.tk_tabs_main_tabs_1.tk_table_batch_task_list.selection_set(item_id)
|
|
|
+ item_values = self.tk_tabs_main_tabs.tk_tabs_main_tabs_1.tk_table_batch_task_list.item(item_id, "values")
|
|
|
+ if len(item_values) > 0:
|
|
|
+ self.selection_batch_task_id = int(item_id)
|
|
|
+ else:
|
|
|
+ self.selection_batch_task_id = None
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
def main():
|
|
|
load_config()
|
|
|
|
|
|
- win = Win()
|
|
|
- win.mainloop()
|
|
|
+ # 初始化sql_lite
|
|
|
+ init_global_db_connection()
|
|
|
|
|
|
+ # 初始化 wcf
|
|
|
+ init_robot()
|
|
|
|
|
|
+ try:
|
|
|
+ win = Win()
|
|
|
+ win.mainloop()
|
|
|
+ finally:
|
|
|
+ close_global_db_connection()
|
|
|
|
|
|
# wcf = Wcf(debug=conf().get("debug", False))
|
|
|
#
|
|
@@ -180,7 +276,6 @@ def main():
|
|
|
# robot.keepRunningAndBlockProcess()
|
|
|
|
|
|
|
|
|
-
|
|
|
# Press the green button in the gutter to run the script.
|
|
|
if __name__ == '__main__':
|
|
|
- main()
|
|
|
+ main()
|