main.py 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import hashlib
  2. import json
  3. import os
  4. import signal
  5. import tempfile
  6. import time
  7. import tkinter
  8. import uuid
  9. from time import sleep
  10. from tkinter import messagebox
  11. import requests
  12. from common.hardware import Hardware
  13. from common.log import logger
  14. from service.socket_client import SocketClient
  15. from service.ui import WinGUI
  16. from wcferry import Wcf
  17. from config import load_config, conf
  18. from service.robot import Robot
  19. class Win(WinGUI):
  20. def __init__(self):
  21. super().__init__()
  22. self.__event_bind()
  23. self.__style_config()
  24. self.robot = None
  25. def __event_bind(self):
  26. # self.tk_button_save.bind('<Button-1>', self.save_event)
  27. self.tk_button_start.bind('<Button-1>', self.start_event)
  28. self.tk_button_pause.bind('<Button-1>', self.stop_event)
  29. self.tk_button_version.bind('<Button-1>', self.version_event)
  30. pass
  31. def __style_config(self):
  32. pass
  33. def version_event(self, event):
  34. messagebox.showinfo('版本信息', '当前版本:v2.0.4')
  35. def stop_event(self, event):
  36. if self.tk_button_pause.cget('state') == tkinter.DISABLED:
  37. return
  38. self.robot.wcf.cleanup()
  39. self.robot = None
  40. self.tk_button_start.config(state=tkinter.NORMAL)
  41. self.tk_button_pause.config(state=tkinter.DISABLED)
  42. messagebox.showinfo('提示', '助手已停止运行!')
  43. @staticmethod
  44. def check_token(token:str):
  45. # 获取当前网卡mac地址
  46. merchine_code = Hardware.get_machine_code()
  47. mac = "PC-"+str(merchine_code)
  48. url = "https://wxadminapi.gkscrm.com/wechat-api/token/check"
  49. payload = json.dumps({
  50. "token": token,
  51. "mac": str(mac)
  52. },indent=4)
  53. headers = {
  54. 'Content-Type': 'application/json'
  55. }
  56. logger.info(f"token:{payload}")
  57. response = requests.request("POST", url, headers=headers, data=payload)
  58. if response.status_code == 200:
  59. resp = json.loads(response.text)
  60. if resp['valid'] == True:
  61. sign = resp['sign']
  62. timestamp = resp['timestamp']
  63. # 获取当前unix时间戳
  64. current_timestamp = int(time.time())
  65. if abs(current_timestamp - int(timestamp)) > 180:
  66. messagebox.showerror('错误', '验证失败!请重试')
  67. return False
  68. # 创建一个MD5哈希对象
  69. md5_hash = hashlib.md5()
  70. # 更新哈希对象
  71. md5_hash.update(token.encode('utf-8'))
  72. # 获取十六进制格式的MD5哈希值
  73. md5_token = md5_hash.hexdigest()
  74. md5_hash = hashlib.md5()
  75. md5_hash.update(str(mac).encode('utf-8'))
  76. md5_mac = md5_hash.hexdigest()
  77. md5_hash = hashlib.md5()
  78. md5_hash.update(str(timestamp).encode('utf-8'))
  79. md5_timestamp = md5_hash.hexdigest()
  80. md5_hash = hashlib.md5()
  81. md5_hash.update((md5_token+md5_mac+md5_timestamp).encode('utf-8'))
  82. md5_sign = md5_hash.hexdigest()
  83. if md5_sign != sign:
  84. messagebox.showerror('错误', 'token验证失败!')
  85. return False
  86. return True
  87. else:
  88. messagebox.showerror('错误', 'token已失效 或 与当前设备未绑定,每个token只能绑定一台设备!请填入和当前设备绑定的token,或者获取新的token!')
  89. return False
  90. else:
  91. messagebox.showerror('错误', '您的网络状态异常!请稍候重试')
  92. return False
  93. def start_event(self, event):
  94. if self.tk_button_start.cget('state') == tkinter.DISABLED:
  95. return
  96. # 检查token
  97. if not self.check_token(str(self.tk_input_token.get())):
  98. return
  99. wcf = Wcf(debug=conf().get("debug", False))
  100. def handler(sig, frame):
  101. wcf.cleanup() # 退出前清理环境
  102. exit(0)
  103. signal.signal(signal.SIGINT, handler)
  104. self.robot = Robot(conf(), wcf)
  105. if self.robot.wcf.is_login():
  106. # 开启socket 连接
  107. self.sc = SocketClient(self.robot)
  108. self.tk_button_start.config(state='disabled')
  109. self.tk_button_pause.config(state='normal')
  110. messagebox.showinfo('提示', '助手开始运行!')
  111. # robot.keepRunningAndBlockProcess()
  112. def save_event(self, event):
  113. conf().update({
  114. "api_base":self.tk_input_api_base.get(),
  115. "api_key":self.tk_input_api_key.get(),
  116. "token":self.tk_input_token.get()
  117. })
  118. # 将字典写入 JSON 文件
  119. with open('config.json', 'w') as json_file:
  120. json.dump(conf(), json_file, indent=4)
  121. messagebox.showinfo('提示', '保存文件成功!')
  122. def main():
  123. # load_config()
  124. win = Win()
  125. win.mainloop()
  126. # wcf = Wcf(debug=conf().get("debug", False))
  127. #
  128. # def handler(sig, frame):
  129. # wcf.cleanup() # 退出前清理环境
  130. # exit(0)
  131. #
  132. # signal.signal(signal.SIGINT, handler)
  133. #
  134. # robot = Robot(conf(), wcf)
  135. #
  136. # # 接收消息
  137. # # robot.enableRecvMsg() # 可能会丢消息?
  138. # robot.enableReceivingMsg() # 加队列
  139. #
  140. #
  141. # robot.keepRunningAndBlockProcess()
  142. # Press the green button in the gutter to run the script.
  143. if __name__ == '__main__':
  144. main()