koishi-plugin-starfx-bot 0.19.0 → 0.19.2

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.
package/lib/index.js CHANGED
@@ -405,12 +405,54 @@ __name(drawBanGDream, "drawBanGDream");
405
405
  async function intervalGetExchangeRate(ctx, cfg, session, searchString, exchangeRatePath) {
406
406
  }
407
407
  __name(intervalGetExchangeRate, "intervalGetExchangeRate");
408
- async function getExchangeRate(ctx, cfg, session, searchString) {
408
+ async function parseNaturalCurrency(searchString) {
409
+ const index = await getCurrencyCodesMap();
410
+ const s = searchString.replace(/\s+/g, "");
411
+ const match = s.match(/(.+?)(兑|对)(.+)/);
412
+ if (match) {
413
+ const from = index[match[1]];
414
+ const to = index[match[3]];
415
+ if (from && to) {
416
+ return from + to;
417
+ }
418
+ }
419
+ if (index[s]) {
420
+ return index[s];
421
+ }
422
+ return null;
423
+ }
424
+ __name(parseNaturalCurrency, "parseNaturalCurrency");
425
+ async function getExchangeRate(ctx, cfg, session, searchString, raw, retryTimes = 1) {
426
+ const apiKey = retryTimes ? await getMvpAPIKey() : await updateMvpAPIKey();
409
427
  try {
410
- const apiKey = await getMvpAPIKey();
411
- const guids = await getExchangeGuids(searchString, apiKey);
428
+ let guids = [];
429
+ if (searchString) {
430
+ const parsed = await parseNaturalCurrency(searchString);
431
+ if (parsed) {
432
+ searchString = parsed;
433
+ }
434
+ }
435
+ if (raw && /^([a-z0-9]{6})([,\s]([a-z0-9]{6}))*$/.test(raw)) {
436
+ guids = raw.split(",");
437
+ } else if (/^([a-zA-Z]{3}|[a-zA-Z]{6})([,\s]([a-zA-Z]{3}|[a-zA-Z]{6}))*$/.test(searchString)) {
438
+ const currencies = await getCurrencyCodes();
439
+ const codes = searchString.split(/[,\s]+/);
440
+ const invalidCodes = [];
441
+ let search6Strings = [];
442
+ codes.forEach((code) => {
443
+ const first = code.slice(0, 3).toUpperCase();
444
+ const second = code.length === 3 ? "CNY" : code.slice(3, 6).toUpperCase();
445
+ search6Strings.push(code.length === 3 ? first + second : code);
446
+ if (!currencies.some((c) => c.code === first)) invalidCodes.push(first);
447
+ if (code.length === 6 && !currencies.some((c) => c.code === second)) invalidCodes.push(second);
448
+ });
449
+ if (invalidCodes.length > 0) {
450
+ throw new Error(`输入的货币代码不合法: ${invalidCodes.join(", ")}`);
451
+ }
452
+ guids = await getExchangeGuids(search6Strings.join(","), apiKey);
453
+ }
412
454
  if (!guids.length || guids.every((g) => !g)) {
413
- throw new Error("Invalid symbols");
455
+ throw new Error(`输入无效: ${searchString}`);
414
456
  }
415
457
  const result = [];
416
458
  for (const guid of guids) {
@@ -422,28 +464,35 @@ async function getExchangeRate(ctx, cfg, session, searchString) {
422
464
  if (!nowPrice || !oneMonthPrice) {
423
465
  throw new Error("Failed to fetch price");
424
466
  }
425
- const chartBuffer = await drawOneMonthChartSkia(oneMonthPrice.prices, oneMonthPrice.timeStamps);
467
+ const chartBuffer = await drawOneMonthChartSkia(oneMonthPrice.prices, oneMonthPrice.timeStamps, `1 ${nowPrice.fromCurrency} to 1 ${nowPrice.currency}`);
426
468
  const imgSrc = "data:image/png;base64," + chartBuffer.toString("base64");
427
469
  result.push({
428
470
  name: nowPrice.symbolName,
471
+ fromCurrency: nowPrice.fromCurrency,
472
+ currency: nowPrice.currency,
429
473
  nowPrice: nowPrice.price,
430
474
  oneMonthChart: import_koishi.h.image(imgSrc)
431
475
  });
432
476
  }
433
477
  for (const item of result) {
434
478
  await session.send([
435
- import_koishi.h.text((/* @__PURE__ */ new Date()).toLocaleString()),
436
479
  import_koishi.h.text(`
480
+ ${(/* @__PURE__ */ new Date()).toLocaleString()}
437
481
  ${item.name}
438
- 当前价格: `),
439
- import_koishi.h.text(`${item.nowPrice}
440
- 近30天价格走势: `),
482
+ (${item.fromCurrency}/${item.currency})
483
+ 当前价格: ${item.nowPrice}
484
+ 近30天价格走势:
485
+ `),
441
486
  item.oneMonthChart
442
487
  ]);
443
488
  }
444
489
  } catch (err) {
445
- const message = err instanceof Error ? err.message : typeof err === "string" ? err : JSON.stringify(err);
446
- await session.send(`查询失败:${message}`);
490
+ if (retryTimes === 0) {
491
+ const message = err instanceof Error ? err.message : typeof err === "string" ? err : JSON.stringify(err);
492
+ await session.send(`查询失败:${message}`);
493
+ } else {
494
+ await getExchangeRate(ctx, cfg, session, searchString, raw, retryTimes - 1);
495
+ }
447
496
  }
448
497
  }
449
498
  __name(getExchangeRate, "getExchangeRate");
@@ -696,8 +745,9 @@ async function updateMvpAPIKey() {
696
745
  const apiResp = await fetch(apiUrl);
697
746
  if (!apiResp.ok) throw new Error(`Failed to fetch config API: ${apiResp.status}`);
698
747
  const json = await apiResp.json();
699
- const mvpAPIkey = json?.configs?.["shared/msn-ns/CommonAutoSuggest/default"]?.properties?.["mvpAPIkey"] ?? null;
700
- return mvpAPIkey;
748
+ const newMvpAPIKey = json?.configs?.["shared/msn-ns/CommonAutoSuggest/default"]?.properties?.["mvpAPIkey"] ?? null;
749
+ mvpAPIKey = newMvpAPIKey;
750
+ return newMvpAPIKey;
701
751
  } catch (err) {
702
752
  console.error(err);
703
753
  return null;
@@ -714,7 +764,8 @@ async function getExchangeGuids(symbols, apikey) {
714
764
  const url = `https://assets.msn.cn/service/Finance/IdMap?apikey=${apikey}&MStarIds=${encodeURIComponent(symbols)}`;
715
765
  const resp = await fetch(url);
716
766
  if (!resp.ok) throw new Error(`请求失败: ${resp.status}`);
717
- const data = await resp.json();
767
+ let data = await resp.json();
768
+ data = data.filter((d) => d.status === 200);
718
769
  const inputSymbols = symbols.split(",");
719
770
  const guidMap = new Map(data.map((item) => [item.mStarId, item.guid]));
720
771
  return inputSymbols.map((sym) => guidMap.get(sym) || "");
@@ -744,11 +795,13 @@ async function getQuotes(ids, apiKey) {
744
795
  q.instrumentId,
745
796
  {
746
797
  price: q.price,
747
- symbolName: q.localizedAttributes?.["zh-cn"]?.symbolName || q.symbol
798
+ symbolName: q.localizedAttributes?.["zh-cn"]?.symbolName || q.localizedAttributes?.["zh-cn"]?.displayName || q.symbol,
799
+ fromCurrency: q.fromCurrency || q.displayName,
800
+ currency: q.currency
748
801
  }
749
802
  ])
750
803
  );
751
- return inputIds.map((id) => quoteMap.get(id) ?? { price: 0, symbolName: "" });
804
+ return inputIds.map((id) => quoteMap.get(id) ?? { price: 0, symbolName: "", fromCurrency: "", currency: "" });
752
805
  } catch (err) {
753
806
  console.error(err);
754
807
  return [];
@@ -775,7 +828,7 @@ async function getMonthMSNClosePrices(ids, apiKey) {
775
828
  });
776
829
  }
777
830
  __name(getMonthMSNClosePrices, "getMonthMSNClosePrices");
778
- async function drawOneMonthChartSkia(prices, timeStamps, width = 1200, height = 600) {
831
+ async function drawOneMonthChartSkia(prices, timeStamps, title = "兑换汇率", width = 1200, height = 600) {
779
832
  if (!prices.length || !timeStamps.length || prices.length !== timeStamps.length) return;
780
833
  const dataPoints = timeStamps.map((t, i) => ({ x: new Date(t), y: prices[i] }));
781
834
  const canvas = new import_skia_canvas.Canvas(width, height);
@@ -793,7 +846,7 @@ async function drawOneMonthChartSkia(prices, timeStamps, width = 1200, height =
793
846
  type: "line",
794
847
  data: {
795
848
  datasets: [{
796
- label: "兑换汇率",
849
+ label: title,
797
850
  data: dataPoints,
798
851
  showLine: true,
799
852
  // ⭐ 不连线,只画点
@@ -802,9 +855,17 @@ async function drawOneMonthChartSkia(prices, timeStamps, width = 1200, height =
802
855
  pointBorderWidth: 0,
803
856
  // ⭐ 去掉外边框 → 变成实心点
804
857
  borderWidth: 2,
805
- borderColor: "blue",
858
+ borderColor: "red",
806
859
  backgroundColor: "rgba(0,0,255,0.1)",
807
- tension: 0.2
860
+ tension: 0,
861
+ segment: {
862
+ borderDash: /* @__PURE__ */ __name((ctx) => {
863
+ const p0 = ctx.p0.parsed.x;
864
+ const p1 = ctx.p1.parsed.x;
865
+ const diffHours = (p1 - p0) / (1e3 * 60 * 60);
866
+ return diffHours > 2 ? [6, 4] : [];
867
+ }, "borderDash")
868
+ }
808
869
  }]
809
870
  },
810
871
  options: {
@@ -836,6 +897,32 @@ async function drawOneMonthChartSkia(prices, timeStamps, width = 1200, height =
836
897
  return await canvas.toBuffer("png");
837
898
  }
838
899
  __name(drawOneMonthChartSkia, "drawOneMonthChartSkia");
900
+ var currencyCodes = [];
901
+ async function getCurrencyCodes() {
902
+ if (currencyCodes?.length) return currencyCodes;
903
+ currencyCodes = require(import_node_path.default.resolve(__dirname, "./currency.json"));
904
+ return currencyCodes;
905
+ }
906
+ __name(getCurrencyCodes, "getCurrencyCodes");
907
+ var currencyCodesMap = {};
908
+ async function getCurrencyCodesMap() {
909
+ if (Object.keys(currencyCodesMap)?.length) return currencyCodesMap;
910
+ currencyCodesMap = await buildCurrencyIndex();
911
+ return currencyCodesMap;
912
+ }
913
+ __name(getCurrencyCodesMap, "getCurrencyCodesMap");
914
+ async function buildCurrencyIndex() {
915
+ const map = {};
916
+ (await getCurrencyCodes()).forEach((c) => {
917
+ map[c.country] = c.code;
918
+ map[c.currencyCn] = c.code;
919
+ });
920
+ map["日元"] = "JPY";
921
+ map["人民币"] = "CNY";
922
+ map["港币"] = "HKD";
923
+ return map;
924
+ }
925
+ __name(buildCurrencyIndex, "buildCurrencyIndex");
839
926
 
840
927
  // src/index.ts
841
928
  var import_node_path2 = __toESM(require("node:path"));
@@ -848,7 +935,7 @@ var package_default = {
848
935
  contributors: [
849
936
  "StarFreedomX <starfreedomx@outlook.com>"
850
937
  ],
851
- version: "0.19.0",
938
+ version: "0.19.1",
852
939
  main: "lib/index.js",
853
940
  typings: "lib/index.d.ts",
854
941
  files: [
@@ -1074,7 +1161,7 @@ function apply(ctx, cfg) {
1074
1161
  }
1075
1162
  if (cfg.roomNumber) {
1076
1163
  const roomNumMap = /* @__PURE__ */ new Map();
1077
- ctx.command("room-number [param: string]").action(async ({ session }, param) => {
1164
+ ctx.command("room-number [param: string]").usage("记录房间号").action(async ({ session }, param) => {
1078
1165
  const nowRoomNumMap = cfg.saveRoomAsFile ? readMap(cfg.saveRoomAsFile) : roomNumMap;
1079
1166
  const room = nowRoomNumMap.get(session.gid);
1080
1167
  if (!param) {
@@ -1098,7 +1185,7 @@ function apply(ctx, cfg) {
1098
1185
  }
1099
1186
  if (cfg.ready) {
1100
1187
  const readyMap = /* @__PURE__ */ new Map();
1101
- ctx.command("waiting-play [param:text]", { strictOptions: true }).action(async ({ session }, param) => {
1188
+ ctx.command("waiting-play [param:text]", { strictOptions: true }).usage("待机").action(async ({ session }, param) => {
1102
1189
  return ready(session, cfg, param, readyMap);
1103
1190
  });
1104
1191
  }
@@ -1108,13 +1195,13 @@ function apply(ctx, cfg) {
1108
1195
  });
1109
1196
  }
1110
1197
  if (cfg.undo) {
1111
- ctx.command("undo").alias("撤回").action(async ({ session }) => {
1198
+ ctx.command("undo").alias("撤回").usage("撤回消息").action(async ({ session }) => {
1112
1199
  if (detectControl(controlJson, session.guildId, "undo"))
1113
1200
  await undo(cfg, session);
1114
1201
  });
1115
1202
  }
1116
1203
  if (cfg.forward) {
1117
- ctx.command("forward").option("group", "-g <group:string>").option("platform", "-p <platform:string>").action(async ({ session, options }) => {
1204
+ ctx.command("forward").option("group", "-g <group:string>").option("platform", "-p <platform:string>").usage("转发消息").action(async ({ session, options }) => {
1118
1205
  if (detectControl(controlJson, session.guildId, "forward")) {
1119
1206
  const mapPath = import_node_path2.default.join(assetsDir, "forward.json");
1120
1207
  const groupMap = readMap(mapPath);
@@ -1140,7 +1227,7 @@ function apply(ctx, cfg) {
1140
1227
  });
1141
1228
  }
1142
1229
  if (cfg.originImg) {
1143
- ctx.command("获取X原图 <urls>").alias("推特原图").action(async ({ session }, urls) => {
1230
+ ctx.command("获取X原图 <urls>").alias("推特原图").usage("获取推特原图").action(async ({ session }, urls) => {
1144
1231
  if (detectControl(controlJson, session.guildId, "originImg")) {
1145
1232
  let [xUrls, xIndex] = await Promise.all([
1146
1233
  getXUrl(session?.quote?.content),
@@ -1154,9 +1241,9 @@ function apply(ctx, cfg) {
1154
1241
  });
1155
1242
  }
1156
1243
  if (cfg.searchExchangeRate) {
1157
- ctx.command("查汇率 [exchangeParam:string]").action(async ({ session }, exchangeParam) => {
1244
+ ctx.command("查汇率 <exchangeParam:text>").usage("查询当前汇率").example("查汇率 JPY : 查询日元兑换人民币的汇率(3位字母)").example("查汇率 JPYCNY : 查询日元兑换人民币的汇率(6位字母)").example("查汇率 -r avdzk2 : 查询日元兑换人民币的汇率(msn代码avdzk2)").example("查汇率 -r auvwoc : 查询黄金的价格(msn代码auvwoc, 很怪吧我也不知道为什么是这个)").option("raw", "-r <raw:string>").action(async ({ session, options }, exchangeParam) => {
1158
1245
  if (detectControl(controlJson, session.guildId, "exchangeRate")) {
1159
- return await getExchangeRate(ctx, cfg, session, exchangeParam);
1246
+ return await getExchangeRate(ctx, cfg, session, exchangeParam, options?.raw);
1160
1247
  }
1161
1248
  });
1162
1249
  }
package/lib/utils.d.ts CHANGED
@@ -130,7 +130,7 @@ export declare function drawBanGDream(avatar: string, inputOptions?: {
130
130
  border: string;
131
131
  }): Promise<string>;
132
132
  export declare function intervalGetExchangeRate(ctx: Context, cfg: Config, session: Session, searchString: string, exchangeRatePath: string): Promise<void>;
133
- export declare function getExchangeRate(ctx: Context, cfg: Config, session: Session, searchString: string): Promise<void>;
133
+ export declare function getExchangeRate(ctx: Context, cfg: Config, session: Session, searchString?: string, raw?: string, retryTimes?: number): Promise<void>;
134
134
  export declare function parseJsonControl(text: string): FeatureControl | null;
135
135
  export declare function detectControl(controlJson: FeatureControl, guildId: string, funName: string): boolean;
136
136
  export declare function handleRoll(session: Session): string;
@@ -154,9 +154,17 @@ export declare function ready(session: Session, cfg: Config, param: string, read
154
154
  * 绘制近一个月收盘价走势图
155
155
  * @param prices 收盘价数组
156
156
  * @param timeStamps ISO 时间戳数组
157
+ * @param title 图表标题
157
158
  * @param width 图表宽度
158
159
  * @param height 图表高度
159
160
  * @returns buffer
160
161
  */
161
- export declare function drawOneMonthChartSkia(prices: number[], timeStamps: string[], width?: number, height?: number): Promise<Buffer>;
162
+ export declare function drawOneMonthChartSkia(prices: number[], timeStamps: string[], title?: string, width?: number, height?: number): Promise<Buffer>;
163
+ interface CurrencyCode {
164
+ "country": string;
165
+ "currencyCn": string;
166
+ "code": string;
167
+ }
168
+ export declare function getCurrencyCodes(): Promise<CurrencyCode[]>;
169
+ export declare function getCurrencyCodesMap(): Promise<Record<string, string>>;
162
170
  export {};
package/package.json CHANGED
@@ -4,13 +4,14 @@
4
4
  "contributors": [
5
5
  "StarFreedomX <starfreedomx@outlook.com>"
6
6
  ],
7
- "version": "0.19.0",
7
+ "version": "0.19.2",
8
8
  "main": "lib/index.js",
9
9
  "typings": "lib/index.d.ts",
10
10
  "files": [
11
11
  "lib",
12
12
  "dist",
13
- "assets"
13
+ "assets",
14
+ "src/currency.json"
14
15
  ],
15
16
  "license": "MIT",
16
17
  "homepage": "https://github.com/StarFreedomX/starfx-bot",
package/readme.md CHANGED
@@ -55,6 +55,8 @@ StarFreedomX机器人的小功能,自用
55
55
  | `sold` | 闲鱼“卖掉了”功能(对应`openSold`) |
56
56
  | `repeat` | 群复读功能(对应`openRepeat`) |
57
57
  | `record` | 群语录功能(对应`投稿、语录`) |
58
+ | `record-push` | 群语录功能(对应`投稿`) |
59
+ | `record-get` | 群语录功能(对应`语录`) |
58
60
  | `atNotSay` | “艾特我/他又不说话”系列功能 |
59
61
  | `replyBot` | “我才不是机器人!”系列功能 |
60
62
  | `iLoveYou` | “我也喜欢你”系列功能 |
@@ -116,3 +118,5 @@ StarFreedomX机器人的小功能,自用
116
118
  | `0.18.1` | 修复艾特不说话功能 |
117
119
  | `0.18.2` | 不直接操作插件目录,防止更新问题 |
118
120
  | `0.19.0` | 新增查汇率功能 |
121
+ | `0.19.1` | 查汇率适配更多语法 |
122
+ | `0.19.2` | 查汇率修复文件缺失 |
@@ -0,0 +1,557 @@
1
+ [
2
+ {
3
+ "country": "阿尔及利亚",
4
+ "currencyCn": "阿尔及利亚第纳尔",
5
+ "code": "DZD"
6
+ },
7
+ {
8
+ "country": "阿富汗",
9
+ "currencyCn": "阿富汗尼",
10
+ "code": "AFN"
11
+ },
12
+ {
13
+ "country": "阿根廷",
14
+ "currencyCn": "阿根廷比索",
15
+ "code": "ARS"
16
+ },
17
+ {
18
+ "country": "阿联酋",
19
+ "currencyCn": "阿联酋迪拉姆",
20
+ "code": "AED"
21
+ },
22
+ {
23
+ "country": "阿曼",
24
+ "currencyCn": "阿曼里亚尔",
25
+ "code": "OMR"
26
+ },
27
+ {
28
+ "country": "阿塞拜疆",
29
+ "currencyCn": "马纳特",
30
+ "code": "AZN"
31
+ },
32
+ {
33
+ "country": "埃及",
34
+ "currencyCn": "埃及镑",
35
+ "code": "EGP"
36
+ },
37
+ {
38
+ "country": "澳大利亚",
39
+ "currencyCn": "澳大利亚元",
40
+ "code": "AUD"
41
+ },
42
+ {
43
+ "country": "巴布亚新几内亚",
44
+ "currencyCn": "基那",
45
+ "code": "PGK"
46
+ },
47
+ {
48
+ "country": "巴基斯坦",
49
+ "currencyCn": "巴基斯坦卢比",
50
+ "code": "PKR"
51
+ },
52
+ {
53
+ "country": "巴林",
54
+ "currencyCn": "巴林第纳尔",
55
+ "code": "BHD"
56
+ },
57
+ {
58
+ "country": "巴西",
59
+ "currencyCn": "雷亚尔",
60
+ "code": "BRL"
61
+ },
62
+ {
63
+ "country": "白俄罗斯",
64
+ "currencyCn": "白俄罗斯卢布",
65
+ "code": "BYN"
66
+ },
67
+ {
68
+ "country": "保加利亚",
69
+ "currencyCn": "列弗",
70
+ "code": "BGN"
71
+ },
72
+ {
73
+ "country": "贝宁",
74
+ "currencyCn": "非洲金融共同体法郎",
75
+ "code": "XOF"
76
+ },
77
+ {
78
+ "country": "波兰",
79
+ "currencyCn": "兹罗提",
80
+ "code": "PLN"
81
+ },
82
+ {
83
+ "country": "布基纳法索",
84
+ "currencyCn": "非洲金融共同体法郎",
85
+ "code": "XOF"
86
+ },
87
+ {
88
+ "country": "布隆迪",
89
+ "currencyCn": "布隆迪法郎",
90
+ "code": "BIF"
91
+ },
92
+ {
93
+ "country": "赤道几内亚",
94
+ "currencyCn": "赤道几内亚埃奎勒",
95
+ "code": "GQE"
96
+ },
97
+ {
98
+ "country": "多哥",
99
+ "currencyCn": "非洲金融共同体法郎",
100
+ "code": "XOF"
101
+ },
102
+ {
103
+ "country": "俄罗斯",
104
+ "currencyCn": "卢布",
105
+ "code": "RUB"
106
+ },
107
+ {
108
+ "country": "菲律宾",
109
+ "currencyCn": "菲律宾比索",
110
+ "code": "PHP"
111
+ },
112
+ {
113
+ "country": "斐济",
114
+ "currencyCn": "斐济元",
115
+ "code": "FJD"
116
+ },
117
+ {
118
+ "country": "刚果",
119
+ "currencyCn": "中非金融合作法郎",
120
+ "code": "XAF"
121
+ },
122
+ {
123
+ "country": "哥伦比亚",
124
+ "currencyCn": "哥伦比亚比索",
125
+ "code": "COP"
126
+ },
127
+ {
128
+ "country": "格鲁吉亚",
129
+ "currencyCn": "拉里",
130
+ "code": "GEL"
131
+ },
132
+ {
133
+ "country": "哈萨克斯坦",
134
+ "currencyCn": "坚戈",
135
+ "code": "KZT"
136
+ },
137
+ {
138
+ "country": "韩国",
139
+ "currencyCn": "韩元",
140
+ "code": "KRW"
141
+ },
142
+ {
143
+ "country": "吉布提",
144
+ "currencyCn": "吉布提法郎",
145
+ "code": "DJF"
146
+ },
147
+ {
148
+ "country": "吉尔吉斯斯坦",
149
+ "currencyCn": "索姆",
150
+ "code": "KGS"
151
+ },
152
+ {
153
+ "country": "几内亚",
154
+ "currencyCn": "几内亚法郎",
155
+ "code": "GNF"
156
+ },
157
+ {
158
+ "country": "加拿大",
159
+ "currencyCn": "加拿大元",
160
+ "code": "CAD"
161
+ },
162
+ {
163
+ "country": "加纳",
164
+ "currencyCn": "塞地",
165
+ "code": "GHS"
166
+ },
167
+ {
168
+ "country": "加蓬",
169
+ "currencyCn": "中非金融合作法郎",
170
+ "code": "XAF"
171
+ },
172
+ {
173
+ "country": "捷克",
174
+ "currencyCn": "捷克克朗",
175
+ "code": "CZK"
176
+ },
177
+ {
178
+ "country": "津巴布韦",
179
+ "currencyCn": "津巴布韦元",
180
+ "code": "ZWL"
181
+ },
182
+ {
183
+ "country": "喀麦隆",
184
+ "currencyCn": "中非金融合作法郎",
185
+ "code": "XAF"
186
+ },
187
+ {
188
+ "country": "卡塔尔",
189
+ "currencyCn": "卡塔尔里亚尔",
190
+ "code": "QAR"
191
+ },
192
+ {
193
+ "country": "科摩罗",
194
+ "currencyCn": "科摩罗法郎",
195
+ "code": "KMF"
196
+ },
197
+ {
198
+ "country": "科特迪瓦",
199
+ "currencyCn": "非洲金融共同体法郎",
200
+ "code": "XOF"
201
+ },
202
+ {
203
+ "country": "科威特",
204
+ "currencyCn": "科威特第纳尔",
205
+ "code": "KWD"
206
+ },
207
+ {
208
+ "country": "克罗地亚",
209
+ "currencyCn": "库纳",
210
+ "code": "HRK"
211
+ },
212
+ {
213
+ "country": "肯尼亚",
214
+ "currencyCn": "肯尼亚先令",
215
+ "code": "KES"
216
+ },
217
+ {
218
+ "country": "黎巴嫩",
219
+ "currencyCn": "黎巴嫩镑",
220
+ "code": "LBP"
221
+ },
222
+ {
223
+ "country": "利比亚",
224
+ "currencyCn": "利比亚第纳尔",
225
+ "code": "LYD"
226
+ },
227
+ {
228
+ "country": "卢旺达",
229
+ "currencyCn": "卢旺达法郎",
230
+ "code": "RWF"
231
+ },
232
+ {
233
+ "country": "罗马尼亚",
234
+ "currencyCn": "列伊",
235
+ "code": "RON"
236
+ },
237
+ {
238
+ "country": "马达加斯加",
239
+ "currencyCn": "马达加斯加法郎",
240
+ "code": "MGF"
241
+ },
242
+ {
243
+ "country": "马尔代夫",
244
+ "currencyCn": "马尔代夫卢比",
245
+ "code": "MVR"
246
+ },
247
+ {
248
+ "country": "马来西亚",
249
+ "currencyCn": "马元",
250
+ "code": "MYR"
251
+ },
252
+ {
253
+ "country": "马里",
254
+ "currencyCn": "非洲金融共同体法郎",
255
+ "code": "XOF"
256
+ },
257
+ {
258
+ "country": "毛里求斯",
259
+ "currencyCn": "毛里求斯卢比",
260
+ "code": "MUR"
261
+ },
262
+ {
263
+ "country": "毛里塔尼亚",
264
+ "currencyCn": "乌吉亚",
265
+ "code": "MRU"
266
+ },
267
+ {
268
+ "country": "美国",
269
+ "currencyCn": "美元",
270
+ "code": "USD"
271
+ },
272
+ {
273
+ "country": "蒙古",
274
+ "currencyCn": "图格里克",
275
+ "code": "MNT"
276
+ },
277
+ {
278
+ "country": "孟加拉国",
279
+ "currencyCn": "塔卡",
280
+ "code": "BDT"
281
+ },
282
+ {
283
+ "country": "秘鲁",
284
+ "currencyCn": "索尔",
285
+ "code": "PEN"
286
+ },
287
+ {
288
+ "country": "缅甸",
289
+ "currencyCn": "缅元",
290
+ "code": "MMK"
291
+ },
292
+ {
293
+ "country": "摩洛哥",
294
+ "currencyCn": "摩洛哥迪拉姆",
295
+ "code": "MAD"
296
+ },
297
+ {
298
+ "country": "墨西哥",
299
+ "currencyCn": "墨西哥比索",
300
+ "code": "MXN"
301
+ },
302
+ {
303
+ "country": "南非",
304
+ "currencyCn": "兰特",
305
+ "code": "ZAR"
306
+ },
307
+ {
308
+ "country": "尼泊尔",
309
+ "currencyCn": "尼泊尔卢比",
310
+ "code": "NPR"
311
+ },
312
+ {
313
+ "country": "尼日尔",
314
+ "currencyCn": "非洲金融共同体法郎",
315
+ "code": "XOF"
316
+ },
317
+ {
318
+ "country": "尼日利亚",
319
+ "currencyCn": "奈拉",
320
+ "code": "NGN"
321
+ },
322
+ {
323
+ "country": "欧元区",
324
+ "currencyCn": "欧元",
325
+ "code": "EUR"
326
+ },
327
+ {
328
+ "country": "日本",
329
+ "currencyCn": "日圆",
330
+ "code": "JPY"
331
+ },
332
+ {
333
+ "country": "瑞士",
334
+ "currencyCn": "瑞士法郎",
335
+ "code": "CHF"
336
+ },
337
+ {
338
+ "country": "塞尔维亚",
339
+ "currencyCn": "塞尔维亚第纳尔",
340
+ "code": "RSD"
341
+ },
342
+ {
343
+ "country": "塞内加尔",
344
+ "currencyCn": "非洲金融共同体法郎",
345
+ "code": "XOF"
346
+ },
347
+ {
348
+ "country": "塞浦路斯",
349
+ "currencyCn": "塞浦路斯镑",
350
+ "code": "CYP"
351
+ },
352
+ {
353
+ "country": "塞舌尔",
354
+ "currencyCn": "塞舌尔卢比",
355
+ "code": "SCR"
356
+ },
357
+ {
358
+ "country": "沙特阿拉伯",
359
+ "currencyCn": "沙特里亚尔",
360
+ "code": "SAR"
361
+ },
362
+ {
363
+ "country": "斯里兰卡",
364
+ "currencyCn": "斯里兰卡卢比",
365
+ "code": "LKR"
366
+ },
367
+ {
368
+ "country": "苏丹",
369
+ "currencyCn": "苏丹镑",
370
+ "code": "SDG"
371
+ },
372
+ {
373
+ "country": "所罗门群岛",
374
+ "currencyCn": "所罗门元",
375
+ "code": "SBD"
376
+ },
377
+ {
378
+ "country": "索马里",
379
+ "currencyCn": "索马里先令",
380
+ "code": "SOS"
381
+ },
382
+ {
383
+ "country": "塔吉克斯坦",
384
+ "currencyCn": "索莫尼",
385
+ "code": "TJS"
386
+ },
387
+ {
388
+ "country": "泰国",
389
+ "currencyCn": "泰铢",
390
+ "code": "THB"
391
+ },
392
+ {
393
+ "country": "坦桑尼亚",
394
+ "currencyCn": "坦桑尼亚先令",
395
+ "code": "TZS"
396
+ },
397
+ {
398
+ "country": "突尼斯",
399
+ "currencyCn": "突尼斯第纳尔",
400
+ "code": "TND"
401
+ },
402
+ {
403
+ "country": "土耳其",
404
+ "currencyCn": "土耳其里拉",
405
+ "code": "TRY"
406
+ },
407
+ {
408
+ "country": "土库曼斯坦",
409
+ "currencyCn": "马纳特",
410
+ "code": "TMT"
411
+ },
412
+ {
413
+ "country": "瓦努阿图",
414
+ "currencyCn": "瓦图",
415
+ "code": "VUV"
416
+ },
417
+ {
418
+ "country": "委内瑞拉",
419
+ "currencyCn": "博利瓦",
420
+ "code": "VES"
421
+ },
422
+ {
423
+ "country": "乌干达",
424
+ "currencyCn": "乌干达先令",
425
+ "code": "UGX"
426
+ },
427
+ {
428
+ "country": "乌克兰",
429
+ "currencyCn": "格里夫纳",
430
+ "code": "UAH"
431
+ },
432
+ {
433
+ "country": "乌拉圭",
434
+ "currencyCn": "乌拉圭新比索",
435
+ "code": "UYU"
436
+ },
437
+ {
438
+ "country": "乌兹别克斯坦",
439
+ "currencyCn": "索姆",
440
+ "code": "UZS"
441
+ },
442
+ {
443
+ "country": "新加坡",
444
+ "currencyCn": "新加坡元",
445
+ "code": "SGD"
446
+ },
447
+ {
448
+ "country": "新喀里多尼亚",
449
+ "currencyCn": "太平洋法郎",
450
+ "code": "XPF"
451
+ },
452
+ {
453
+ "country": "新西兰",
454
+ "currencyCn": "新西兰元",
455
+ "code": "NZD"
456
+ },
457
+ {
458
+ "country": "匈牙利",
459
+ "currencyCn": "福林",
460
+ "code": "HUF"
461
+ },
462
+ {
463
+ "country": "叙利亚",
464
+ "currencyCn": "叙利亚镑",
465
+ "code": "SYP"
466
+ },
467
+ {
468
+ "country": "亚美尼亚",
469
+ "currencyCn": "德拉姆",
470
+ "code": "AMD"
471
+ },
472
+ {
473
+ "country": "也门",
474
+ "currencyCn": "也门里亚尔",
475
+ "code": "YER"
476
+ },
477
+ {
478
+ "country": "伊拉克",
479
+ "currencyCn": "伊拉克第纳尔",
480
+ "code": "IQD"
481
+ },
482
+ {
483
+ "country": "伊朗",
484
+ "currencyCn": "伊朗里亚尔",
485
+ "code": "IRR"
486
+ },
487
+ {
488
+ "country": "以色列",
489
+ "currencyCn": "以色列谢克尔",
490
+ "code": "ILS"
491
+ },
492
+ {
493
+ "country": "印度",
494
+ "currencyCn": "印度卢比",
495
+ "code": "INR"
496
+ },
497
+ {
498
+ "country": "印度尼西亚",
499
+ "currencyCn": "盾",
500
+ "code": "IDR"
501
+ },
502
+ {
503
+ "country": "英国",
504
+ "currencyCn": "英镑",
505
+ "code": "GBP"
506
+ },
507
+ {
508
+ "country": "约旦",
509
+ "currencyCn": "约旦第纳尔",
510
+ "code": "JOD"
511
+ },
512
+ {
513
+ "country": "越南",
514
+ "currencyCn": "越南盾",
515
+ "code": "VND"
516
+ },
517
+ {
518
+ "country": "赞比亚",
519
+ "currencyCn": "赞比亚克瓦查",
520
+ "code": "ZMW"
521
+ },
522
+ {
523
+ "country": "乍得",
524
+ "currencyCn": "中非金融合作法郎",
525
+ "code": "XAF"
526
+ },
527
+ {
528
+ "country": "智利",
529
+ "currencyCn": "智利比索",
530
+ "code": "CLP"
531
+ },
532
+ {
533
+ "country": "中非",
534
+ "currencyCn": "中非金融合作法郎",
535
+ "code": "XAF"
536
+ },
537
+ {
538
+ "country": "中国",
539
+ "currencyCn": "人民币元",
540
+ "code": "CNY"
541
+ },
542
+ {
543
+ "country": "中国澳门",
544
+ "currencyCn": "澳门元",
545
+ "code": "MOP"
546
+ },
547
+ {
548
+ "country": "中国台湾",
549
+ "currencyCn": "新台币",
550
+ "code": "TWD"
551
+ },
552
+ {
553
+ "country": "中国香港",
554
+ "currencyCn": "港元",
555
+ "code": "HKD"
556
+ }
557
+ ]