add_report.py 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. # -*- coding: utf-8 -*-
  2. # Author : Charley
  3. # Python : 3.10.8
  4. # Date : 2026/1/29 17:00
  5. """
  6. 1768
  7. """
  8. import requests
  9. from mysql_pool import MySQLConnectionPool
  10. from super_vault_daily_spider import HEADERS
  11. def get_report_single_page(log, page_num, detail_id, token):
  12. """
  13. 获取单页数据
  14. :param log: logger对象
  15. :param page_num: 页码
  16. :param detail_id: 商品id
  17. :param token: token
  18. :return: 数据
  19. """
  20. log.debug(f"正在获取第 {page_num} 页的 <拆卡报告> 数据.................")
  21. # token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJDSEFPWElOWElORyNBUFAiLCJhdWQiOiJDSEFPWElOWElORyIsIm5iZiI6MTc2OTU4MTI5NiwiZGF0YSI6Ijk1MjMiLCJpc3MiOiI3ViNweHlQZSIsImV4cCI6MTc3MDc4MTI5NiwiaWF0IjoxNzY5NTgxMjk2LCJqdGkiOiIyYjkwNzZhMS0wYjU1LTQ0ZjItOGZlZC0yMWZiZmI0ZjUyYWIifQ.iDzTZLDslCP0y2nc2Jp4TGEsNbQiCRKcUeRsIyG3iOg"
  22. url = "https://cxx.cardsvault.net/app/teamup/report/list"
  23. data = {
  24. "pageSize": 20,
  25. "my": 0,
  26. "pageNum": page_num,
  27. # "tid": 1780
  28. "tid": detail_id
  29. }
  30. HEADERS["Authorization"] = token
  31. response = requests.post(url, headers=HEADERS, json=data, timeout=22)
  32. # print(response.text)
  33. response.raise_for_status()
  34. result = response.json()
  35. if result.get("status") == 200:
  36. data = result.get("data", {})
  37. total = data.get("total", 0)
  38. current_page = data.get("pageNum", 1)
  39. items = data.get("data", [])
  40. log.info(f"当前查询的是 ->->-> 第 {current_page} 页,共 {total} 条记录")
  41. log.debug(f"当前页数据数量: {len(items)}")
  42. return {
  43. "total": total,
  44. "current_page": current_page,
  45. "items": items
  46. }
  47. else:
  48. log.error(f"API 返回错误: {result.get('msg', '未知错误')}")
  49. return None
  50. def parse_report_items(log, detail_id, items):
  51. """
  52. 解析列表项
  53. :param log: logger对象
  54. :param detail_id: 商品id
  55. :param items: 列表项
  56. :return: 解析后的列表项
  57. """
  58. parsed_items = []
  59. log.debug(f"正在解析 <拆卡报告> 列表项.................")
  60. for item in items:
  61. userName = item.get("userName")
  62. level = item.get("level")
  63. teamNameCn = item.get("teamNameCn")
  64. teamNameEn = item.get("teamNameEn")
  65. count = item.get("count")
  66. picture_url = item.get("picture", {}).get("url")
  67. alias = item.get("alias") # 别名
  68. createTime = item.get("createTime")
  69. data_dict = {
  70. "pid": detail_id,
  71. "user_name": userName,
  72. "level": level,
  73. "team_name_cn": teamNameCn,
  74. "team_name_en": teamNameEn,
  75. "count": count,
  76. "picture_url": picture_url,
  77. "alias": alias,
  78. "create_time": createTime
  79. }
  80. # print(data_dict)
  81. parsed_items.append(data_dict)
  82. return parsed_items
  83. def get_report_list(log, detail_id, token, sql_pool):
  84. """
  85. 获取列表数据
  86. :param log: logger对象
  87. :param detail_id: 商品id
  88. :param token: token
  89. :param sql_pool: 数据库连接池
  90. """
  91. page_num = 1
  92. total_pages = 99
  93. items_per_page = 20 # pageSize
  94. all_items = []
  95. while page_num <= total_pages:
  96. log.debug(f"正在获取第 {page_num} 页的数据.................")
  97. page_result = get_report_single_page(log, page_num, detail_id, token)
  98. if not page_result:
  99. log.error(f"获取第 {page_num} 页失败 !!!")
  100. break
  101. # 第一次请求时更新真实的总页数
  102. if page_num == 1:
  103. total_count = page_result["total"]
  104. if total_count == 0:
  105. log.info("No new records found.")
  106. # 更改状态为2
  107. # sql_pool.update_one_or_dict(
  108. # table="super_vault_product_record",
  109. # data={"report_state": 2},
  110. # condition={"pid": detail_id}
  111. # )
  112. break
  113. total_pages = (total_count + items_per_page - 1) // items_per_page
  114. log.info(f"总共 {total_pages} 页")
  115. items = parse_report_items(log, detail_id, page_result["items"])
  116. all_items.extend(items)
  117. # sql_pool.update_one_or_dict(
  118. # table="super_vault_product_record",
  119. # data={"report_state": 1},
  120. # condition={"pid": detail_id}
  121. # )
  122. page_num += 1
  123. log.debug(f"所有数据获取完成,共 {len(all_items)} 条记录")
  124. # sql_pool.insert_many(table="super_vault_report_record", data_list=all_items, ignore=True)
  125. # 去重user_name字段 统计参与人数
  126. unique_user_names = len(set(item["user_name"] for item in all_items))
  127. log.info(f"---------------------------------------- 参与人数: {unique_user_names} ----------------------------------------")
  128. if __name__ == '__main__':
  129. from loguru import logger
  130. sql_pool = MySQLConnectionPool(log=logger)
  131. token = sql_pool.select_one("SELECT token FROM super_vault_token")
  132. # sql_detail_id_list = sql_pool.select_all("SELECT pid FROM super_vault_product_record WHERE report_state != 1")
  133. # for detail_id in sql_detail_id_list:
  134. # get_report_list(logger, detail_id[0], token[0], None)
  135. get_report_list(logger, 1774, token[0], sql_pool)