Skill: ym9zep/collage-application (version 1.0.3)

--- name: collage-application description: 提供高考志愿填报策略指导，根据考生省份、选科、分数、位次、意向生成科学志愿方案，并输出可视化志愿单；当用户需要进行高考志愿填报时使用 --- # 高考志愿填报助手 ## 前置准备 - 依赖说明：scripts脚本依赖python环境，并且所需依赖包 ``` pip install requests ``` ## 操作步骤 ### 标准流程 1. **信息收集** 你必须检查用户是否提供了以下信息： - **（必填）省份** (例如：上海、江苏、广东) - **（必填）选科组合** (例如：物理、化学、生物) - **（必填）高考分数** (具体数值) - **（选填）高考位次** (具体数值) - **（必填）倾向专业大类** (例如：计算机类、法学类) 如果**必填信息**未完整收集到：直接用自然语言友好地引导用户补充缺失的信息。 2. **志愿信息确认** 当收集完必填信息，则调用 `verify_correct_info` ，校验用户提供的信息是否正确，并且规范化信息 ```bash python {baseDir}/scripts/verify_correct_info.py --province "xxx" --score xxx [--rank xxx] --courses "xxx" --majors "xxx" ``` 执行完毕并返回结果后： - **若返回code成功**： - 提取data中规范化后的json。 - 用描述转化json的信息给用户，让用户确认或者询问是否需要修改 - 如果用户需要修改，那么根据修改后的信息重新运行脚本，再次让用户确认 - 如果用户确认正确，根据json中的字段去运行**步骤3**， - **若返回失败**： - 提取错误信息。 - 回复："抱歉，信息校验失败。原因：<error_message>。请核对您的信息，或稍后重试。" 3. **志愿方案生成** 如果用户确认信息后，则调用 `create_collage_application` 生成志愿单 ```bash python {baseDir}/scripts/create_collage_application.py --province "xxx" --score xxx --rank xxx --courses "xxx" --majors "xxx" [--api-key KEY] ``` 当脚本 `create_collage_application` 执行完毕并返回结果后： - **若返回成功且包含 url**： - 提取 msg和url。 - 回复："您的专属志愿单已生成！<加上对msg中的志愿单信息的做一下简短说明>"，**最后附带url中的图片** - **若返回失败**： - 提取错误信息msg。 - 回复："抱歉，志愿单生成失败。原因：<msg>。请核对您的信息，或稍后重试。" 4. **后续咨询** 如果志愿单已成功生成 - **禁止**再次要求用户重新提供信息（除非用户明确说“我要重新生成”或“修改分数”）。 - 直接利用你的专业知识回答用户关于学校、专业、录取概率的提问。 - 回复风格：专业、客观、数据驱动。 - 如果用户要重新生成，那么回到**步骤2** ### 脚本参数说明： province：必填，为单个省或市的简称，如上海，江苏，内蒙古，不包含新疆，西藏、台湾、香港、澳门 courses：必填，选科组合，内容为物理、化学、生物、历史、地理、政治、技术的组合，参数以按英文逗号`,`分割，比如`物理,化学,生物` score：必填，非负整形数字，高考分数 rank：非必填，非负整形数字，高考位次 majors：专业大类，如金融学类、化学类、计算机类等，参数以按英文逗号`,`分割，比如`金融学类,化学类,计算机类` api-key：非必填，脚本会自动读取`WENXIANG_API_KEY` 环境变量，如果读取不到，脚本会报错，这种情况下请让用户配置或者在对话中输入，如果在对话中输入，那么就加上此参数

path: scripts/create_collage_application.py
content: import requests


def create_collage_application(api_key, province, courses, score, rank, majors):
    data = {
        "province": province,
        "score": score,
        "rank": rank,
        "courses": courses.split(","),
        "majors": majors.split(","),
    }
    url = "https://wxc-college-uat.randomlife.cn/v1/collage_application/create"
    response = requests.post(url, json=data, timeout=30)
    return response.json()


def get_api_key(api_key):
    return api_key


if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser()
    parser.add_argument("--api-key", type=str, required=False, help="wenxiang apikey")
    parser.add_argument("--province", type=str, required=True, help="省份")
    parser.add_argument("--courses", type=str, required=True, help="选科组合")
    parser.add_argument("--score", type=int, required=True, help="高考分数")
    parser.add_argument("--rank", type=int, required=False, help="高考位次")
    parser.add_argument("--majors", type=str, required=True, help="专业大类")

    args = parser.parse_args()

    print(create_collage_application([REDACTED_SECRET]),
                                     province=args.province,
                                     courses=args.courses,
                                     score=args.score,
                                     rank=args.rank,
                                     majors=args.majors))


path: scripts/verify_correct_info.py
content: import difflib

province_all = ["北京", "天津", "河北", "山西", "内蒙古", "辽宁", "吉林", "黑龙江", "上海", "江苏", "浙江", "安徽",
                "福建", "江西",
                "山东", "河南", "湖北", "湖南", "广东", "广西", "海南", "重庆", "四川", "贵州", "云南", "陕西", "甘肃",
                "青海", "宁夏"]

courses_all = ["物理", "化学", "生物", "历史", "地理", "政治", "技术"]

major_all = ["哲学类", "经济学类", "财政学类", "金融学类", "经济与贸易类", "法学类", "政治学类", "社会学类", "民族学类",
             "马克思主义理论类", "公安学类", "教育学类", "体育学类", "中国语言文学类", "外国语言文学类",
             "新闻传播学类", "历史学类", "数学类", "物理学类", "化学类", "天文学类", "地理科学类", "大气科学类",
             "海洋科学类", "地球物理学类", "地质学类", "生物科学类", "心理学类", "统计学类", "力学类", "机械类",
             "仪器类", "材料类", "能源动力类", "电气类", "电子信息类", "自动化类", "计算机类", "土木类", "水利类",
             "测绘类", "化工与制药类", "地质类", "矿业类", "纺织类", "轻工类", "交通运输类", "海洋工程类", "航空航天类",
             "兵器类", "核工程类", "农业工程类", "林业工程类", "环境科学与工程类", "生物医学工程类", "食品科学与工程类",
             "建筑类", "安全科学与工程类", "生物工程类", "公安技术类", "交叉工程类", "植物生产类",
             "自然保护与环境生态类", "动物生产类", "动物医学类", "林学类", "水产类", "草学类", "基础医学类",
             "临床医学类", "口腔医学类", "公共卫生与预防医学类", "中医学类", "中西医结合类", "药学类", "中药学类",
             "法医学类", "医学技术类", "护理学类", "管理科学与工程类", "工商管理类", "农业经济管理类", "公共管理类",
             "图书情报与档案管理类", "物流管理与工程类", "工业工程类", "电子商务类", "旅游管理类",
             "艺术学理论类", "音乐与舞蹈学类", "戏剧与影视学类", "美术学类", "设计学类"]


def verify_correct_info(province, courses, score, rank, majors):
    # 校验省市
    if province not in province_all:
        return {"code": "failed", "msg": "找不到该省市，请确认省市是否正确并且是目前支持的省市"}
    # 校验选科
    courses_lst = courses.replace("[", "").replace("]", "").split(',')
    if len(courses_lst) == 0:
        return {"code": "failed", "msg": "选科信息为空"}
    for course in courses_lst:
        if course not in courses_all:
            return {"code": "failed", "msg": "选科信息错误，请确认选科信息是否正确"}
    # 校验分数
    if score < 0 or score > 2000:
        return {"code": "failed", "msg": "分数错误，不能小于0或者大于总分"}
    # 校验分数
    if rank < 0:
        return {"code": "failed", "msg": "位次错误，不能小于0"}
    # 校验倾向专业大类
    majors_lst = majors.replace("[", "").replace("]", "").split(',')
    majors_lst_correct = []
    for major in majors_lst:
        major = major.strip()
        if not major:
            continue
        # 优先精确匹配
        if major in major_all:
            majors_lst_correct.append(major)
            continue
        # 模糊匹配
        best_match = None
        max_diff_score = -1.0
        for candidate in major_all:
            diff_score = difflib.SequenceMatcher(None, major, candidate).ratio()
            # 只取最相似的那个 (不需要阈值，强制更新最大值)
            if diff_score > max_diff_score:
                max_diff_score = diff_score
                best_match = candidate
        if best_match:
            majors_lst_correct.append(best_match)

    return {
        "code": "success",
        "msg": "校验成功",
        "data": {
            "province": province,
            "courses": courses,
            "score": score,
            "rank": rank,
            "majors": ",".join(majors_lst_correct)
        }
    }


if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser()
    parser.add_argument("--province", type=str, required=True, help="省份")
    parser.add_argument("--courses", type=str, required=True, help="选科组合")
    parser.add_argument("--score", type=int, required=True, help="高考分数")
    parser.add_argument("--rank", type=int, required=False, help="高考位次")
    parser.add_argument("--majors", type=str, required=True, help="专业大类")
    args = parser.parse_args()

    print(verify_correct_info(province=args.province,
                              courses=args.courses,
                              score=args.score,
                              rank=args.rank,
                              majors=args.majors))


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)