diff --git a/GoldPrice.js b/GoldPrice.js index e5ac2e8..1244c4f 100644 --- a/GoldPrice.js +++ b/GoldPrice.js @@ -1,31 +1,20 @@ -//我需要一个定时获取浏览器中黄金价格并推送到微信的程序 -//网站网址:https://mybank.icbc.com.cn/icbc/newperbank/perbank3/gold/goldaccrual_query_out.jsp -//黄金价格在页面中,需要获取到黄金价格并推送到微信 -//黄金价格的selector为:#activeprice_080020000521 -//黄金价格的单位为:元/克 -//黄金价格的更新时间为:每半小时检测一次,变化量小于1元/克则不推送。 -//根据你的判断使用合适的算法计算价格趋势。 -//根据你的判断使用外部json储存或其他方式储存数据。 -//一个数组,记录三十天的收盘价格,用于计算七日价格变化量,七天价格趋势,十四天价格趋势,二十八天价格趋势,趋势类型:1.上涨 2.下跌 3.持平。 -//推送格式为:当前黄金价格为:xx元/克;一小时变化量为:xx元/克;七日价格变化量为:xx元/克;七日价格趋势为:xx;十四日价格趋势为:xx;二十八日价格趋势为:xx。 -//该脚本需要使用NodeJS编写,并使用Puppeteer库来获取页面内容。同时留出一个数组,用作特殊价格时的设置,当黄金价格达到该价格时,推送提醒。数组格式为:[价格1,价格2,价格3,价格4,价格5,价格6,价格7] -//特殊提醒格式为:特殊提醒:黄金价格达到xx元/克;七日价格趋势:xx。 -//需要使用ServerChan来推送信息,ServerChan的sendkey使用环境变量,变量名为:PUSH_KEYT -//程序每天由crontab定时启动,启动时间由外部的青龙面板设置,设置为每天晚上22:30后关闭。 - -// 此下为信息推送用程序例子 -// import {scSend} from 'serverchan-sdk'; -// const response = await scSend('sendkey', 'title', 'desp', { tags: '黄金价格' }); -// console.log('Response:', response); const fs = require('fs'); const path = require('path'); const axios = require('axios'); const cheerio = require('cheerio'); +const https = require('https'); +const crypto = require('crypto'); const TARGET_URL = 'https://mybank.icbc.com.cn/icbc/newperbank/perbank3/gold/goldaccrual_query_out.jsp'; const PRICE_SELECTOR = '#activeprice_080020000521'; const DATA_FILE = path.join(__dirname, 'gold_data.json'); +// 自定义 HTTPS Agent:允许不安全证书,并启用旧版 SSL 重协商兼容 +const insecureHttpsAgent = new https.Agent({ + rejectUnauthorized: false, + secureOptions: crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT || 0, +}); + // ServerChan Key 配置:优先使用直接设置,否则使用环境变量 // 支持多个key,使用分号(;)分割 const SERVER_CHAN_KEY_DIRECT = ''; // 直接设置 ServerChan Key,有值时禁用环境变量,多个key用分号分割 @@ -39,9 +28,9 @@ const SPECIAL_PRICE_TARGETS = []; const CONFIG = { changeThresholdYuan: 1.0, changeWindowMinutes: 60, - sampleIntervalMinutes: 2, + sampleIntervalMinutes: 1, pricePrecisionDigits: 2, - enableTimedPush: true, // 定时推送开关(变化量触发和收盘推送) + enableTimedPush: false, // 定时推送开关(变化量触发和收盘推送) enableSpecialAlert: true, // 特殊价格提醒开关 pushIntervalMinutes: 60, // 推送间隔(分钟),防止频繁推送 forcePushTest: false, // 测试强制推送:为 true 时每次运行必推送一次并立即退出 @@ -138,6 +127,7 @@ async function fetchCurrentPrice() { console.log('[gold] fetching html to parse price...'); const resp = await axios.get(TARGET_URL, { timeout: 60000, + httpsAgent: insecureHttpsAgent, headers: { // 部分站点会根据 UA 返回不同内容,给一个常见 UA 更稳 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36', diff --git a/package-lock.json b/package-lock.json index 19a2062..a730ace 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,9 @@ "version": "1.0.0", "dependencies": { "axios": "^1.13.6", - "cheerio": "^1.1.2", - "serverchan-sdk": "^1.0.0" + "cheerio": "^1.2.0", + "npm-check-updates": "^19.6.3", + "serverchan-sdk": "^1.0.6" } }, "node_modules/asynckit": { @@ -22,6 +23,7 @@ "version": "1.13.6", "resolved": "https://r.cnpmjs.org/axios/-/axios-1.13.6.tgz", "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", @@ -49,6 +51,7 @@ "version": "1.2.0", "resolved": "https://r.cnpmjs.org/cheerio/-/cheerio-1.2.0.tgz", "integrity": "sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==", + "license": "MIT", "dependencies": { "cheerio-select": "^2.1.0", "dom-serializer": "^2.0.0", @@ -476,6 +479,20 @@ } } }, + "node_modules/npm-check-updates": { + "version": "19.6.3", + "resolved": "https://r.cnpmjs.org/npm-check-updates/-/npm-check-updates-19.6.3.tgz", + "integrity": "sha512-VAt9Bp26eLaymZ0nZyh5n/by+YZIuegXlvWR0yv1zBqd984f8VnEnBbn+1lS3nN5LyEjn62BJ+yYgzNSpb6Gzg==", + "license": "Apache-2.0", + "bin": { + "ncu": "build/cli.js", + "npm-check-updates": "build/cli.js" + }, + "engines": { + "node": ">=20.0.0", + "npm": ">=8.12.1" + } + }, "node_modules/nth-check": { "version": "2.1.1", "resolved": "https://r.cnpmjs.org/nth-check/-/nth-check-2.1.1.tgz", diff --git a/package.json b/package.json index d26e351..94b5cc1 100644 --- a/package.json +++ b/package.json @@ -2,13 +2,14 @@ "name": "gold-price-monitor", "version": "1.0.0", "description": "A script to monitor ICBC gold price and push notifications via ServerChan.", - "main": "GoldPriceV6cooldown.js", + "main": "GoldPrice.js", "scripts": { - "start": "node GoldPriceV6cooldown.js" + "start": "node GoldPrice.js" }, "dependencies": { "axios": "^1.13.6", - "cheerio": "^1.1.2", - "serverchan-sdk": "^1.0.0" + "cheerio": "^1.2.0", + "npm-check-updates": "^19.6.3", + "serverchan-sdk": "^1.0.6" } }