在Facebook页面通过Tampermonkey脚本实现数据库定时轮询及操作
嘿,我看到你在折腾Facebook页面上的Tampermonkey轮询脚本,用AJAX实现的思路没问题,但你的代码有点不完整,而且还有几个容易踩坑的点得注意。我帮你把代码补全优化,顺便给你唠唠关键细节:
完善后的可运行脚本
先给你一个完整的、能正常工作的版本,你可以根据自己的需求调整:
// ==UserScript== // @name Facebook Database Poller // @namespace http://tampermonkey.net/ // @version 0.1 // @description 定期在Facebook页面轮询数据库数据 // @author 你自己 // @match *://*.facebook.com/* // @connect xyz // 这里替换成你的API域名,比如api.yourdomain.com // @grant GM_setValue // @grant GM_getValue // ==/UserScript== (function() { 'use strict'; // 从Tampermonkey安全存储获取API密钥,别直接硬写在代码里! const apiKey = GM_getValue('apiKey', ''); if (!apiKey) { alert('麻烦先设置API密钥哦!你可以在浏览器控制台执行GM_setValue("apiKey", "你的密钥")'); return; } function poll() { setTimeout(function() { $.ajax({ url: "xyz", // 替换成你的API完整地址 headers: { 'Content-Type': 'application/json', 'x-apikey': apiKey, 'cache-control': 'no-cache' }, type: "GET", success: function(data) { // 更严谨地判断空数据 if (data == null || Object.keys(data).length === 0) { console.log('没拿到数据哦!'); } else { console.log('收到数据啦:', data); // 这里写你要执行的操作,比如修改页面元素、弹通知啥的 // 举个例子:在页面右上角弹个临时通知 const notice = document.createElement('div'); notice.style.cssText = 'position:fixed;top:10px;right:10px;background:#2d3748;color:white;padding:12px;border-radius:6px;z-index:9999;font-size:14px'; notice.textContent = `新数据:${JSON.stringify(data).substring(0, 50)}...`; document.body.appendChild(notice); setTimeout(() => notice.remove(), 3500); } }, error: function(xhr, status, err) { console.error('轮询请求失败了:', status, err); }, complete: function() { // 不管成功失败,都继续下一轮轮询,避免断更 poll(); } }); }, 5000); // 每5秒轮询一次,按需调整,别太频繁哦 } // 启动轮询 poll(); })();
几个必须注意的关键点
- 跨域请求权限:Tampermonkey默认不允许跨域请求,所以一定要在脚本元数据里加
@connect 你的API域名,不然AJAX会直接失败。 - jQuery依赖:Facebook页面一般自带jQuery,但如果哪天它更新去掉了,你可以在元数据里添加jQuery的引入声明,或者直接改用原生
fetchAPI彻底摆脱依赖。 - API密钥安全:绝对别把
apiKey硬编码在脚本里,用Tampermonkey的GM_setValue/GM_getValue存储,避免代码泄露时密钥也跟着丢失。 - 轮询稳定性:原来的代码只执行一次轮询,我在
complete回调里加了递归调用poll(),这样不管请求成功还是失败,都会继续下一轮,不会中途停掉。 - 轮询间隔:别设得太频繁,比如1秒一次,既给API服务器加压力,还可能被Facebook的反爬机制盯上,5-30秒区间比较合理。
最后提醒下,记得把代码里的xyz替换成你实际的API地址和域名哦!
内容的提问来源于stack exchange,提问作者Aarish Ramesh
相关产品推荐
相关产品推荐

