- addEventListener("scheduled", event => {
- event.waitUntil(checkKeywordsAndNotify());
- });
- async function checkKeywordsAndNotify() {
- const url = 'https://hostloc.com'; // 要检测的网页URL
- const keyword = '全球主机交流'; // 要检测的关键词
- const telegramToken = '##'; // TG机器人Token
- const chatId = '##'; //要推送的TG用户ID
-
- try {
- const urlWithTimestamp = `${url}?t=${Date.now()}`;
-
- const response = await fetch(urlWithTimestamp, {
- method: 'GET',
- headers: {
- 'Cache-Control': 'no-cache',
- 'Pragma': 'no-cache'
- }
- });
- const text = await response.text();
- if (!text.includes(keyword)) {
- await sendTelegramNotification(telegramToken, chatId, `关键词 "${keyword}" 已从 ${url} 上消失`);
- }
- } catch (error) {
- await sendTelegramNotification(telegramToken, chatId, `获取或处理URL时出错: ${error.message}`);
- }
- }
- async function sendTelegramNotification(token, chatId, message) {
- const telegramUrl = `https://api.telegram.org/bot${token}/sendMessage`;
- const response = await fetch(telegramUrl, {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({
- chat_id: chatId,
- text: message
- })
- });
- return response.json();
- }
複製代碼
1,無需服務器,支持部署到cloudflare的workers
2,設定→觸發程序→Cron
可以檢測優質服務器是否補貨,也可以檢測自己的網站是不是掉線了
有個缺點,一旦傳家寶補貨了,機器人會一直提醒你。數據庫可以解決這個問題,但是想法就是簡單穩定快捷。數據庫增加了不確定因素
相關優化版
- /**
- * Cloudflare Workers 入口:处理所有的 HTTP 请求
- * 每当有请求到达时,都会调用此方法并传递请求对象
- */
- addEventListener('fetch', event => {
- // 使用 event.respondWith 方法,传入我们自定义的 handleRequest 函数来处理请求
- event.respondWith(handleRequest(event.request));
- });
- /**
- * 处理传入的 HTTP 请求
- * @param {Request} request - HTTP 请求对象
- * @returns {Response} - 返回处理结果的 HTTP 响应对象
- */
- async function handleRequest(request) {
- try {
- // 从请求体中解析 JSON 数据,假设请求体包含需要检测的任务列表
- const { tasks } = await request.json();
- // 使用 Promise.all 同时执行多个任务
- const results = await Promise.all(tasks.map(task => checkKeywordsAndNotify(task.url, task.keyword, task.telegramToken, task.chatId)));
- // 返回一个包含所有任务结果的 JSON 响应
- return new Response(JSON.stringify({ success: true, results }), {
- headers: { 'Content-Type': 'application/json' },
- });
- } catch (error) {
- // 如果有错误,返回错误信息
- return new Response(JSON.stringify({ success: false, error: error.message }), {
- headers: { 'Content-Type': 'application/json' },
- });
- }
- }
- /**
- * 检查指定 URL 是否包含关键字,并发送 Telegram 通知
- * @param {string} url - 要检测的网页 URL
- * @param {string} keyword - 要检测的关键词
- * @param {string} telegramToken - Telegram 机器人的 Token
- * @param {string} chatId - 要发送通知的 Telegram 用户 ID
- * @returns {Object} - 返回检测结果
- */
- async function checkKeywordsAndNotify(url, keyword, telegramToken, chatId) {
- try {
- // 为了防止缓存,给 URL 添加时间戳参数
- const urlWithTimestamp = `${url}?t=${Date.now()}`;
-
- // 发送 GET 请求获取网页内容,禁止缓存
- const response = await fetch(urlWithTimestamp, {
- method: 'GET',
- headers: {
- 'Cache-Control': 'no-cache',
- 'Pragma': 'no-cache',
- },
- });
- const text = await response.text();
- // 检查网页内容是否包含指定的关键词
- if (!text.includes(keyword)) {
- // 如果关键词不包含在网页中,发送 Telegram 通知
- await sendTelegramNotification(telegramToken, chatId, `关键词 "${keyword}" 已从 ${url} 上消失`);
- return { url, keyword, status: 'missing' }; // 返回状态:关键词消失
- }
- return { url, keyword, status: 'found' }; // 返回状态:关键词仍然存在
- } catch (error) {
- // 如果请求或处理过程中出错,发送错误通知
- await sendTelegramNotification(telegramToken, chatId, `获取或处理URL时出错: ${error.message}`);
- return { url, keyword, status: 'error', error: error.message }; // 返回错误信息
- }
- }
- /**
- * 发送 Telegram 消息通知
- * @param {string} token - Telegram 机器人的 Token
- * @param {string} chatId - 要发送消息的 Telegram 用户 ID
- * @param {string} message - 要发送的消息内容
- * @returns {Object} - 返回 Telegram API 的响应
- */
- async function sendTelegramNotification(token, chatId, message) {
- const telegramUrl = `https://api.telegram.org/bot${token}/sendMessage`;
- const response = await fetch(telegramUrl, {
- method: 'POST',
- headers: { 'Content-Type': 'application/json' },
- body: JSON.stringify({
- chat_id: chatId,
- text: message,
- }),
- });
- return response.json();
- }
複製代碼
相關軟件:https://github.com/Xinslive/NotifyMe |