匹配范围
*://*.eastmoney.com/*eastmoney-market-rank东方财富市场排行 用途 读取东方财富市场排行,按涨幅、跌幅、成交额、成交量、振幅或换手率返回股票列表。 执行前提 先打开东方财富相关页面,例如 https://quote.eastmoney.com/,再在当前标签页执行。接口为公开行情接口,通常无需登录;若访问频率过高、网络受限或接口策略调整,可能返回空数据或请求失败。脚本不会尝试绕过验证码、风控或访问限…
*://*.eastmoney.com/*dom.read1const rawParams = params && typeof params === "object" ? params : {};2 3const MARKETS = {4 "hs-a": "m:0+t:6,m:0+t:80,m:1+t:2,m:1+t:23,m:0+t:81+s:2048",5 "sh-a": "m:1+t:2,m:1+t:23",6 "sz-a": "m:0+t:6,m:0+t:80",7 "bj-a": "m:0+t:81+s:2048",8 cyb: "m:0+t:80",9 kcb: "m:1+t:23",10 hk: "m:116+t:3,m:116+t:4,m:116+t:1,m:116+t:2",11 us: "m:105,m:106,m:107",12};13 14const SORTS = {15 change: { fid: "f3", order: "desc" },16 drop: { fid: "f3", order: "asc" },17 turnover: { fid: "f6", order: "desc" },18 volume: { fid: "f5", order: "desc" },19 amplitude: { fid: "f7", order: "desc" },20 rate: { fid: "f8", order: "desc" },21};22 23const FIELDS = "f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23";24 25function stringParam(name, fallback) {26 const raw = rawParams[name];27 if (raw === undefined || raw === null || raw === "") return fallback;28 return String(raw).trim().toLowerCase();29}30 31function integerParam(name, fallback, min, max) {32 const raw = rawParams[name];33 const value = raw === undefined || raw === null || raw === "" ? fallback : Number(raw);34 if (!Number.isInteger(value) || value < min || value > max) {35 throw new Error(`${name} must be an integer between ${min} and ${max}`);36 }37 return value;38}39 40async function readJson(response) {41 try {42 return await response.json();43 } catch {44 throw new Error("Response is not valid JSON");45 }46}47 48const market = stringParam("market", "hs-a");49const sortKey = stringParam("sort", "change");50const limit = integerParam("limit", 20, 1, 100);51 52const fs = MARKETS[market];53if (!fs) {54 throw new Error(`market must be one of ${Object.keys(MARKETS).join(", ")}`);55}56 57const sort = SORTS[sortKey];58if (!sort) {59 throw new Error(`sort must be one of ${Object.keys(SORTS).join(", ")}`);60}61 62const url = new URL("https://push2.eastmoney.com/api/qt/clist/get");63url.searchParams.set("pn", "1");64url.searchParams.set("pz", String(limit));65url.searchParams.set("po", sort.order === "desc" ? "1" : "0");66url.searchParams.set("np", "1");67url.searchParams.set("fltt", "2");68url.searchParams.set("invt", "2");69url.searchParams.set("fid", sort.fid);70url.searchParams.set("fs", fs);71url.searchParams.set("fields", FIELDS);72url.searchParams.set("ut", "bd1d9ddb04089700cf9c27f6f7426281");73 74const response = await fetch(url.toString(), {75 headers: { Accept: "application/json" },76 credentials: "omit",77});78 79if (!response.ok) {80 throw new Error(`Rank request failed with HTTP ${response.status}`);81}82 83const payload = await readJson(response);84const rows = Array.isArray(payload?.data?.diff) ? payload.data.diff : [];85 86if (rows.length === 0) {87 throw new Error(`No rank data returned for market=${market}, sort=${sortKey}`);88}89 90return rows.slice(0, limit).map((item, index) => ({91 rank: index + 1,92 code: item.f12,93 name: item.f14,94 price: item.f2,95 changePercent: item.f3,96 change: item.f4,97 turnover: item.f6,98 volume: item.f5,99 turnoverRate: item.f8,100 amplitude: item.f7,101 peDynamic: item.f9,102 volumeRatio: item.f10,103 marketCap: item.f20,104 floatMarketCap: item.f21,105}));