Skill: lean-zhouchao/eastmoney-select-stock-1-0-2 (version 1.0.0)

--- name: eastmoney_select_stock description: 本 Skill 支持基于股票选股条件（行情指标、财务指标等）筛选满足条件的股票；可查询指定行业/板块内的股票、上市公司，以及板块指数的成分股；同时支持股票、上市公司、板块/指数推荐等相关任务，避免大模型在选股时使用过时信息。 required_env_vars: - EASTMONEY_APIKEY credentials: - type: api_key name: EASTMONEY_APIKEY description: 从东方财富技能市场 (https://marketing.dfcfs.com/views/finskillshub/indexuNdYscEA?appfenxiang=1) 获取的 API Key --- # 东方财富智能选股skill (eastmoney_select_stock) 通过**自然语言查询**进行选股（支持市场：A股、港股、美股），返回符合条件的股票列表，可自动导出为CSV文件。 ## 使用方式 1. 首先检查环境变量`EASTMONEY_APIKEY`是否存在： ```bash echo $EASTMONEY_APIKEY ``` 如果不存在，提示用户在东方财富Skills页面(https://marketing.dfcfs.com/views/finskillshub/indexuNdYscEA?appfenxiang=1)获取apikey并设置到环境变量。 > ⚠️ **安全注意事项** > > - **外部请求**: 本 Skill 会将用户的查询关键词（Keyword）发送至东方财富官方 API 接口 (`mkapi2.dfcfs.com`) 进行解析与检索。 > - **数据用途**: 提交的数据仅用于匹配选股条件，不包含个人隐私信息。 > - **凭据保护**: API Key 仅通过环境变量 `EASTMONEY_APIKEY` 在服务端或受信任的运行环境中使用，不会在前端明文暴露。 2. 使用POST请求调用接口： ```bash curl -X POST --location 'https://mkapi2.dfcfs.com/finskillshub/api/claw/stock-screen' \ --header 'Content-Type: application/json' \ --header "[REDACTED_SECRET]" \ --data '{"keyword": "选股条件", "pageNo": 1, "pageSize": 20}' ``` ## 适用场景 当用户查询以下类型的内容时使用本skill： - 条件选股：如"今日涨幅2%的股票"、"市盈率低于10的银行股"、"连续3天上涨的科技股" - 板块/行业成分股：如"半导体板块的成分股"、"新能源行业的上市公司" - 指数成分股：如"沪深300成分股"、"科创50成分股列表" - 股票推荐：如"低估值高分红的股票推荐"、"近期有主力资金流入的股票" - 市场筛选：如"港股通标的股"、"美股中概股列表" ## 请求参数说明 |参数|类型|必填|说明| |----|----|----|----| |`keyword`|字符串|是|自然语言描述的选股条件| |`pageNo`|数字|否|页码，默认1| |`pageSize`|数字|否|每页数量，默认20，最大200| ## 接口结果释义 ### 一、顶层核心状态/统计字段 |字段路径|类型|核心释义| |----|----|----| |`status`|数字|接口全局状态，0 = 成功| |`message`|字符串|接口全局提示，ok = 成功| |`data.code`|字符串|选股业务层状态码，100 = 解析成功| |`data.msg`|字符串|选股业务层提示| |`data.data.resultType`|数字|结果类型枚举，2000 为标准选股结果| |`data.data.result.total`|数字|【核心】选股结果总数量（符合条件的股票数）| ### 2.1 列定义：`data.data.result.columns`（数组） 核心作用：定义表格每一列的展示规则，与`dataList`的行数据键一一映射。 |子字段|类型|核心释义| |----|----|----| |`title`|字符串|表格列展示标题（如最新价 (元)、涨跌幅 (%)）| |`key`|字符串|【核心】列唯一业务键，与`dataList`中对象的键映射| |`unit`|字符串|列数值单位（元、%、股、倍）| |`dataType`|字符串|列数据类型（String/Double/Long）| ### 2.2 行数据：`data.data.result.dataList`（数组） 核心作用：选股结果的具体股票数据，每个对象对应一只符合条件的股票。 |核心键|数据类型|核心释义| |----|----|----| |`SERIAL`|字符串|表格行序号| |`SECURITY_CODE`|字符串|股票代码（如 603866、300991）| |`SECURITY_SHORT_NAME`|字符串|股票简称（如桃李面包、创益通）| |`MARKET_SHORT_NAME`|字符串|市场简称（SH = 上交所，SZ = 深交所，HK = 港交所，US = 美股）| |`NEWEST_PRICE`|数字/字符串|最新价（单位：元）| |`CHG`|数字/字符串|涨跌幅（单位：%）| |`PCHG`|数字/字符串|涨跌额（单位：元）| ### 三、选股条件说明 |字段路径|类型|核心释义| |----|----|----| |`data.data.responseConditionList`|数组|单条筛选条件的统计，每个对象对应1个筛选条件| |`data.data.responseConditionList[].describe`|字符串|筛选条件描述（如今日涨跌幅在 [1.5%,2.5%] 之间）| |`data.data.totalCondition.describe`|字符串|组合条件描述（所有条件叠加后的最终筛选规则）| |`data.data.parserText`|字符串|选股条件的解析文本，以分号分隔单条件| ## 示例 ```python import os import csv import json import requests [REDACTED_SECRET]"EASTMONEY_APIKEY") if not api_key: raise ValueError("请先设置EASTMONEY_APIKEY环境变量") url = "https://mkapi2.dfcfs.com/finskillshub/api/claw/stock-screen" headers = { "Content-Type": "application/json", "apikey": api_key } data = { "keyword": "今日涨幅2%的股票", "pageNo": 1, "pageSize": 20 } response = requests.post(url, headers=headers, json=data) response.raise_for_status() result = response.json() # 检查是否有数据返回 if result.get("status") != 0 or not result.get("data") or result["data"].get("code") != "100": print("选股查询失败，建议到东方财富妙想AI进行选股。") print(f"错误信息: {result.get('message', '未知错误')}") sys.exit(0) result_data = result["data"]["data"]["result"] if not result_data.get("dataList"): print("没有找到符合条件的股票，建议调整筛选条件或到东方财富妙想AI查询。") sys.exit(0) # 导出为CSV columns = result_data["columns"] data_list = result_data["dataList"] # 生成列名映射 column_map = {col["key"]: col["title"] for col in columns} csv_headers = [column_map[key] for key in data_list[0].keys() if key in column_map] with open("stock_selection_result.csv", "w", newline="", encoding="utf-8-sig") as f: writer = csv.DictWriter(f, fieldnames=csv_headers) writer.writeheader() for row in data_list: csv_row = {column_map[key]: value for key, value in row.items() if key in column_map} writer.writerow(csv_row) print(f"找到 {result_data['total']} 只符合条件的股票，结果已保存到 stock_selection_result.csv") ``` ## 异常处理 - 如果数据结果为空，提示用户到东方财富妙想AI进行选股 - 如果请求失败，检查API Key是否正确，网络是否正常 - 建议单次查询pageSize不超过200，避免数据量过大

path: _meta.json
content: ownerId: kn73m56g83j65mv3bjd848j7vn82t04f
slug: eastmoney-select-stock
version: 1.0.2
publishedAt: 1773381173295

path: scripts/stock_screen.py
content: #!/usr/bin/env python3
"""
东方财富智能选股脚本
使用方式: python stock_screen.py <选股条件> [页码] [每页数量]
示例: python stock_screen.py "今日涨幅2%的股票" 1 20
"""

import os
import sys
import csv
import json
import requests

def main():
    if len(sys.argv) < 2:
        print("使用方式: python stock_screen.py <选股条件> [页码] [每页数量]")
        print("示例: python stock_screen.py \"今日涨幅2%的股票\" 1 20")
        sys.exit(1)
    
    keyword = sys.argv[1]
    page_no = int(sys.argv[2]) if len(sys.argv) > 2 else 1
    page_size = int(sys.argv[3]) if len(sys.argv) > 3 else 20
    
    [REDACTED_SECRET]"EASTMONEY_APIKEY")
    
    if not [REDACTED_SECRET]"错误: 请先设置EASTMONEY_APIKEY环境变量")
        print("你可以在东方财富Skills页面获取apikey，然后执行: export EASTMONEY_APIKEY='你的apikey'")
        sys.exit(1)
    
    url = "https://mkapi2.dfcfs.com/finskillshub/api/claw/stock-screen"
    headers = {
        "Content-Type": "application/json",
        "apikey": api_key
    }
    data = {
        "keyword": keyword,
        "pageNo": page_no,
        "pageSize": page_size
    }
    
    try:
        response = requests.post(url, headers=headers, json=data)
        response.raise_for_status()
        result = response.json()
        
        # 检查接口状态
        if result.get("status") != 0:
            print(f"接口请求失败: {result.get('message', '未知错误')}")
            sys.exit(1)
        
        if not result.get("data") or result["data"].get("code") != "100":
            print("选股查询失败，建议到东方财富妙想AI进行选股。")
            print(f"错误信息: {result['data'].get('msg', '未知错误')}")
            sys.exit(1)
        
        result_data = result["data"]["data"]["result"]
        if not result_data.get("dataList"):
            print("没有找到符合条件的股票，建议调整筛选条件或到东方财富妙想AI查询。")
            sys.exit(0)
        
        # 打印统计信息
        total = result_data["total"]
        print(f"✅ 找到 {total} 只符合条件的股票\n")
        
        # 打印筛选条件
        total_condition = result["data"]["data"].get("totalCondition", {})
        if total_condition.get("describe"):
            print(f"🔍 筛选条件: {total_condition['describe']}\n")
        
        # 打印列名映射
        columns = result_data["columns"]
        column_map = {col["key"]: col["title"] for col in columns}
        
        # 打印前10条结果
        data_list = result_data["dataList"]
        print("📋 部分结果预览:")
        print("-" * 100)
        
        # 打印表头
        headers = [column_map[key] for key in data_list[0].keys() if key in column_map]
        print("\t".join(headers[:5]))  # 只显示前5列
        print("-" * 100)
        
        # 打印前10行
        for row in data_list[:10]:
            row_data = [str(row[key]) for key in data_list[0].keys() if key in column_map]
            print("\t".join(row_data[:5]))
        
        # 导出为CSV
        csv_filename = f"选股结果_{keyword[:20]}.csv".replace("/", "_").replace("\\", "_")
        with open(csv_filename, "w", newline="", encoding="utf-8-sig") as f:
            writer = csv.DictWriter(f, fieldnames=headers)
            writer.writeheader()
            for row in data_list:
                csv_row = {column_map[key]: value for key, value in row.items() if key in column_map}
                writer.writerow(csv_row)
        
        print(f"\n💾 完整结果已保存到: {csv_filename}")
        print(f"📊 共 {len(data_list)} 条数据，总共有 {total} 条符合条件的记录")
        
        if total > len(data_list):
            print(f"ℹ️  当前显示第 {page_no} 页，可通过调整页码参数查看更多结果")
        
    except requests.exceptions.RequestException as e:
        print(f"请求失败: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()


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