1.购买服务器阿里云:服务器购买地址https://t.aliyun.com/U/W9mv4W若失效,可用地址
阿里云:
服务器购买地址
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.部署教程
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 }) | 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) | <table ...> 与 </table> 之间的表格片段,为后续 DOM 解析做准备。 |
getChangeRateInfo() | resp.responseText 即 HTML)。请求失败会推送"获取失败"。 |
handler() | 核心逻辑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]
的索引。
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
没有评论:
发表评论