代码测试

2020年4月1日 | 共478字 | Primer todo

存在

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()