灵猴市集Linghou Market

东方财富市场排行

东方财富eastmoney-market-rank

东方财富市场排行 用途 读取东方财富市场排行,按涨幅、跌幅、成交额、成交量、振幅或换手率返回股票列表。 执行前提 先打开东方财富相关页面,例如 https://quote.eastmoney.com/,再在当前标签页执行。接口为公开行情接口,通常无需登录;若访问频率过高、网络受限或接口策略调整,可能返回空数据或请求失败。脚本不会尝试绕过验证码、风控或访问限…

股票排行行情
版本1.0.0
扫描passed
更新2026-06-28
超时30000ms

匹配范围

*://*.eastmoney.com/*

排除范围

未声明

能力声明

dom.read

代码

源码已展开
1const 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}));