米画师.py 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import tkinter as tk
  2. from tkinter import scrolledtext, messagebox
  3. import requests
  4. import threading
  5. import time
  6. import json
  7. class PurchaseApp:
  8. def __init__(self, root):
  9. self.root = root
  10. self.root.title("米画师商品购买工具")
  11. self.root.geometry("600x500")
  12. self.running = False
  13. self.stop_flag = False
  14. self.setup_ui()
  15. def setup_ui(self):
  16. # 密码输入框
  17. tk.Label(self.root, text="支付密码:").pack(pady=5)
  18. self.password_entry = tk.Entry(self.root, show="*", width=50)
  19. self.password_entry.pack(pady=5)
  20. # 商品ID输入框
  21. tk.Label(self.root, text="商品ID:").pack(pady=5)
  22. self.product_id_entry = tk.Entry(self.root, width=50)
  23. self.product_id_entry.pack(pady=5)
  24. # 按钮框架
  25. button_frame = tk.Frame(self.root)
  26. button_frame.pack(pady=20)
  27. self.start_button = tk.Button(button_frame, text="启动", command=self.start_request,
  28. bg="green", fg="white", width=10)
  29. self.start_button.pack(side=tk.LEFT, padx=10)
  30. self.stop_button = tk.Button(button_frame, text="停止", command=self.stop_request,
  31. bg="red", fg="white", width=10, state=tk.DISABLED)
  32. self.stop_button.pack(side=tk.LEFT, padx=10)
  33. # 日志框架
  34. tk.Label(self.root, text="请求日志:").pack(pady=5)
  35. self.log_text = scrolledtext.ScrolledText(self.root, width=70, height=20,
  36. wrap=tk.WORD)
  37. self.log_text.pack(pady=5, padx=10, fill=tk.BOTH, expand=True)
  38. def log_message(self, message, is_error=False):
  39. """在日志框中添加消息"""
  40. timestamp = time.strftime("%Y-%m-%d %H:%M:%S")
  41. tag = "ERROR" if is_error else "INFO"
  42. log_entry = f"[{timestamp}] [{tag}] {message}\n"
  43. self.log_text.insert(tk.END, log_entry)
  44. self.log_text.see(tk.END)
  45. # 如果是错误消息,用红色显示
  46. if is_error:
  47. start_idx = self.log_text.index(f"end-{len(log_entry)}c")
  48. end_idx = self.log_text.index("end-1c")
  49. self.log_text.tag_add("error", start_idx, end_idx)
  50. self.log_text.tag_config("error", foreground="red")
  51. def make_request(self, product_id, pay_password):
  52. """执行单次请求"""
  53. url = f"https://www.mihuashi.com/api/v1/manufactures/{product_id}/purchase"
  54. # 构建请求数据
  55. payload = f"pay_password={pay_password}&remember_token=xxrohSdEFqQSt0fNY1mh4k&specification_ids%5B%5D=3931"
  56. headers = {
  57. "content-type": "application/x-www-form-urlencoded",
  58. "baggage": "sentry-environment=production,sentry-public_key=afa52c0802b4441ba513fb25cb6bc20a,sentry-release=com.mihuashi.iOS%408.7.1%2B231,sentry-trace_id=a0ac9f45d3f74b51b387a345b0d95389",
  59. "x-track-trans-data": "CiQ4N2Q4NTRmOS02ZTQ4LTQ3YmMtOGIwYy1mMzRhY2U2Yzg4YTUSFQoMaG90XzE2NzY0X3YyFQDAr0QYHRISCggxNjc3OF92MhVgU9G+GNcBGhAKCTE1NzU4OmN0ch0A0l09GhAKCTE1NzU4OmN2ch0AyLg5IgAq1wIhC3L415YlBiR6vAJ7ImFwaV9yZXFfdGltZSI6MTc4MTI1MDQ2NCwic3BtXzMiOiLmjqjojZAiLCJzcG1fMiI6Iuapseeqly3mnI3orr4m5rC05Y2wIiwicGFnZV9udW0iOjEsImFiX3ZlcnNpb24iOiIiLCJzcG0iOiLnsbPnlLvluIgkIyMk5qmx56qXLeacjeiuvibmsLTljbAkIyMk5o6o6I2QIiwiY2xvc2VfcGVyc29uYWxpemVkX3JlYyI6ZmFsc2UsImJodl90aW1lIjoiMTc4MTI1MDQ2NCIsImJodl90aW1lX2hvdXIiOiIxNSIsImJodl90aW1lX21vbnRoZGF5IjoiMTIiLCJiaHZfdGltZV93ZWVrZGF5IjoiNSIsImZha2VfY29udGV4dF9pZCI6ImZha2VfY29udGV4dF9pZCJ9sAEOygEGNzY3NDY00AEy",
  60. "sensor-id": "96F047C1-773B-4596-BA8F-EB8E3D08D404",
  61. "authorization": "Bearer xxrohSdEFqQSt0fNY1mh4k",
  62. "x-track-volc-extra": '{"recall_list":"hot_16764_v2,16778_v2","doc_type":"manufacture","status":"1","tags":"","score":"0.00001649724435992539"}',
  63. "accept": "*/*",
  64. "priority": "u=3, i",
  65. "x-track-spm": "%E7%B1%B3%E7%94%BB%E5%B8%88$%23%23$%E6%9C%8D%E8%AE%BE&%E6%B0%B4%E5%8D%B0$%23%23$%E8%AF%A6%E6%83%85%E9%A1%B5$%23%23$12",
  66. "accept-language": "zh-Hans-AU;q=1, en-AU;q=0.9",
  67. "sentry-trace": "a0ac9f45d3f74b51b387a345b0d95389-2b3cdabdb84741e4-0",
  68. "x-network-type": "wifi",
  69. "user-agent": "MHSIPhoneApp/8.7.1 (iPhone; iOS 26.5; Scale/3.00; iPhone15,4)",
  70. "cookie": "aliyungf_tc=c3e9536bffb022b57059d7436f69e970c3ced15034d620e006be4582617a4e9e",
  71. "Accept-Encoding": "gzip, deflate, br",
  72. "Connection": "keep-alive"
  73. }
  74. try:
  75. response = requests.request("POST", url, data=payload, headers=headers, timeout=10)
  76. # 尝试解析JSON响应
  77. try:
  78. response_json = response.json()
  79. formatted_response = json.dumps(response_json, ensure_ascii=False, indent=2)
  80. except:
  81. formatted_response = response.text
  82. self.log_message(f"请求URL: {url}")
  83. self.log_message(f"响应状态码: {response.status_code}")
  84. self.log_message(f"响应内容: {formatted_response[:500]}") # 限制显示长度
  85. if response.status_code == 200:
  86. self.log_message("请求成功")
  87. else:
  88. self.log_message(f"请求失败,状态码: {response.status_code}", is_error=True)
  89. except requests.exceptions.Timeout:
  90. self.log_message("请求超时", is_error=True)
  91. except requests.exceptions.ConnectionError:
  92. self.log_message("连接错误,请检查网络", is_error=True)
  93. except Exception as e:
  94. self.log_message(f"请求异常: {str(e)}", is_error=True)
  95. def request_loop(self):
  96. """请求循环,每2秒执行一次"""
  97. product_id = self.product_id_entry.get().strip()
  98. pay_password = self.password_entry.get()
  99. # 验证输入
  100. if not product_id:
  101. self.log_message("请输入商品ID", is_error=True)
  102. self.stop_request()
  103. return
  104. if not pay_password:
  105. self.log_message("请输入支付密码", is_error=True)
  106. self.stop_request()
  107. return
  108. # 验证商品ID是否为数字
  109. try:
  110. int(product_id)
  111. except ValueError:
  112. self.log_message("商品ID必须是数字", is_error=True)
  113. self.stop_request()
  114. return
  115. self.log_message(f"开始请求循环,商品ID: {product_id}")
  116. while self.running and not self.stop_flag:
  117. self.make_request(product_id, pay_password)
  118. # 等待2秒,但每秒检查一次停止标志
  119. for _ in range(2):
  120. if not self.running or self.stop_flag:
  121. break
  122. time.sleep(1)
  123. self.log_message("请求循环已停止")
  124. def start_request(self):
  125. """启动请求线程"""
  126. # 验证输入
  127. if not self.password_entry.get():
  128. messagebox.showwarning("警告", "请输入支付密码")
  129. return
  130. if not self.product_id_entry.get():
  131. messagebox.showwarning("警告", "请输入商品ID")
  132. return
  133. self.running = True
  134. self.stop_flag = False
  135. # 更新按钮状态
  136. self.start_button.config(state=tk.DISABLED)
  137. self.stop_button.config(state=tk.NORMAL)
  138. # 启动请求线程
  139. self.request_thread = threading.Thread(target=self.request_loop, daemon=True)
  140. self.request_thread.start()
  141. def stop_request(self):
  142. """停止请求"""
  143. self.running = False
  144. self.stop_flag = True
  145. # 更新按钮状态
  146. self.start_button.config(state=tk.NORMAL)
  147. self.stop_button.config(state=tk.DISABLED)
  148. def main():
  149. root = tk.Tk()
  150. app = PurchaseApp(root)
  151. root.mainloop()
  152. if __name__ == "__main__":
  153. main()