
Stock Announcements
- 1 installs
- 842 repo stars
- Updated July 29, 2026
- freestylefly/wesight
Fetches official A-share listed-company announcements via AkShare from Eastmoney, with stock-code and keyword filtering.
About
Uses AkShare to pull the day's full set of A-share company announcements from Eastmoney, filterable by stock code and keyword. An investor uses it to monitor material events, earnings flashes, shareholder changes, and restructurings.
- Real-time same-day announcements for all A-share companies
- Data sourced from Eastmoney via the AkShare library
Stock Announcements by the numbers
- 1 all-time installs (skills.sh)
- Ranked #909 of 1,106 Finance & Trading skills by installs in the Skillselion catalog
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/freestylefly/wesight --skill stock-announcementsAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1 |
|---|---|
| repo stars | ★ 842 |
| Last updated | July 29, 2026 |
| Repository | freestylefly/wesight ↗ |
What it does
Fetches official A-share listed-company announcements via AkShare from Eastmoney, with stock-code and keyword filtering.
Files
Stock Announcement Fetcher
获取A股上市公司的官方公告信息(真实数据),帮助投资者及时掌握重要信息披露。
真实数据保证
- 数据来源: 东方财富网(通过AkShare开源库)
- 更新频率: 实时(当日公告)
- 覆盖范围: 全部A股上市公司
- 数据质量: 官方权威数据
Dependencies
Python packages (install once):
pip install akshare pandas requests PyPDF2When to Use This Skill
触发条件(用户提及以下任一场景时激活):
1. 查询特定公司公告 — "查看五粮液最近的公告"、"002368有什么新公告?" 2. 监控特定事件 — "哪些公司今天发布了业绩预告?" 3. 投资决策辅助 — "公司有利好消息吗?"
Usage
IMPORTANT: Always use the $SKILLS_ROOT environment variable to locate scripts.
基础查询
export PYTHONIOENCODING=utf-8
python "$SKILLS_ROOT/stock-announcements/scripts/announcements.py" 000858查询最近7天
export PYTHONIOENCODING=utf-8
python "$SKILLS_ROOT/stock-announcements/scripts/announcements.py" 600519 --days 7关键词筛选
export PYTHONIOENCODING=utf-8
python "$SKILLS_ROOT/stock-announcements/scripts/announcements.py" 600519 --keyword 业绩JSON格式输出
export PYTHONIOENCODING=utf-8
python "$SKILLS_ROOT/stock-announcements/scripts/announcements.py" 000858 --format json提取PDF内容并总结
export PYTHONIOENCODING=utf-8
python "$SKILLS_ROOT/stock-announcements/scripts/announcements.py" 000858 --detailParameters
| 参数 | 说明 | 示例 | 默认值 |
|---|---|---|---|
stock_code | 股票代码(必填) | 000001, 600000.SS | - |
--days | 最近N天 | 7 | 30 |
--format | 输出格式 | json/text | text |
--keyword | 标题关键词筛选 | 业绩 | None |
--detail | 提取PDF内容并总结 | — | false |
Workflow
Step 1: 识别股票代码
用户可能提供以下任一格式:
- 公司名称:"五粮液" → 先用 web-search 查询股票代码
- Yahoo Finance格式:"000858.SZ" → 提取纯数字代码
- 纯代码:"000858" → 直接传递
Step 2: 执行查询
export PYTHONIOENCODING=utf-8
python "$SKILLS_ROOT/stock-announcements/scripts/announcements.py" <股票代码> [参数]Step 3: 解读结果
Agent 应该: 1. 提取关键信息(标题、类型、日期) 2. 分类汇总(业绩类、股东类、重大合同等) 3. 标注重要性(🔴高/🟡中/⚪低) 4. 提供简洁解读
Limitations
1. 只能查询当日公告 — AkShare 的 stock_notice_report 接口只返回指定日期的全部公告 2. 查询速度约7-10秒 — 需遍历1000+条公告 3. 中文显示乱码 — Windows PowerShell GBK编码问题,使用 --format json 可规避
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
WeSight Stock Announcement Fetcher
Fetches A-share company announcements from Eastmoney via AkShare.
Dependencies: pip install akshare pandas requests PyPDF2
"""
import sys
import io
import re
import json
import argparse
from datetime import datetime, timedelta
import pandas as pd
import requests
# Ensure UTF-8 stdout on Windows
if sys.stdout.encoding != "utf-8":
import codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout.buffer, "strict")
sys.stderr = codecs.getwriter("utf-8")(sys.stderr.buffer, "strict")
def _log(msg: str):
print(msg, file=sys.stderr)
# ---------------------------------------------------------------------------
# Data fetching
# ---------------------------------------------------------------------------
def query_announcements(code: str, days: int = 30) -> list:
"""Fetch announcements for *code* from Eastmoney via AkShare."""
try:
import akshare as ak
except ImportError:
_log("[错误] akshare 未安装,请运行: pip install akshare")
return []
# Normalise code - strip exchange suffix
code = code.split(".")[0]
end = datetime.now()
start = end - timedelta(days=days)
date_str = end.strftime("%Y%m%d")
_log(f"[1/2] 从东方财富获取 {date_str} 全部公告 ...")
try:
df = ak.stock_notice_report(symbol="全部", date=date_str)
except Exception as exc:
_log(f"[错误] AkShare 调用失败: {exc}")
return []
if df is None or df.empty:
_log(" → 当日无公告数据")
return []
cols = list(df.columns)
_log(f" → 获取 {len(df)} 条,筛选 {code} ...")
matched = df[df[cols[0]] == code]
if matched.empty:
_log(f" → 未找到 {code} 的公告")
return []
results = []
for _, row in matched.iterrows():
ann_date = str(row[cols[4]])
if ann_date < start.strftime("%Y-%m-%d"):
continue
url = str(row[cols[5]])
ann_id = url.rstrip("/").split("/")[-1].replace(".html", "")
results.append({
"date": ann_date,
"title": str(row[cols[2]]),
"type": str(row[cols[3]]),
"url": url,
"pdf_url": f"http://pdf.dfcfw.com/pdf/H2_{ann_id}_1.pdf",
"code": str(row[cols[0]]),
"name": str(row[cols[1]]),
})
_log(f"[2/2] 匹配到 {len(results)} 条公告\n")
return results
# ---------------------------------------------------------------------------
# PDF extraction (optional --detail)
# ---------------------------------------------------------------------------
def extract_pdf_summary(pdf_url: str, title: str):
"""Download a PDF and return a short summary."""
try:
from PyPDF2 import PdfReader
except ImportError:
_log("[提示] PyPDF2 未安装,跳过 PDF 提取")
return None
try:
_log(f" 下载 PDF ...")
resp = requests.get(pdf_url, timeout=15)
resp.raise_for_status()
reader = PdfReader(io.BytesIO(resp.content))
pages_text = []
for page in reader.pages[:5]:
txt = page.extract_text()
if txt:
pages_text.append(txt)
body = re.sub(r"\s+", " ", " ".join(pages_text)).strip()
if len(body) < 50:
return None
# Pick sentences containing keywords
keywords = ("通知", "决定", "变更", "任命", "辞职", "增持", "减持",
"业绩", "利润", "营收", "净利", "合同", "投资", "收购",
"重组", "分红", "股东")
sentences = re.split(r"[。!?\n]", body)
picked = [s.strip() for s in sentences if 15 < len(s.strip()) < 200
and any(k in s for k in keywords)][:5]
if picked:
return " ".join(f"({i+1}) {s}" for i, s in enumerate(picked))
return body[:300] + " ..."
except Exception as exc:
_log(f" PDF 提取失败: {exc}")
return None
# ---------------------------------------------------------------------------
# Output
# ---------------------------------------------------------------------------
def print_text(items: list, detail: bool = False):
if not items:
print("\n未找到匹配的公告。")
return
first = items[0]
print(f"\n{'─'*60}")
print(f" {first.get('name', '')} ({first['code']}) 共 {len(items)} 条公告")
print(f"{'─'*60}\n")
for i, a in enumerate(items, 1):
print(f" [{i}] {a['date']} {a['title']}")
if a.get("type"):
print(f" 类型: {a['type']}")
print(f" 链接: {a['url']}")
if detail and a.get("summary"):
print(f" 摘要: {a['summary']}")
print()
def print_json(items: list):
print(json.dumps(items, ensure_ascii=False, indent=2))
# ---------------------------------------------------------------------------
# CLI
# ---------------------------------------------------------------------------
def main():
ap = argparse.ArgumentParser(description="WeSight A股公告查询")
ap.add_argument("stock_code", help="股票代码 (如 000858, 600519.SS)")
ap.add_argument("--days", type=int, default=30, help="查询最近N天 (默认30)")
ap.add_argument("--keyword", default=None, help="标题关键词筛选")
ap.add_argument("--format", choices=["text", "json"], default="text")
ap.add_argument("--detail", action="store_true", help="提取PDF内容摘要")
args = ap.parse_args()
items = query_announcements(args.stock_code, days=args.days)
if args.keyword:
items = [a for a in items if args.keyword in a["title"]]
if args.detail:
for a in items:
s = extract_pdf_summary(a["pdf_url"], a["title"])
if s:
a["summary"] = s
if args.format == "json":
print_json(items)
else:
print_text(items, detail=args.detail)
if __name__ == "__main__":
main()