代码测试
存在
http://sast.infosec.ctripcorp.com/#/apiVulDetail/35589
1GET /liveadmin/api/plive/anchorPLiveRecord?liveId=123 HTTP/1.1
2Host: you.fws.qa.nt.ctripcorp.com
3Cookie: cticket=740E562EA75570C0A19682B1E929BF3A457C813A71386413B55C7D4093C367DC
python 代码测试
1import requests
2import json
3from collections import defaultdict
4
5
6def fetch_json(url, timeout=10):
7 """统一请求并解析 JSON"""
8 try:
9 r = requests.get(url, timeout=timeout)
10 r.raise_for_status()
11 return r.json()
12 except Exception as e:
13 print(f"请求失败 {url}: {e}")
14 return None
15
16
17def build_captain_url(app_id, env, group_id):
18 """生成 Captain 页面链接"""
19 return (f"https://captain.release.ctripcorp.com/app/{app_id}"
20 f"/cluster/{env}?groupId={group_id}&type=info")
21
22
23def main():
24 appId = input("输入要查询的 appId: ").strip()
25 # added_by = input("输入提交人 (added_by, 默认 liangkh): ").strip() or "liangkh"
26
27 # 1. 查询 group 列表
28 groups_data = fetch_json(
29 f"http://captain.release.ctripcorp.com/v1/groups?application_id={appId}"
30 )
31 if not groups_data or not groups_data.get('result'):
32 print("未找到任何 group")
33 return
34
35 # 2. 收集每个 env 下的所有 pod
36 env_pods = defaultdict(list)
37
38 for g in groups_data['result']:
39 env = g['env']
40 group_id = g['id']
41 captain_url = build_captain_url(appId, env, group_id)
42
43 pods_data = fetch_json(
44 f"http://captain.release.ctripcorp.com/v1/pods?group_id={group_id}"
45 )
46 if not pods_data:
47 continue
48
49 if not pods_data.get('result'):
50 env_pods[env].append({
51 "group_id": group_id,
52 "captain_url": captain_url,
53 "empty": True
54 })
55 continue
56
57 for item in pods_data['result']:
58 env_pods[env].append({
59 "group_id": group_id,
60 "captain_url": captain_url,
61 "pod_name": item.get('name'),
62 "updated_at": item.get('updated_at'),
63 "ip": item.get('ip'),
64 "image_name": item.get('version', {}).get('image', {}).get('name'),
65 "empty": False
66 })
67
68 # 3. 按指定顺序输出
69 env_order = {'prod': 0, 'uat': 1, 'fat': 2, 'dev': 3}
70 sorted_envs = sorted(env_pods.keys(), key=lambda x: env_order.get(x, 99))
71
72 for env in sorted_envs:
73 pods = env_pods[env]
74 real_pods = [p for p in pods if not p['empty']]
75
76 print("#" * 70)
77 print(f"# {env.upper()} 环境 (共 {len(real_pods)} 个实例)")
78 print("#" * 70)
79
80 pods.sort(key=lambda x: (x['group_id'], x.get('pod_name') or ''))
81
82 last_gid = None
83 for p in pods:
84 if p['group_id'] != last_gid:
85 print(f"┌─ group_id : {p['group_id']}")
86 print(f"└─ Captain : {p['captain_url']}")
87 last_gid = p['group_id']
88
89 if p['empty']:
90 print(" └─ 无实例机器")
91 continue
92
93 print(" " + "-" * 56)
94 print(f" Pod 名称 : {p['pod_name']}")
95 print(f" 更新时间 : {p['updated_at']}")
96 print(f" IP 地址 : {p['ip']}")
97 print(f" 镜像名称 : {p['image_name']}")
98
99 # ============ ★ 4. 构建最终提交的 JSON 数据 ============
100 # 用 dict 做去重: key=image, value=set(envs)
101 image_env_map = defaultdict(set)
102
103 for env, pods in env_pods.items():
104 for p in pods:
105 if p.get('empty'):
106 continue
107 image = p.get('image_name')
108 if not image: # 没有 image 的跳过
109 continue
110 image_env_map[image].add(env.upper()) # env 转大写
111
112 # 转成 items 列表
113 items = [
114 {"image": image, "envs": sorted(list(envs))}
115 for image, envs in image_env_map.items()
116 ]
117
118 submit_data = {
119 "appid": appId,
120 "items": items,
121 # "added_by": added_by
122 "added_by": "liangkh"
123 }
124
125 # 5. 输出最终 JSON
126 print("=" * 70)
127 print("提交的 json 数据:\n" + json.dumps(submit_data, indent=2, ensure_ascii=False))
128
129
130if __name__ == "__main__":
131 main()