daily_3dos.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. # -*- coding: utf-8 -*-
  2. from odoo import models, fields
  3. from httpx import Client
  4. from concurrent.futures import ThreadPoolExecutor, as_completed
  5. from fake_useragent import UserAgent
  6. from odoo.exceptions import UserError
  7. class Daily3dos(models.Model):
  8. _name = 'daily.3dos'
  9. _description = 'Daily 3dos'
  10. _order = 'id DESC'
  11. name = fields.Char(string='Name', default=fields.datetime.now())
  12. state = fields.Selection([
  13. ('draft', 'Draft'),
  14. ('done', 'Done'),
  15. ], string='State', default='draft')
  16. daily_3dos_line_ids = fields.One2many('daily.3dos.line', 'daily_3dos_id', string='Daily 3dos Lines')
  17. def btn_execute(self):
  18. # 获取所有3DOS账户配置
  19. if self.daily_3dos_line_ids:
  20. all_3dos_account = []
  21. for line in self.daily_3dos_line_ids:
  22. if line.line_state != 'done':
  23. all_3dos_account.append(
  24. self.env['daily.3dos.config'].search([('account', '=', line.account)], limit=1))
  25. else:
  26. all_3dos_account = self.env['daily.3dos.config'].search([('activate', '=', True)])
  27. if not all_3dos_account:
  28. raise UserError('先设置3dos账号!')
  29. # 创建字典, 记录每个账号的领取结果
  30. save_data = {}
  31. with ThreadPoolExecutor(max_workers=len(all_3dos_account)) as executor:
  32. futures = []
  33. for account in all_3dos_account:
  34. email, password = account.account, account.password
  35. futures.append(executor.submit(self.account_handle, email, password))
  36. for future in as_completed(futures):
  37. result = future.result()
  38. if result:
  39. save_data.update(result)
  40. for email, data in save_data.items():
  41. message, state = data
  42. # 判定 line 里面是否 name 是否 等于 email, 如果是, 更新当条数据, 如果不是, 创建数据
  43. email_exists = any(email == line.account for line in self.daily_3dos_line_ids)
  44. if email_exists:
  45. line = self.env['daily.3dos.line'].search([('account', '=', email), ('daily_3dos_id', '=', self.id)])
  46. line.write({
  47. 'line_state': state,
  48. 'message': message,
  49. })
  50. else:
  51. self.env['daily.3dos.line'].create({
  52. 'daily_3dos_id': self.id,
  53. 'line_state': state,
  54. 'account': email,
  55. 'message': message,
  56. })
  57. self.update({'state': 'done'})
  58. def account_handle(self, email, password):
  59. save_data = {}
  60. email = email
  61. password = password
  62. ua = UserAgent()
  63. user_agent = ua.random
  64. client = Client(proxy="http://127.0.0.1:7890")
  65. login_url = "https://api.dashboard.3dos.io/api/auth/login"
  66. login_headers = {
  67. "Accept": "application/json, text/plain, */*",
  68. "Accept-Encoding": "gzip, deflate, br, zstd",
  69. "Accept-Language": "zh-CN,zh;q=0.9",
  70. "Content-Type": "application/json",
  71. "Origin": "https://dashboard.3dos.io",
  72. "Priority": "u=1, i",
  73. "Referer": "https://dashboard.3dos.io/",
  74. "Sec-CH-UA": '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
  75. "Sec-CH-UA-Mobile": "?0",
  76. "Sec-CH-UA-Platform": '"Windows"',
  77. "Sec-Fetch-Dest": "empty",
  78. "Sec-Fetch-Mode": "cors",
  79. "Sec-Fetch-Site": "same-site",
  80. "User-Agent": user_agent
  81. }
  82. login_payload = {
  83. "email": email,
  84. "password": password
  85. }
  86. try:
  87. login_response = client.post(login_url, json=login_payload, headers=login_headers)
  88. except Exception as e:
  89. save_data[email] = [str(f"登录请求失败:{e}"), 'error']
  90. return save_data
  91. if login_response.status_code == 200:
  92. login_data = login_response.json()
  93. data = login_data.get("data")
  94. token = data.get("access_token") or data.get("token")
  95. token_type = data.get("token_type")
  96. if not token or not token_type:
  97. save_data[email] = [f"登录响应中未找到 Token 或 Token 类型!", 'error']
  98. return save_data
  99. authorization_header = f"{token_type} {token}"
  100. else:
  101. save_data[email] = [f"登录失败!状态码:{login_response.status_code}", 'error']
  102. return save_data
  103. options_url = "https://api.dashboard.3dos.io/api/claim-reward"
  104. options_headers = {
  105. "Accept": "*/*",
  106. "Accept-Encoding": "gzip, deflate, br, zstd",
  107. "Accept-Language": "zh-CN,zh;q=0.9",
  108. "Access-Control-Request-Headers": "authorization,cache-control,content-type,expires,pragma",
  109. "Access-Control-Request-Method": "POST",
  110. "Origin": "https://dashboard.3dos.io",
  111. "Priority": "u=1, i",
  112. "Referer": "https://dashboard.3dos.io/",
  113. "Sec-Fetch-Dest": "empty",
  114. "Sec-Fetch-Mode": "cors",
  115. "Sec-Fetch-Site": "same-site",
  116. "User-Agent": user_agent
  117. }
  118. try:
  119. options_response = client.options(options_url, headers=options_headers)
  120. except Exception as e:
  121. save_data[email] = [f"OPTIONS 请求失败:{e}", 'error']
  122. return save_data
  123. claim_url = "https://api.dashboard.3dos.io/api/claim-reward"
  124. claim_headers = {
  125. "Accept": "application/json, text/plain, */*",
  126. "Authorization": authorization_header,
  127. "Cache-Control": "no-cache",
  128. "Content-Type": "application/json",
  129. "Expires": "0",
  130. "Origin": "https://dashboard.3dos.io",
  131. "Pragma": "no-cache",
  132. "Priority": "u=1, i",
  133. "Referer": "https://dashboard.3dos.io/",
  134. "Sec-CH-UA": '"Chromium";v="130", "Google Chrome";v="130", "Not?A_Brand";v="99"',
  135. "Sec-CH-UA-Mobile": "?0",
  136. "Sec-CH-UA-Platform": '"Windows"',
  137. "Sec-Fetch-Dest": "empty",
  138. "Sec-Fetch-Mode": "cors",
  139. "Sec-Fetch-Site": "same-site",
  140. "User-Agent": user_agent
  141. }
  142. claim_payload = {
  143. "id": "daily-reward-api"
  144. }
  145. try:
  146. claim_response = client.post(claim_url, json=claim_payload, headers=claim_headers)
  147. except Exception as e:
  148. save_data[email] = [f"claim-reward 请求失败:{e}", 'error']
  149. return save_data
  150. tmp_message = claim_response.json()
  151. message = tmp_message.get("message")
  152. if claim_response.status_code not in [200, 429]:
  153. save_data[email] = [f"claim 报错: {message}, 状态码{claim_response.status_code}", 'error']
  154. return save_data
  155. save_data[email] = [message, 'done']
  156. print(f"{email}: {message}")
  157. return save_data
  158. class Daily3dosLine(models.Model):
  159. _name = 'daily.3dos.line'
  160. _description = 'Daily 3dos Line'
  161. daily_3dos_id = fields.Many2one('daily.3dos', string='Daily 3dos')
  162. line_state = fields.Selection([
  163. ('draft', 'Draft'),
  164. ('error', 'Error'),
  165. ('done', 'Done'),
  166. ], string='Line State', default='draft')
  167. account = fields.Char(string='Account')
  168. password = fields.Char(string='Password')
  169. message = fields.Char(string='Message')
  170. def btn_execute_single(self):
  171. for retry in range(3):
  172. result = self.daily_3dos_id.account_handle(self.account, self.password)
  173. print(result)
  174. class Daily3dosConfig(models.Model):
  175. _name = 'daily.3dos.config'
  176. _description = 'Daily 3dos Config'
  177. activate = fields.Boolean(string='Activate', default=True)
  178. account = fields.Char(string='Account')
  179. password = fields.Char(string='Password')
  180. description = fields.Text(string='Description')
  181. def btn_init_data(self):
  182. init_data = {
  183. "jack0210_@hotmail.com": "aaaAAA111!!!",
  184. "yujieccyj01@hotmail.com": "aaaAAA111!!!",
  185. "yujieccyj02@hotmail.com": "aaaAAA111!!!",
  186. "yujieccyj03@hotmail.com": "aaaAAA111!!!",
  187. "yujieccyj04@hotmail.com": "aaaAAA111!!!",
  188. "yujieccyj05@hotmail.com": "aaaAAA111!!!",
  189. "yujieccyj06@hotmail.com": "aaaAAA111!!!",
  190. "yujieccyj07@hotmail.com": "aaaAAA111!!!",
  191. "yujieccyj08@hotmail.com": "aaaAAA111!!!",
  192. "yujieccyj09@hotmail.com": "aaaAAA111!!!",
  193. "yujieccyj10@hotmail.com": "aaaAAA111!!!"
  194. }
  195. for account, password in init_data.items():
  196. created = self.search([('account', '=', account)], limit=1)
  197. if not created:
  198. self.create({
  199. 'account': account,
  200. 'password': password
  201. })