avatar

mdo

Hello

  • 首页
  • 知识库
  • 归档
  • 标签
  • 关于
主页 AI 驱动型 Facebook 群组关键词监控 Chrome 浏览器插件
文章

AI 驱动型 Facebook 群组关键词监控 Chrome 浏览器插件

发表于 15天前 更新于 15天前
作者 mdo
14~18 分钟 阅读

自己开发一个类似 One Stop Social 的 Facebook 群组关键词监控工具,最核心的难点在于 Facebook 官方 API 极其严格。由于 2018 年的数据隐私风波,官方彻底关闭了普通用户通过 API 读取他人群组帖子的权限。

因此,自主开发只能采用 “自动化模拟(爬虫/自动化脚本)” 路线。为了确保账号安全,最推荐的开发形态是 Chrome 浏览器扩展插件(Extension),因为它可以直接复用你网页端已登录的 Facebook Cookie,避开了复杂的登录滑块验证。

以下是完整的开发架构、核心代码实现及防封号策略。


🏗️ 技术栈推荐

  • 前端/外壳:HTML5, CSS3, JavaScript (Chrome Extension V3 规范)

  • 自动化核心:Puppeteer / Selenium (如果做成桌面软件) 或 纯 JS DOM 解析 (如果做成插件)

  • AI 文本分析(可选):调用 OpenAI API 或本地 Ollama 运行的轻量级大模型(如 Llama-3-8B)

  • 通知通道:Telegram Bot API, Slack Webhook 或 邮件服务 (如 Nodemailer)


💻 核心实现逻辑与代码示例

以 Chrome 插件 为例,其核心逻辑是:定时自动在后台打开群组页面 -> 滚动刷新获取最新 DOM -> 解析帖子文本 -> 匹配关键词/AI分析 -> 触发 Webhook 通知。

1. 声明清单文件 (manifest.json)

这是 Chrome 插件的配置文件,必须声明所需的权限。

json

{
  "manifest_version": 3,
  "name": "FB Group Keyword Monitor",
  "version": "1.0",
  "description": "监控 Facebook 群组关键词并发送通知",
  "permissions": [
    "tabs",
    "alarms",
    "storage",
    "notifications"
  ],
  "host_permissions": [
    "https://*://*"
  ],
  "background": {
    "service_worker": "background.js"
  }
}

请谨慎使用此类代码。

2. 定时任务与抓取调度 (background.js)

利用 Chrome 的 alarms 机制,每隔一段时间自动开页、执行脚本、关闭页面。

javascript

// 创建定时器:每 15 分钟执行一次
chrome.alarms.create("fbCheck", { periodInMinutes: 15 });

chrome.alarms.onAlarm.addListener((alarm) => {
  if (alarm.name === "fbCheck") {
    // 目标监控的群组 URL(从用户配置中读取)
    const targetGroupUrl = "https://facebook.com";
    
    // 静默创建一个新标签页打开群组
    chrome.tabs.create({ url: targetGroupUrl, active: false }, (tab) => {
      // 等待页面加载(例如 8 秒)后注入解析脚本
      setTimeout(() => {
        chrome.scripting.executeScript({
          target: { tabId: tab.id },
          files: ['content.js']
        });
      }, 8000);
    });
  }
});

// 监听 content.js 传回来的报警帖子数据
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.action === "keywordMatched") {
    // 1. 触发浏览器桌面通知
    chrome.notifications.create({
      type: "basic",
      iconUrl: "icon.png",
      title: "发现目标监控帖子!",
      message: `内容: ${request.text.substring(0, 50)}...`
    });

    // 2. 转发到你的微信/Telegram/Slack Webhook (示例:向网关发送 POST)
    fetch("https://your-webhook-server.com", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ text: request.text, url: request.url })
    });

    // 关闭刚刚打开的隐私标签页,不打扰用户
    chrome.tabs.remove(sender.tab.id);
  }
});

请谨慎使用此类代码。

3. 页面解析与关键词匹配 (content.js)

该脚本注入到 Facebook 网页中,提取帖子的文本和链接。

javascript

(function() {
  // 定义你要监控的关键词
  const KEYWORDS = ["需要推荐", "寻找木工", "求介绍", "预算"];
  
  // Facebook 动态加载的帖子容器选择器(注意:FB 的类名经常变动,需定期维护)
  // 提示:通常寻找带有 role="feed" 或带有 userContent 属性的 div
  const posts = document.querySelectorAll('div[data-ad-preview="message"]'); 

  posts.forEach(post => {
    const postText = post.innerText || "";
    
    // 检查是否包含关键词
    const matched = KEYWORDS.some(keyword => postText.includes(keyword));
    
    if (matched) {
      // 提取帖子的链接(找到该帖子内的绝对时间戳链接)
      const linkEl = post.closest('div[role="article"]').querySelector('a[href*="/permalink/"]');
      const postUrl = linkEl ? linkEl.href : window.location.href;

      // 如果是新帖子(可以通过本地 storage 记录已通知过的 ID,防止重复通知)
      chrome.runtime.sendMessage({
        action: "keywordMatched",
        text: postText,
        url: postUrl
      });
    }
  });
})();

请谨慎使用此类代码。


🧠 进阶:如何集成 AI 意图过滤?

如果只是纯字符串匹配,你会收到大量广告和无关通知。可以建立一个中转服务器(Node.js / Python),让插件通过 Webhook 把抓到的帖子推给大模型做判断:

javascript

// 伪代码:将文本送给大模型进行语义分类
const response = await openai.chat.completions.create({
  model: "gpt-4o-mini",
  messages: [
    { role: "system", content: "你是一个商机筛选助手。判断以下 Facebook 帖子中,发帖人是否正在‘寻找本地装修工人’。请只回答 [YES] 或 [NO]。" },
    { role: "user", content: postText }
  ],
});

if (response.choices[0].message.content.includes("YES")) {
  // 真正触发紧急通知
}

请谨慎使用此类代码。


⚠️ 自研工具防封号(Anti-Ban)至关重要的铁律

Facebook 拥有一套全球顶尖的反爬虫与行为审计算法(Anti-Scraping)。一旦它检测到某个账号每隔几秒固定刷新页面,或者页面滚动速度极度规律,就会直接限制该账号登录,甚至封号。

  • 拟人化随机延迟:不要把扫描时间定死在“每 15 分钟”。使用随机函数,让它在 15分钟 ~ 28分钟 之间随机变动。

  • 模拟真实人类操作:在 content.js 中加入模拟鼠标滚动(Scroll Down/Up)和间歇性停顿的行为。

  • 严格控制扫描频率:不要为了追求即时性设置每 1 分钟扫描一次。对于普通群组,每 30 分钟到 1 小时刷新一次是安全边界。

  • 多账号分流(养号):如果监控的群组多达几十个,强烈建议注册或购买专用的“小号”加入这些群组专门用来跑插件。千万不要用你绑定了重要主页、广告账户的“大号”去跑自动化脚本。

  • 利用 RSS 中转(如果有公开群组):如果是公开群(Public Group),可以尝试寻找第三方能将其转化为 RSS 订阅源的服务,通过后端服务器解析 RSS,这样完全不消耗你的 Facebook 账号活跃度。

技术
许可协议:  CC BY 4.0
分享

相关文章

7月 26, 2026

完美地解决 TP3 老系统数据的平滑读取

为了彻底、完美地解决 TP3 老系统数据的平滑读取,必须解决两个核心痛点: TP3 的盲猜反序列化机制(标量存原样,数组/对象存原生 serialize,同时兼容 json)。 TP3 与 TP6 的缓存前缀(Prefix)不一致。 以下是为你量身定制的终极落地解决方案,通

7月 26, 2026

thinkphp3 redis序列化和反序列化

在老系统重构迁移至 ThinkPHP 6 (TP6) 的过程中,ThinkPHP 3 (TP3) 的 Redis 序列化历史遗留问题是最核心的连环坑之一。 TP3 的 S('key', $value) 缓存方法和底层 Redis 驱动,在存储非字符串(如数组、对象)时,有一套独特的序列化行为。如果不

7月 24, 2026

Table 空间极易发生哈希冲突并溢出

既然你没有在业务中主动调用 Room,只使用了全局广播,那么这个问题就非常明确了:即使你不用房间功能,think-swoole 只要开启了 WebSocket,底层就会强行初始化并注入一个名为 Room 的驱动组件。 [1] 框架底层默认使用 table 类型来作为 Room 的存储介质。当进行全局

下一篇

think-orm 2.0.62 单独设置数据表字段缓存驱动和数据缓存驱动

上一篇

将监控程序直接跑在云端

最近更新

  • 完美地解决 TP3 老系统数据的平滑读取
  • thinkphp3 redis序列化和反序列化
  • Table 空间极易发生哈希冲突并溢出
  • 将监控程序直接跑在云端
  • AI 驱动型 Facebook 群组关键词监控 Chrome 浏览器插件

热门标签

API CodeGeex Gitkraken Management Manticore Premiere Sublime Swoole ThinkPHP ThinkPHP5

目录

©2026 mdo. 保留部分权利。