stock-sdk 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,92 +1,116 @@
1
- import axios, { AxiosInstance } from 'axios';
2
- import * as iconv from 'iconv-lite';
3
- import {
4
- FullQuote,
5
- SimpleQuote,
6
- FundFlow,
7
- PanelLargeOrder,
8
- HKQuote,
9
- USQuote,
10
- FundQuote,
11
- } from './types';
12
-
13
- export * from './types';
14
-
15
- const BASE_URL = 'http://qt.gtimg.cn';
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
16
29
 
17
- function safeNumber(val: string | undefined): number {
18
- if (!val || val === '') return 0;
30
+ // src/index.ts
31
+ var index_exports = {};
32
+ __export(index_exports, {
33
+ TencentStockSDK: () => TencentStockSDK,
34
+ default: () => index_default
35
+ });
36
+ module.exports = __toCommonJS(index_exports);
37
+ var import_axios = __toESM(require("axios"), 1);
38
+ var BASE_URL = "http://qt.gtimg.cn";
39
+ function isBrowser() {
40
+ return typeof window !== "undefined" && typeof window.document !== "undefined";
41
+ }
42
+ async function decodeGBK(data) {
43
+ if (isBrowser()) {
44
+ const decoder = new TextDecoder("gbk");
45
+ return decoder.decode(data);
46
+ } else {
47
+ const iconvModule = await import("iconv-lite");
48
+ const iconv = iconvModule.default || iconvModule;
49
+ return iconv.decode(Buffer.from(data), "gbk");
50
+ }
51
+ }
52
+ function safeNumber(val) {
53
+ if (!val || val === "") return 0;
19
54
  const n = parseFloat(val);
20
55
  return Number.isNaN(n) ? 0 : n;
21
56
  }
22
-
23
- function safeNumberOrNull(val: string | undefined): number | null {
24
- if (!val || val === '') return null;
57
+ function safeNumberOrNull(val) {
58
+ if (!val || val === "") return null;
25
59
  const n = parseFloat(val);
26
60
  return Number.isNaN(n) ? null : n;
27
61
  }
28
-
29
- /**
30
- * 解析响应文本,按 `;` 拆行,提取 `v_xxx="..."` 里的内容,返回 { key, fields }[]
31
- */
32
- function parseResponse(text: string): { key: string; fields: string[] }[] {
33
- const lines = text.split(';').map((l) => l.trim()).filter(Boolean);
34
- const results: { key: string; fields: string[] }[] = [];
62
+ function parseResponse(text) {
63
+ const lines = text.split(";").map((l) => l.trim()).filter(Boolean);
64
+ const results = [];
35
65
  for (const line of lines) {
36
- const eqIdx = line.indexOf('=');
66
+ const eqIdx = line.indexOf("=");
37
67
  if (eqIdx < 0) continue;
38
68
  let key = line.slice(0, eqIdx).trim();
39
- if (key.startsWith('v_')) key = key.slice(2);
69
+ if (key.startsWith("v_")) key = key.slice(2);
40
70
  let raw = line.slice(eqIdx + 1).trim();
41
71
  if (raw.startsWith('"') && raw.endsWith('"')) {
42
72
  raw = raw.slice(1, -1);
43
73
  }
44
- const fields = raw.split('~');
74
+ const fields = raw.split("~");
45
75
  results.push({ key, fields });
46
76
  }
47
77
  return results;
48
78
  }
49
-
50
- export class TencentStockSDK {
51
- private client: AxiosInstance;
52
-
79
+ var TencentStockSDK = class {
53
80
  constructor() {
54
- this.client = axios.create({
81
+ this.client = import_axios.default.create({
55
82
  baseURL: BASE_URL,
56
- responseType: 'arraybuffer',
57
- timeout: 10000,
83
+ responseType: "arraybuffer",
84
+ timeout: 1e4
58
85
  });
59
86
  }
60
-
61
- private async fetch(params: string): Promise<{ key: string; fields: string[] }[]> {
62
- const resp = await this.client.get('/', { params: { q: params } });
63
- const text = iconv.decode(Buffer.from(resp.data), 'gbk');
87
+ async fetch(params) {
88
+ const resp = await this.client.get("/", { params: { q: params } });
89
+ const text = await decodeGBK(resp.data);
64
90
  return parseResponse(text);
65
91
  }
66
-
67
92
  // ---------- 实时全量行情 ----------
68
93
  /**
69
94
  * 获取 A 股 / 指数 全量行情
70
95
  * @param codes 如 ['sz000858', 'sh600000']
71
96
  */
72
- async getFullQuotes(codes: string[]): Promise<FullQuote[]> {
73
- const data = await this.fetch(codes.join(','));
97
+ async getFullQuotes(codes) {
98
+ const data = await this.fetch(codes.join(","));
74
99
  return data.map((d) => this.parseFullQuote(d.fields));
75
100
  }
76
-
77
- private parseFullQuote(f: string[]): FullQuote {
78
- const bid: { price: number; volume: number }[] = [];
101
+ parseFullQuote(f) {
102
+ const bid = [];
79
103
  for (let i = 0; i < 5; i++) {
80
104
  bid.push({ price: safeNumber(f[9 + i * 2]), volume: safeNumber(f[10 + i * 2]) });
81
105
  }
82
- const ask: { price: number; volume: number }[] = [];
106
+ const ask = [];
83
107
  for (let i = 0; i < 5; i++) {
84
108
  ask.push({ price: safeNumber(f[19 + i * 2]), volume: safeNumber(f[20 + i * 2]) });
85
109
  }
86
110
  return {
87
- marketId: f[0] ?? '',
88
- name: f[1] ?? '',
89
- code: f[2] ?? '',
111
+ marketId: f[0] ?? "",
112
+ name: f[1] ?? "",
113
+ code: f[2] ?? "",
90
114
  price: safeNumber(f[3]),
91
115
  prevClose: safeNumber(f[4]),
92
116
  open: safeNumber(f[5]),
@@ -95,7 +119,7 @@ export class TencentStockSDK {
95
119
  innerVolume: safeNumber(f[8]),
96
120
  bid,
97
121
  ask,
98
- time: f[30] ?? '',
122
+ time: f[30] ?? "",
99
123
  change: safeNumber(f[31]),
100
124
  changePercent: safeNumber(f[32]),
101
125
  high: safeNumber(f[33]),
@@ -109,49 +133,45 @@ export class TencentStockSDK {
109
133
  pb: safeNumberOrNull(f[46]),
110
134
  limitUp: safeNumberOrNull(f[47]),
111
135
  limitDown: safeNumberOrNull(f[48]),
112
- raw: f,
136
+ raw: f
113
137
  };
114
138
  }
115
-
116
139
  // ---------- 简要行情 ----------
117
140
  /**
118
141
  * 获取简要行情
119
142
  * @param codes 如 ['s_sz000858', 's_sh000001']
120
143
  */
121
- async getSimpleQuotes(codes: string[]): Promise<SimpleQuote[]> {
122
- const data = await this.fetch(codes.join(','));
144
+ async getSimpleQuotes(codes) {
145
+ const data = await this.fetch(codes.join(","));
123
146
  return data.map((d) => this.parseSimpleQuote(d.fields));
124
147
  }
125
-
126
- private parseSimpleQuote(f: string[]): SimpleQuote {
148
+ parseSimpleQuote(f) {
127
149
  return {
128
- marketId: f[0] ?? '',
129
- name: f[1] ?? '',
130
- code: f[2] ?? '',
150
+ marketId: f[0] ?? "",
151
+ name: f[1] ?? "",
152
+ code: f[2] ?? "",
131
153
  price: safeNumber(f[3]),
132
154
  change: safeNumber(f[4]),
133
155
  changePercent: safeNumber(f[5]),
134
156
  volume: safeNumber(f[6]),
135
157
  amount: safeNumber(f[7]),
136
158
  marketCap: safeNumberOrNull(f[9]),
137
- marketType: f[10] ?? '',
138
- raw: f,
159
+ marketType: f[10] ?? "",
160
+ raw: f
139
161
  };
140
162
  }
141
-
142
163
  // ---------- 资金流向 ----------
143
164
  /**
144
165
  * 获取资金流向
145
166
  * @param codes 如 ['ff_sz000858']
146
167
  */
147
- async getFundFlow(codes: string[]): Promise<FundFlow[]> {
148
- const data = await this.fetch(codes.join(','));
168
+ async getFundFlow(codes) {
169
+ const data = await this.fetch(codes.join(","));
149
170
  return data.map((d) => this.parseFundFlow(d.fields));
150
171
  }
151
-
152
- private parseFundFlow(f: string[]): FundFlow {
172
+ parseFundFlow(f) {
153
173
  return {
154
- code: f[0] ?? '',
174
+ code: f[0] ?? "",
155
175
  mainInflow: safeNumber(f[1]),
156
176
  mainOutflow: safeNumber(f[2]),
157
177
  mainNet: safeNumber(f[3]),
@@ -161,52 +181,48 @@ export class TencentStockSDK {
161
181
  retailNet: safeNumber(f[7]),
162
182
  retailNetRatio: safeNumber(f[8]),
163
183
  totalFlow: safeNumber(f[9]),
164
- name: f[12] ?? '',
165
- date: f[13] ?? '',
166
- raw: f,
184
+ name: f[12] ?? "",
185
+ date: f[13] ?? "",
186
+ raw: f
167
187
  };
168
188
  }
169
-
170
189
  // ---------- 盘口大单占比 ----------
171
190
  /**
172
191
  * 获取盘口大单占比
173
192
  * @param codes 如 ['s_pksz000858']
174
193
  */
175
- async getPanelLargeOrder(codes: string[]): Promise<PanelLargeOrder[]> {
176
- const data = await this.fetch(codes.join(','));
194
+ async getPanelLargeOrder(codes) {
195
+ const data = await this.fetch(codes.join(","));
177
196
  return data.map((d) => this.parsePanelLargeOrder(d.fields));
178
197
  }
179
-
180
- private parsePanelLargeOrder(f: string[]): PanelLargeOrder {
198
+ parsePanelLargeOrder(f) {
181
199
  return {
182
200
  buyLargeRatio: safeNumber(f[0]),
183
201
  buySmallRatio: safeNumber(f[1]),
184
202
  sellLargeRatio: safeNumber(f[2]),
185
203
  sellSmallRatio: safeNumber(f[3]),
186
- raw: f,
204
+ raw: f
187
205
  };
188
206
  }
189
-
190
207
  // ---------- 港股扩展行情 ----------
191
208
  /**
192
209
  * 获取港股扩展行情
193
210
  * @param codes 如 ['r_hk09988']
194
211
  */
195
- async getHKQuotes(codes: string[]): Promise<HKQuote[]> {
196
- const data = await this.fetch(codes.join(','));
212
+ async getHKQuotes(codes) {
213
+ const data = await this.fetch(codes.join(","));
197
214
  return data.map((d) => this.parseHKQuote(d.fields));
198
215
  }
199
-
200
- private parseHKQuote(f: string[]): HKQuote {
216
+ parseHKQuote(f) {
201
217
  return {
202
- marketId: f[0] ?? '',
203
- name: f[1] ?? '',
204
- code: f[2] ?? '',
218
+ marketId: f[0] ?? "",
219
+ name: f[1] ?? "",
220
+ code: f[2] ?? "",
205
221
  price: safeNumber(f[3]),
206
222
  prevClose: safeNumber(f[4]),
207
223
  open: safeNumber(f[5]),
208
224
  volume: safeNumber(f[6]),
209
- time: f[30] ?? '',
225
+ time: f[30] ?? "",
210
226
  change: safeNumber(f[31]),
211
227
  changePercent: safeNumber(f[32]),
212
228
  high: safeNumber(f[33]),
@@ -215,67 +231,65 @@ export class TencentStockSDK {
215
231
  lotSize: safeNumberOrNull(f[40]),
216
232
  circulatingMarketCap: safeNumberOrNull(f[46]),
217
233
  totalMarketCap: safeNumberOrNull(f[47]),
218
- currency: f[f.length - 3] ?? '',
219
- raw: f,
234
+ currency: f[f.length - 3] ?? "",
235
+ raw: f
220
236
  };
221
237
  }
222
-
223
238
  // ---------- 美股简要行情 ----------
224
239
  /**
225
240
  * 获取美股简要行情
226
241
  * @param codes 如 ['s_usBABA']
227
242
  */
228
- async getUSQuotes(codes: string[]): Promise<USQuote[]> {
229
- const data = await this.fetch(codes.join(','));
243
+ async getUSQuotes(codes) {
244
+ const data = await this.fetch(codes.join(","));
230
245
  return data.map((d) => this.parseUSQuote(d.fields));
231
246
  }
232
-
233
- private parseUSQuote(f: string[]): USQuote {
247
+ parseUSQuote(f) {
234
248
  return {
235
- marketId: f[0] ?? '',
236
- name: f[1] ?? '',
237
- code: f[2] ?? '',
249
+ marketId: f[0] ?? "",
250
+ name: f[1] ?? "",
251
+ code: f[2] ?? "",
238
252
  price: safeNumber(f[3]),
239
253
  change: safeNumber(f[4]),
240
254
  changePercent: safeNumber(f[5]),
241
255
  volume: safeNumber(f[6]),
242
256
  amount: safeNumber(f[7]),
243
257
  marketCap: safeNumberOrNull(f[8]),
244
- raw: f,
258
+ raw: f
245
259
  };
246
260
  }
247
-
248
261
  // ---------- 公募基金行情 ----------
249
262
  /**
250
263
  * 获取公募基金行情
251
264
  * @param codes 如 ['jj000001']
252
265
  */
253
- async getFundQuotes(codes: string[]): Promise<FundQuote[]> {
254
- const data = await this.fetch(codes.join(','));
266
+ async getFundQuotes(codes) {
267
+ const data = await this.fetch(codes.join(","));
255
268
  return data.map((d) => this.parseFundQuote(d.fields));
256
269
  }
257
-
258
- private parseFundQuote(f: string[]): FundQuote {
270
+ parseFundQuote(f) {
259
271
  return {
260
- code: f[0] ?? '',
261
- name: f[1] ?? '',
272
+ code: f[0] ?? "",
273
+ name: f[1] ?? "",
262
274
  nav: safeNumber(f[5]),
263
275
  accNav: safeNumber(f[6]),
264
276
  change: safeNumber(f[7]),
265
- navDate: f[8] ?? '',
266
- raw: f,
277
+ navDate: f[8] ?? "",
278
+ raw: f
267
279
  };
268
280
  }
269
-
270
281
  // ---------- 批量混合查询 ----------
271
282
  /**
272
283
  * 批量混合查询,返回原始解析结果(key + fields)
273
284
  * @param params 如 'sz000858,s_sh000001,jj000001'
274
285
  */
275
- async batchRaw(params: string): Promise<{ key: string; fields: string[] }[]> {
286
+ async batchRaw(params) {
276
287
  return this.fetch(params);
277
288
  }
278
- }
279
-
280
- export default TencentStockSDK;
281
-
289
+ };
290
+ var index_default = TencentStockSDK;
291
+ // Annotate the CommonJS export names for ESM import in node:
292
+ 0 && (module.exports = {
293
+ TencentStockSDK
294
+ });
295
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import axios, { AxiosInstance } from 'axios';\nimport {\n FullQuote,\n SimpleQuote,\n FundFlow,\n PanelLargeOrder,\n HKQuote,\n USQuote,\n FundQuote,\n} from './types';\n\nexport * from './types';\n\nconst BASE_URL = 'http://qt.gtimg.cn';\n\n/**\n * 检测是否在浏览器环境\n */\nfunction isBrowser(): boolean {\n return typeof window !== 'undefined' && typeof window.document !== 'undefined';\n}\n\n/**\n * 将 ArrayBuffer 解码为 GBK 字符串\n * 浏览器端使用 TextDecoder,Node.js 端使用 iconv-lite\n */\nasync function decodeGBK(data: ArrayBuffer): Promise<string> {\n if (isBrowser()) {\n // 浏览器端使用 TextDecoder (原生支持 GBK)\n const decoder = new TextDecoder('gbk');\n return decoder.decode(data);\n } else {\n // Node.js 端使用 iconv-lite\n // 动态导入返回模块对象,需要处理 ESM/CJS 兼容性\n const iconvModule = await import('iconv-lite');\n const iconv = iconvModule.default || iconvModule;\n return iconv.decode(Buffer.from(data), 'gbk');\n }\n}\n\nfunction safeNumber(val: string | undefined): number {\n if (!val || val === '') return 0;\n const n = parseFloat(val);\n return Number.isNaN(n) ? 0 : n;\n}\n\nfunction safeNumberOrNull(val: string | undefined): number | null {\n if (!val || val === '') return null;\n const n = parseFloat(val);\n return Number.isNaN(n) ? null : n;\n}\n\n/**\n * 解析响应文本,按 `;` 拆行,提取 `v_xxx=\"...\"` 里的内容,返回 { key, fields }[]\n */\nfunction parseResponse(text: string): { key: string; fields: string[] }[] {\n const lines = text.split(';').map((l) => l.trim()).filter(Boolean);\n const results: { key: string; fields: string[] }[] = [];\n for (const line of lines) {\n const eqIdx = line.indexOf('=');\n if (eqIdx < 0) continue;\n let key = line.slice(0, eqIdx).trim();\n if (key.startsWith('v_')) key = key.slice(2);\n let raw = line.slice(eqIdx + 1).trim();\n if (raw.startsWith('\"') && raw.endsWith('\"')) {\n raw = raw.slice(1, -1);\n }\n const fields = raw.split('~');\n results.push({ key, fields });\n }\n return results;\n}\n\nexport class TencentStockSDK {\n private client: AxiosInstance;\n\n constructor() {\n this.client = axios.create({\n baseURL: BASE_URL,\n responseType: 'arraybuffer',\n timeout: 10000,\n });\n }\n\n private async fetch(params: string): Promise<{ key: string; fields: string[] }[]> {\n const resp = await this.client.get('/', { params: { q: params } });\n const text = await decodeGBK(resp.data);\n return parseResponse(text);\n }\n\n // ---------- 实时全量行情 ----------\n /**\n * 获取 A 股 / 指数 全量行情\n * @param codes 如 ['sz000858', 'sh600000']\n */\n async getFullQuotes(codes: string[]): Promise<FullQuote[]> {\n const data = await this.fetch(codes.join(','));\n return data.map((d) => this.parseFullQuote(d.fields));\n }\n\n private parseFullQuote(f: string[]): FullQuote {\n const bid: { price: number; volume: number }[] = [];\n for (let i = 0; i < 5; i++) {\n bid.push({ price: safeNumber(f[9 + i * 2]), volume: safeNumber(f[10 + i * 2]) });\n }\n const ask: { price: number; volume: number }[] = [];\n for (let i = 0; i < 5; i++) {\n ask.push({ price: safeNumber(f[19 + i * 2]), volume: safeNumber(f[20 + i * 2]) });\n }\n return {\n marketId: f[0] ?? '',\n name: f[1] ?? '',\n code: f[2] ?? '',\n price: safeNumber(f[3]),\n prevClose: safeNumber(f[4]),\n open: safeNumber(f[5]),\n volume: safeNumber(f[6]),\n outerVolume: safeNumber(f[7]),\n innerVolume: safeNumber(f[8]),\n bid,\n ask,\n time: f[30] ?? '',\n change: safeNumber(f[31]),\n changePercent: safeNumber(f[32]),\n high: safeNumber(f[33]),\n low: safeNumber(f[34]),\n volume2: safeNumber(f[36]),\n amount: safeNumber(f[37]),\n turnoverRate: safeNumberOrNull(f[38]),\n pe: safeNumberOrNull(f[39]),\n circulatingMarketCap: safeNumberOrNull(f[44]),\n totalMarketCap: safeNumberOrNull(f[45]),\n pb: safeNumberOrNull(f[46]),\n limitUp: safeNumberOrNull(f[47]),\n limitDown: safeNumberOrNull(f[48]),\n raw: f,\n };\n }\n\n // ---------- 简要行情 ----------\n /**\n * 获取简要行情\n * @param codes 如 ['s_sz000858', 's_sh000001']\n */\n async getSimpleQuotes(codes: string[]): Promise<SimpleQuote[]> {\n const data = await this.fetch(codes.join(','));\n return data.map((d) => this.parseSimpleQuote(d.fields));\n }\n\n private parseSimpleQuote(f: string[]): SimpleQuote {\n return {\n marketId: f[0] ?? '',\n name: f[1] ?? '',\n code: f[2] ?? '',\n price: safeNumber(f[3]),\n change: safeNumber(f[4]),\n changePercent: safeNumber(f[5]),\n volume: safeNumber(f[6]),\n amount: safeNumber(f[7]),\n marketCap: safeNumberOrNull(f[9]),\n marketType: f[10] ?? '',\n raw: f,\n };\n }\n\n // ---------- 资金流向 ----------\n /**\n * 获取资金流向\n * @param codes 如 ['ff_sz000858']\n */\n async getFundFlow(codes: string[]): Promise<FundFlow[]> {\n const data = await this.fetch(codes.join(','));\n return data.map((d) => this.parseFundFlow(d.fields));\n }\n\n private parseFundFlow(f: string[]): FundFlow {\n return {\n code: f[0] ?? '',\n mainInflow: safeNumber(f[1]),\n mainOutflow: safeNumber(f[2]),\n mainNet: safeNumber(f[3]),\n mainNetRatio: safeNumber(f[4]),\n retailInflow: safeNumber(f[5]),\n retailOutflow: safeNumber(f[6]),\n retailNet: safeNumber(f[7]),\n retailNetRatio: safeNumber(f[8]),\n totalFlow: safeNumber(f[9]),\n name: f[12] ?? '',\n date: f[13] ?? '',\n raw: f,\n };\n }\n\n // ---------- 盘口大单占比 ----------\n /**\n * 获取盘口大单占比\n * @param codes 如 ['s_pksz000858']\n */\n async getPanelLargeOrder(codes: string[]): Promise<PanelLargeOrder[]> {\n const data = await this.fetch(codes.join(','));\n return data.map((d) => this.parsePanelLargeOrder(d.fields));\n }\n\n private parsePanelLargeOrder(f: string[]): PanelLargeOrder {\n return {\n buyLargeRatio: safeNumber(f[0]),\n buySmallRatio: safeNumber(f[1]),\n sellLargeRatio: safeNumber(f[2]),\n sellSmallRatio: safeNumber(f[3]),\n raw: f,\n };\n }\n\n // ---------- 港股扩展行情 ----------\n /**\n * 获取港股扩展行情\n * @param codes 如 ['r_hk09988']\n */\n async getHKQuotes(codes: string[]): Promise<HKQuote[]> {\n const data = await this.fetch(codes.join(','));\n return data.map((d) => this.parseHKQuote(d.fields));\n }\n\n private parseHKQuote(f: string[]): HKQuote {\n return {\n marketId: f[0] ?? '',\n name: f[1] ?? '',\n code: f[2] ?? '',\n price: safeNumber(f[3]),\n prevClose: safeNumber(f[4]),\n open: safeNumber(f[5]),\n volume: safeNumber(f[6]),\n time: f[30] ?? '',\n change: safeNumber(f[31]),\n changePercent: safeNumber(f[32]),\n high: safeNumber(f[33]),\n low: safeNumber(f[34]),\n amount: safeNumber(f[36]),\n lotSize: safeNumberOrNull(f[40]),\n circulatingMarketCap: safeNumberOrNull(f[46]),\n totalMarketCap: safeNumberOrNull(f[47]),\n currency: f[f.length - 3] ?? '',\n raw: f,\n };\n }\n\n // ---------- 美股简要行情 ----------\n /**\n * 获取美股简要行情\n * @param codes 如 ['s_usBABA']\n */\n async getUSQuotes(codes: string[]): Promise<USQuote[]> {\n const data = await this.fetch(codes.join(','));\n return data.map((d) => this.parseUSQuote(d.fields));\n }\n\n private parseUSQuote(f: string[]): USQuote {\n return {\n marketId: f[0] ?? '',\n name: f[1] ?? '',\n code: f[2] ?? '',\n price: safeNumber(f[3]),\n change: safeNumber(f[4]),\n changePercent: safeNumber(f[5]),\n volume: safeNumber(f[6]),\n amount: safeNumber(f[7]),\n marketCap: safeNumberOrNull(f[8]),\n raw: f,\n };\n }\n\n // ---------- 公募基金行情 ----------\n /**\n * 获取公募基金行情\n * @param codes 如 ['jj000001']\n */\n async getFundQuotes(codes: string[]): Promise<FundQuote[]> {\n const data = await this.fetch(codes.join(','));\n return data.map((d) => this.parseFundQuote(d.fields));\n }\n\n private parseFundQuote(f: string[]): FundQuote {\n return {\n code: f[0] ?? '',\n name: f[1] ?? '',\n nav: safeNumber(f[5]),\n accNav: safeNumber(f[6]),\n change: safeNumber(f[7]),\n navDate: f[8] ?? '',\n raw: f,\n };\n }\n\n // ---------- 批量混合查询 ----------\n /**\n * 批量混合查询,返回原始解析结果(key + fields)\n * @param params 如 'sz000858,s_sh000001,jj000001'\n */\n async batchRaw(params: string): Promise<{ key: string; fields: string[] }[]> {\n return this.fetch(params);\n }\n}\n\nexport default TencentStockSDK;\n\n"],"mappings":"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","names":["axios"]}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * A 股 / 指数 全量行情
3
3
  */
4
- export interface FullQuote {
4
+ interface FullQuote {
5
5
  /** 市场标识 */
6
6
  marketId: string;
7
7
  /** 名称 */
@@ -64,7 +64,7 @@ export interface FullQuote {
64
64
  /**
65
65
  * 简要行情(股票 / 指数)
66
66
  */
67
- export interface SimpleQuote {
67
+ interface SimpleQuote {
68
68
  marketId: string;
69
69
  name: string;
70
70
  code: string;
@@ -82,7 +82,7 @@ export interface SimpleQuote {
82
82
  /**
83
83
  * 资金流向
84
84
  */
85
- export interface FundFlow {
85
+ interface FundFlow {
86
86
  code: string;
87
87
  /** 主力流入 */
88
88
  mainInflow: number;
@@ -109,7 +109,7 @@ export interface FundFlow {
109
109
  /**
110
110
  * 盘口大单占比
111
111
  */
112
- export interface PanelLargeOrder {
112
+ interface PanelLargeOrder {
113
113
  /** 买盘大单占比 */
114
114
  buyLargeRatio: number;
115
115
  /** 买盘小单占比 */
@@ -123,7 +123,7 @@ export interface PanelLargeOrder {
123
123
  /**
124
124
  * 港股扩展行情
125
125
  */
126
- export interface HKQuote {
126
+ interface HKQuote {
127
127
  marketId: string;
128
128
  name: string;
129
129
  code: string;
@@ -146,7 +146,7 @@ export interface HKQuote {
146
146
  /**
147
147
  * 美股简要行情
148
148
  */
149
- export interface USQuote {
149
+ interface USQuote {
150
150
  marketId: string;
151
151
  name: string;
152
152
  code: string;
@@ -161,7 +161,7 @@ export interface USQuote {
161
161
  /**
162
162
  * 公募基金行情
163
163
  */
164
- export interface FundQuote {
164
+ interface FundQuote {
165
165
  code: string;
166
166
  name: string;
167
167
  /** 最新单位净值 */
@@ -174,4 +174,61 @@ export interface FundQuote {
174
174
  navDate: string;
175
175
  raw: string[];
176
176
  }
177
- //# sourceMappingURL=types.d.ts.map
177
+
178
+ declare class TencentStockSDK {
179
+ private client;
180
+ constructor();
181
+ private fetch;
182
+ /**
183
+ * 获取 A 股 / 指数 全量行情
184
+ * @param codes 如 ['sz000858', 'sh600000']
185
+ */
186
+ getFullQuotes(codes: string[]): Promise<FullQuote[]>;
187
+ private parseFullQuote;
188
+ /**
189
+ * 获取简要行情
190
+ * @param codes 如 ['s_sz000858', 's_sh000001']
191
+ */
192
+ getSimpleQuotes(codes: string[]): Promise<SimpleQuote[]>;
193
+ private parseSimpleQuote;
194
+ /**
195
+ * 获取资金流向
196
+ * @param codes 如 ['ff_sz000858']
197
+ */
198
+ getFundFlow(codes: string[]): Promise<FundFlow[]>;
199
+ private parseFundFlow;
200
+ /**
201
+ * 获取盘口大单占比
202
+ * @param codes 如 ['s_pksz000858']
203
+ */
204
+ getPanelLargeOrder(codes: string[]): Promise<PanelLargeOrder[]>;
205
+ private parsePanelLargeOrder;
206
+ /**
207
+ * 获取港股扩展行情
208
+ * @param codes 如 ['r_hk09988']
209
+ */
210
+ getHKQuotes(codes: string[]): Promise<HKQuote[]>;
211
+ private parseHKQuote;
212
+ /**
213
+ * 获取美股简要行情
214
+ * @param codes 如 ['s_usBABA']
215
+ */
216
+ getUSQuotes(codes: string[]): Promise<USQuote[]>;
217
+ private parseUSQuote;
218
+ /**
219
+ * 获取公募基金行情
220
+ * @param codes 如 ['jj000001']
221
+ */
222
+ getFundQuotes(codes: string[]): Promise<FundQuote[]>;
223
+ private parseFundQuote;
224
+ /**
225
+ * 批量混合查询,返回原始解析结果(key + fields)
226
+ * @param params 如 'sz000858,s_sh000001,jj000001'
227
+ */
228
+ batchRaw(params: string): Promise<{
229
+ key: string;
230
+ fields: string[];
231
+ }[]>;
232
+ }
233
+
234
+ export { type FullQuote, type FundFlow, type FundQuote, type HKQuote, type PanelLargeOrder, type SimpleQuote, TencentStockSDK, type USQuote, TencentStockSDK as default };