announcement.js
1 // eastmoney announcement — listed company filings/announcements feed. 2 // 3 // opencli eastmoney announcement 4 // opencli eastmoney announcement --market SHA --limit 30 5 6 import { cli, Strategy } from '@jackwener/opencli/registry'; 7 import { CliError } from '@jackwener/opencli/errors'; 8 9 cli({ 10 site: 'eastmoney', 11 name: 'announcement', 12 description: '上市公司公告(按交易所筛选)', 13 domain: 'np-anotice-stock.eastmoney.com', 14 strategy: Strategy.PUBLIC, 15 browser: false, 16 args: [ 17 { name: 'market', type: 'string', default: 'SHA,SZA,BJA', help: '交易所:SHA (沪) / SZA (深) / BJA (北) 可逗号分隔' }, 18 { name: 'limit', type: 'int', default: 20, help: '返回数量 (max 100)' }, 19 ], 20 columns: ['time', 'code', 'name', 'title', 'category', 'url'], 21 func: async (_page, args) => { 22 const market = String(args.market ?? 'SHA,SZA,BJA').trim() || 'SHA,SZA,BJA'; 23 const limit = Math.max(1, Math.min(Number(args.limit) || 20, 100)); 24 25 const url = new URL('https://np-anotice-stock.eastmoney.com/api/security/ann'); 26 url.searchParams.set('page_size', String(limit)); 27 url.searchParams.set('page_index', '1'); 28 url.searchParams.set('ann_type', market); 29 url.searchParams.set('client_source', 'web'); 30 url.searchParams.set('f_node', '0'); 31 url.searchParams.set('s_node', '0'); 32 33 const resp = await fetch(url, { headers: { 'User-Agent': 'Mozilla/5.0' } }); 34 if (!resp.ok) throw new CliError('HTTP_ERROR', `announcement failed: HTTP ${resp.status}`); 35 const data = await resp.json(); 36 const list = Array.isArray(data?.data?.list) ? data.data.list : []; 37 if (list.length === 0) throw new CliError('NO_DATA', 'eastmoney returned no announcement data'); 38 39 return list.slice(0, limit).map((it) => { 40 const primary = Array.isArray(it.codes) && it.codes.length > 0 ? it.codes[0] : {}; 41 const cat = Array.isArray(it.columns) && it.columns.length > 0 ? it.columns[0]?.column_name : ''; 42 return { 43 time: String(it.notice_date || it.display_time || '').slice(0, 19), 44 code: primary.stock_code || '', 45 name: primary.short_name || '', 46 title: it.title || it.title_ch || '', 47 category: cat || '', 48 url: `https://data.eastmoney.com/notices/detail/${primary.stock_code || ''}/${it.art_code || ''}.html`, 49 }; 50 }); 51 }, 52 });