2025年8月14日星期四

监测汇率变化脚本

1.购买服务器阿里云:服务器购买地址https://t.aliyun.com/U/W9mv4W若失效,可用地址

1.购买服务器

阿里云:

服务器购买地址

https://t.aliyun.com/U/W9mv4W

若失效,可用地址

https://www.aliyun.com/minisite/goods?source=5176.29345612&userCode=49hts92d

腾讯云:

https://curl.qcloud.com/wJpWmSfU

若失效,可用地址

https://cloud.tencent.com/act/cps/redirect?redirect=2446&cps_key=ad201ee2ef3b771157f72ee5464b1fea&from=console

华为云

https://activity.huaweicloud.com/cps.html?fromacct=64b5cf7cc11b4840bb4ed2ea0b2f4468&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=201905

2.部署教程

2024年最新青龙面板跑脚本教程(一)持续更新中

3.代码如下

let accessKey = GM_getValue("PushCat.AccessKey"); const push = new PushCat({     accessKey, }); //*  返回的是一个函数体 function pushSend(title, content) {     return new Promise(resolve => {         if (accessKey) {             push.send(title, content);         }         // 启用浏览器的通知功能         GM_notification({             title: title,             text: content,         });         resolve();     }) } // 功能函数,获取子串,获取包含在html内的json数据 function getSubstring(inputStr, startStr, endStr) {     const startIndex = inputStr.indexOf(startStr);     if (startIndex == -1) {         return null;     }     const endIndex = inputStr.indexOf(endStr, startIndex + startStr.length);     if (endIndex == -1) {         return null;     }     return inputStr.substring(startIndex + startStr.length, endIndex); }  function getChangeRateInfo() {     return new Promise((resolve, reject) => {         // 获取汇率网站信息         GM_xmlhttpRequest({             url:'https://chl.cn/?usd',             onload(resp) {                 if (resp.status == 200) {                     resolve(resp);                 } else {                    // 获取失败,在此尝试                     pushSend("汇率获取失败""请求返回错误: " + resp.status).then(() => reject());                 }             }, onerror(e) {                 pushSend("汇率获取失败", e || "未知错误").then(() => reject());             }         });     }) } // 主要功能函数 function handler() {     return getChangeRateInfo().then(async resp => {         // 获取的数据是存在html中         const data = resp.responseText;         const startStra = "<table style=";         const endStra = "</table>";         // 拆分html文本中的数据         var tableStra = getSubstring(data,startStra,endStra)         // 拼接 table 标签文本         tableStra = startStra + tableStra + endStra ;        // 创建 DOM 解析器实例        const parser = new DOMParser();        // 使用解析器解析文本并获取根元素        const document = parser.parseFromString(tableStra, 'text/html');        const table = document.getElementsByTagName('table')[0];        if (table.rows.length >3){            const row = table.rows[2];            var cell = row.cells[4];            // 现汇卖出价:              const spots = cell.textContent.trim();            cell = row.cells[2];            // 现汇买入价:             const spotb = cell.textContent.trim();            await pushSend('今日美元汇率','现汇卖出价: '+ spots +'  \n现汇买入价: '+spotb)            return true;        }else{            await pushSend('汇率数据解析失败','解析数据出错,请核对网站数据结构是否发生变化')            return true;        }     }); }  // 文件执行的入口 return new Promise((resolve, reject) => {     const h = async () => {         try {             const result = await handler();             if (result) {                 resolve();             } else {                // 定时循环调用 h(),确保所有任务都能完成                  setTimeout(() => {                      h();                  }, 1000 * (Math.floor(Math.random() * 4) + 10));             }         } catch (e) {             pushSend('汇率获取失败''请查看错误日志手动重试');             reject(e);         }     }     // 程序入口调用     h(); }); 

解析

该脚本为监测汇率每日变化的任务脚本,主要作用为:

  • 定时(@crontab * 10-23 once * *,白天 10–23 点每小时一次)抓取 https://chl.cn/?usd 页面中的美元汇率表格。

  • 解析出现汇卖出价现汇买入价,并通过:

    • PushCat如果配置了 PushCat.AccessKey)推送消息,

    • 浏览器通知GM_notification)弹窗提醒。

  • 同时可用 GM_getValue/GM_setValue 读写本地存储(这里用于读取 PushCat 的 AccessKey)。

主要方法

位置 / 方法
作用说明
new PushCat({ accessKey })
初始化 PushCat 推送客户端,accessKey 来自 GM_getValue("PushCat.AccessKey")
pushSend(title, content)统一通知:若存
在 accessKey 则 push.send(...) 发送到 PushCat,同时调用 GM_notification 弹出浏览器通知;返回 Promise,便于链式调用。
GM_xmlhttpRequest({ url, onload, onerror })跨域请求
汇率页面 https://chl.cn/?usd,成功后把响应交给解析流程,失败时调用 pushSend 报错。
getSubstring(inputStr, startStr, endStr)
在整页 HTML 文本中,截取 <table ...> 与 </table> 之间的表格片段,为后续 DOM 解析做准备。
getChangeRateInfo()
封装网络请求,返回页面响应(resp.responseText 即 HTML)。请求失败会推送"获取失败"。
handler()核心逻辑
:1) 获取 HTML;2) 用 getSubstring 抠出表格并手动补齐标签;3) 通过 DOMParser 解析成 DOM;4) 取 table.rows[2] 的两列:cells[4] → 现汇卖出价cells[2] → 现汇买入价;5) pushSend 推送结果;若表结构异常则推送"解析失败"。
外层 Promise 入口(h()
运行 handler();成功即 resolve();否则按随机 10–13 秒重试一轮;异常时推送"获取失败"。

核心流程:抓取网页 → 截取表格 → DOM 解析 → 提取两项汇率 → 推送/通知。如果目标网站的表格结构(行/列索引)调整,就需要相应修改 rows[2] / cells[4] / cells[2] 的索引。


注意

本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。


历史脚本txt文件获取>>
服务器搭建,人工服务咨询>>

没有评论:

发表评论

分享一个适合新手操作的联盟

标题叫适合新手,其实我觉得做联盟不存在新手操作或者老手操作,因为联盟任务基本都是一些网页填表操作,只是每个任务 标题叫适合新手,其实我觉得做联盟不存在新手操作或者老手操作,因为联盟任务基本都是一些网页填表操作,只是每个任务的细节不一样而已,所以在我认为新老手都一样,只要操作多...