Glanceway Glanceway
所有資料來源

股价监控

財經 v1.0.0

在菜单栏实时监控 A 股股价。 显示当前价格、涨跌额和涨跌幅。

@codytseng #stock #finance #china #a-share

設定項目

名稱 類型 必填 預設值 描述
股票代码 STOCK_CODES list 股票代码(例如 600519, 000001, 300750)

原始碼

version: 1.0.0
name: 股价监控
description: |
  在菜单栏实时监控 A 股股价。
  显示当前价格、涨跌额和涨跌幅。
author: codytseng
author_url: https://github.com/codytseng
category: Finance
tags:
  - stock
  - finance
  - china
  - a-share

config:
  - key: STOCK_CODES
    name: 股票代码
    type: list
    required: true
    description: "股票代码(例如 600519, 000001, 300750)"
function toSecId(code) {
  const c = code.trim();
  // Shanghai: starts with 6
  if (c.startsWith("6")) return `1.${c}`;
  // Shenzhen: starts with 0 or 3
  return `0.${c}`;
}

function marketLabel(market) {
  return market === 1 ? "SH" : "SZ";
}

module.exports = async (api) => {
  const codes = api.config.get("STOCK_CODES") ?? [];

  async function fetchData() {
    if (codes.length === 0) {
      api.emit([]);
      return;
    }

    const secIds = codes.map(toSecId).join(",");
    const url = `https://push2.eastmoney.com/api/qt/ulist.np/get?secids=${secIds}&fields=f1,f2,f3,f4,f12,f13,f14`;

    const response = await api.fetch(url);

    if (!response.ok || !response.json?.data?.diff) {
      throw new Error(
        `Failed to fetch stock data (HTTP ${response.status})`,
      );
    }

    const items = response.json.data.diff.map((stock) => {
      const precision = stock.f1;
      const divisor = Math.pow(10, precision);
      const priceVal = stock.f2 / divisor;
      const changeVal = stock.f4 / divisor;
      const changePctVal = stock.f3 / divisor;

      const arrow = changePctVal > 0 ? "↑" : changePctVal < 0 ? "↓" : "";
      const sign = changePctVal > 0 ? "+" : "";
      const ml = marketLabel(stock.f13);

      const price = priceVal.toFixed(precision);
      const change = changeVal.toFixed(precision);
      const changePct = changePctVal.toFixed(2);

      return {
        id: `${ml}${stock.f12}`,
        title: `${stock.f14} (${ml}${stock.f12})`,
        subtitle: `${price} ${arrow} ${sign}${change} (${sign}${changePct}%)`,
        url: `https://quote.eastmoney.com/${ml.toLowerCase()}${stock.f12}.html`,
      };
    });

    api.emit(items);
  }

  await fetchData();

  return {
    refresh: fetchData,
  };
};