grab_golden_batch.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. # -*- coding: utf-8 -*-
  2. """批量抓取线上 PHP 黄金样本(商家后台 read 类接口)。
  3. 注意 URL 形式:?s=/store/<controller>.<sub>/<action>
  4. 控制器在 app/store/controller 下,如
  5. app/store/controller/Store.php -> /store/store/info
  6. app/store/controller/store/Menu.php -> /store/store.menu/list
  7. app/store/controller/goods/Service.php-> /store/goods.service/list
  8. 用法:
  9. python grab_golden_batch.py # 抓取全部
  10. python grab_golden_batch.py /store/store/info # 只抓指定接口
  11. """
  12. import re
  13. import sys
  14. import json
  15. import requests
  16. from pathlib import Path
  17. GOLDEN = Path(r"C:\Users\Administrator\WorkBuddy\2026-10-17-12-27-10\java-rewrite\golden")
  18. GOLDEN.mkdir(exist_ok=True)
  19. BASE = "https://shop.qinys.cn/index.php?s="
  20. TARGETS = [
  21. ("/store/store/info", "store_info", None),
  22. ("/store/store.menu/list", "store_menu_list", None),
  23. ("/store/store.role/list", "store_role_list", {"page": 1, "listRows": 15}),
  24. ("/store/store.user/list", "store_user_list", {"page": 1, "listRows": 15}),
  25. ("/store/store.address/all", "store_address_all", None),
  26. ("/store/category/list", "category_list", None),
  27. ("/store/goods.service/list", "goods_service_list", {"page": 1, "listRows": 15}),
  28. ("/store/goods.service/all", "goods_service_all", None),
  29. ("/store/goods.comment/list", "goods_comment_list", {"page": 1, "listRows": 15}),
  30. ("/store/files/list", "files_list", {"page": 1, "listRows": 15}),
  31. ("/store/files.group/list", "files_group_list", None),
  32. ("/store/region/all", "region_all", None),
  33. ("/store/region/tree", "region_tree", None),
  34. ("/store/user/list", "user_list", {"page": 1, "listRows": 15}),
  35. ("/store/user.grade/all", "user_grade_all", None),
  36. ("/store/order/list", "order_list", {"page": 1, "listRows": 15, "dataType": "all"}),
  37. ("/store/order.delivery/list", "order_delivery_list", {"page": 1, "listRows": 15}),
  38. ("/store/order.refund/list", "order_refund_list", {"page": 1, "listRows": 15, "dataType": "all"}),
  39. ("/store/setting/detail", "setting_detail", {"key": "store"}),
  40. ("/store/setting.cache/items", "setting_cache_items", None),
  41. ("/store/setting.delivery/all", "setting_delivery_all", None),
  42. ("/store/setting.express/all", "setting_express_all", None),
  43. ("/store/setting.payment/options", "setting_payment_options", None),
  44. ("/store/setting.printer/all", "setting_printer_all", None),
  45. ("/store/page/list", "page_list", {"page": 1, "listRows": 15}),
  46. ("/store/market.coupon/list", "market_coupon_list", {"page": 1, "listRows": 15}),
  47. ("/store/market.points/log", "market_points_log", {"page": 1, "listRows": 15}),
  48. ("/store/market.recharge.plan/list", "recharge_plan_list", {"page": 1, "listRows": 15}),
  49. ("/store/content.article/list", "article_list", {"page": 1, "listRows": 15}),
  50. ("/store/content.article.category/list", "article_category_list", None),
  51. ("/store/content.help/list", "help_list", {"page": 1, "listRows": 15}),
  52. ("/store/user.balance/log", "user_balance_log", {"page": 1, "listRows": 15}),
  53. ("/store/statistics.data/survey", "statistics_survey", None),
  54. ("/store/statistics.data/initialize", "statistics_initialize", None),
  55. ]
  56. def main():
  57. src = Path(r"F:\import goods\upload_goods.py").read_text(encoding="utf-8")
  58. token = re.search(r'TOKEN\s*=\s*"([^"]+)"', src).group(1)
  59. headers = {"Access-Token": token}
  60. only = set(sys.argv[1:])
  61. summary = []
  62. for path, name, params in TARGETS:
  63. if only and path not in only:
  64. continue
  65. try:
  66. r = requests.get(BASE + path, headers=headers, params=params or {}, timeout=60)
  67. try:
  68. d = r.json()
  69. except Exception:
  70. print(f"[非JSON] {path} HTTP={r.status_code} body={r.text[:200]}")
  71. summary.append((path, "NON-JSON", 0))
  72. continue
  73. except Exception as e:
  74. print(f"[异常] {path} {e}")
  75. summary.append((path, "EXC", 0))
  76. continue
  77. if d.get("status") == 200:
  78. (GOLDEN / f"{name}.json").write_text(
  79. json.dumps(d, ensure_ascii=False, indent=2), encoding="utf-8")
  80. data = d.get("data")
  81. size = len(json.dumps(data, ensure_ascii=False)) if data is not None else 0
  82. print(f"{path:42s} status={d.get('status')} msg={str(d.get('message'))[:40]} size={size}")
  83. summary.append((path, d.get("status"), size))
  84. print("\n=== 汇总 ===")
  85. for p, s, n in summary:
  86. print(f"{s}\t{n}\t{p}")
  87. if __name__ == "__main__":
  88. main()