grab_golden_batch.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  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. from _root import ROOT
  18. GOLDEN = Path(str(ROOT / "golden"))
  19. GOLDEN.mkdir(exist_ok=True)
  20. BASE = "https://shop.qinys.cn/index.php?s="
  21. TARGETS = [
  22. ("/store/store/info", "store_info", None),
  23. ("/store/store.menu/list", "store_menu_list", None),
  24. ("/store/store.role/list", "store_role_list", {"page": 1, "listRows": 15}),
  25. ("/store/store.user/list", "store_user_list", {"page": 1, "listRows": 15}),
  26. ("/store/store.address/all", "store_address_all", None),
  27. ("/store/category/list", "category_list", None),
  28. ("/store/goods.service/list", "goods_service_list", {"page": 1, "listRows": 15}),
  29. ("/store/goods.service/all", "goods_service_all", None),
  30. ("/store/goods.comment/list", "goods_comment_list", {"page": 1, "listRows": 15}),
  31. ("/store/files/list", "files_list", {"page": 1, "listRows": 15}),
  32. ("/store/files.group/list", "files_group_list", None),
  33. ("/store/region/all", "region_all", None),
  34. ("/store/region/tree", "region_tree", None),
  35. ("/store/user/list", "user_list", {"page": 1, "listRows": 15}),
  36. ("/store/user.grade/all", "user_grade_all", None),
  37. ("/store/order/list", "order_list", {"page": 1, "listRows": 15, "dataType": "all"}),
  38. ("/store/order.delivery/list", "order_delivery_list", {"page": 1, "listRows": 15}),
  39. ("/store/order.refund/list", "order_refund_list", {"page": 1, "listRows": 15, "dataType": "all"}),
  40. ("/store/setting/detail", "setting_detail", {"key": "store"}),
  41. ("/store/setting.cache/items", "setting_cache_items", None),
  42. ("/store/setting.delivery/all", "setting_delivery_all", None),
  43. ("/store/setting.express/all", "setting_express_all", None),
  44. ("/store/setting.payment/options", "setting_payment_options", None),
  45. ("/store/setting.printer/all", "setting_printer_all", None),
  46. ("/store/page/list", "page_list", {"page": 1, "listRows": 15}),
  47. ("/store/market.coupon/list", "market_coupon_list", {"page": 1, "listRows": 15}),
  48. ("/store/market.points/log", "market_points_log", {"page": 1, "listRows": 15}),
  49. ("/store/market.recharge.plan/list", "recharge_plan_list", {"page": 1, "listRows": 15}),
  50. ("/store/content.article/list", "article_list", {"page": 1, "listRows": 15}),
  51. ("/store/content.article.category/list", "article_category_list", None),
  52. ("/store/content.help/list", "help_list", {"page": 1, "listRows": 15}),
  53. ("/store/user.balance/log", "user_balance_log", {"page": 1, "listRows": 15}),
  54. ("/store/statistics.data/survey", "statistics_survey", None),
  55. ("/store/statistics.data/initialize", "statistics_initialize", None),
  56. ]
  57. def main():
  58. src = Path(r"F:\import goods\upload_goods.py").read_text(encoding="utf-8")
  59. token = re.search(r'TOKEN\s*=\s*"([^"]+)"', src).group(1)
  60. headers = {"Access-Token": token}
  61. only = set(sys.argv[1:])
  62. summary = []
  63. for path, name, params in TARGETS:
  64. if only and path not in only:
  65. continue
  66. try:
  67. r = requests.get(BASE + path, headers=headers, params=params or {}, timeout=60)
  68. try:
  69. d = r.json()
  70. except Exception:
  71. print(f"[非JSON] {path} HTTP={r.status_code} body={r.text[:200]}")
  72. summary.append((path, "NON-JSON", 0))
  73. continue
  74. except Exception as e:
  75. print(f"[异常] {path} {e}")
  76. summary.append((path, "EXC", 0))
  77. continue
  78. if d.get("status") == 200:
  79. (GOLDEN / f"{name}.json").write_text(
  80. json.dumps(d, ensure_ascii=False, indent=2), encoding="utf-8")
  81. data = d.get("data")
  82. size = len(json.dumps(data, ensure_ascii=False)) if data is not None else 0
  83. print(f"{path:42s} status={d.get('status')} msg={str(d.get('message'))[:40]} size={size}")
  84. summary.append((path, d.get("status"), size))
  85. print("\n=== 汇总 ===")
  86. for p, s, n in summary:
  87. print(f"{s}\t{n}\t{p}")
  88. if __name__ == "__main__":
  89. main()