# -*- coding: utf-8 -*- # Author : Charley # Python : 3.10.8 # Date : 2026/1/29 17:00 """ 1768 """ import requests from mysql_pool import MySQLConnectionPool from super_vault_daily_spider import HEADERS def get_report_single_page(log, page_num, detail_id, token): """ 获取单页数据 :param log: logger对象 :param page_num: 页码 :param detail_id: 商品id :param token: token :return: 数据 """ log.debug(f"正在获取第 {page_num} 页的 <拆卡报告> 数据.................") # token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJDSEFPWElOWElORyNBUFAiLCJhdWQiOiJDSEFPWElOWElORyIsIm5iZiI6MTc2OTU4MTI5NiwiZGF0YSI6Ijk1MjMiLCJpc3MiOiI3ViNweHlQZSIsImV4cCI6MTc3MDc4MTI5NiwiaWF0IjoxNzY5NTgxMjk2LCJqdGkiOiIyYjkwNzZhMS0wYjU1LTQ0ZjItOGZlZC0yMWZiZmI0ZjUyYWIifQ.iDzTZLDslCP0y2nc2Jp4TGEsNbQiCRKcUeRsIyG3iOg" url = "https://cxx.cardsvault.net/app/teamup/report/list" data = { "pageSize": 20, "my": 0, "pageNum": page_num, # "tid": 1780 "tid": detail_id } HEADERS["Authorization"] = token response = requests.post(url, headers=HEADERS, json=data, timeout=22) # print(response.text) response.raise_for_status() result = response.json() if result.get("status") == 200: data = result.get("data", {}) total = data.get("total", 0) current_page = data.get("pageNum", 1) items = data.get("data", []) log.info(f"当前查询的是 ->->-> 第 {current_page} 页,共 {total} 条记录") log.debug(f"当前页数据数量: {len(items)}") return { "total": total, "current_page": current_page, "items": items } else: log.error(f"API 返回错误: {result.get('msg', '未知错误')}") return None def parse_report_items(log, detail_id, items): """ 解析列表项 :param log: logger对象 :param detail_id: 商品id :param items: 列表项 :return: 解析后的列表项 """ parsed_items = [] log.debug(f"正在解析 <拆卡报告> 列表项.................") for item in items: userName = item.get("userName") level = item.get("level") teamNameCn = item.get("teamNameCn") teamNameEn = item.get("teamNameEn") count = item.get("count") picture_url = item.get("picture", {}).get("url") alias = item.get("alias") # 别名 createTime = item.get("createTime") data_dict = { "pid": detail_id, "user_name": userName, "level": level, "team_name_cn": teamNameCn, "team_name_en": teamNameEn, "count": count, "picture_url": picture_url, "alias": alias, "create_time": createTime } # print(data_dict) parsed_items.append(data_dict) return parsed_items def get_report_list(log, detail_id, token, sql_pool): """ 获取列表数据 :param log: logger对象 :param detail_id: 商品id :param token: token :param sql_pool: 数据库连接池 """ page_num = 1 total_pages = 99 items_per_page = 20 # pageSize all_items = [] while page_num <= total_pages: log.debug(f"正在获取第 {page_num} 页的数据.................") page_result = get_report_single_page(log, page_num, detail_id, token) if not page_result: log.error(f"获取第 {page_num} 页失败 !!!") break # 第一次请求时更新真实的总页数 if page_num == 1: total_count = page_result["total"] if total_count == 0: log.info("No new records found.") # 更改状态为2 # sql_pool.update_one_or_dict( # table="super_vault_product_record", # data={"report_state": 2}, # condition={"pid": detail_id} # ) break total_pages = (total_count + items_per_page - 1) // items_per_page log.info(f"总共 {total_pages} 页") items = parse_report_items(log, detail_id, page_result["items"]) all_items.extend(items) # sql_pool.update_one_or_dict( # table="super_vault_product_record", # data={"report_state": 1}, # condition={"pid": detail_id} # ) page_num += 1 log.debug(f"所有数据获取完成,共 {len(all_items)} 条记录") # sql_pool.insert_many(table="super_vault_report_record", data_list=all_items, ignore=True) # 去重user_name字段 统计参与人数 unique_user_names = len(set(item["user_name"] for item in all_items)) log.info(f"---------------------------------------- 参与人数: {unique_user_names} ----------------------------------------") if __name__ == '__main__': from loguru import logger sql_pool = MySQLConnectionPool(log=logger) token = sql_pool.select_one("SELECT token FROM super_vault_token") # sql_detail_id_list = sql_pool.select_all("SELECT pid FROM super_vault_product_record WHERE report_state != 1") # for detail_id in sql_detail_id_list: # get_report_list(logger, detail_id[0], token[0], None) get_report_list(logger, 1774, token[0], sql_pool)