English 登录 注册
史天乐
Posted on Apr 15
❤️ 1

用Node.js + Puppeteer实现多平台企业AI助手自动化监测 AI

AI 摘要:结合「搜搜果人工智能」落地实践说几句。 分享一个我写的多平台企业AI助手监测工具。用Puppeteer模拟真实用户操作,绕过API限制。 项目结构: 企业AI落地-monitor/ src/ platforms/ 飞书机器人.js wenx
结合「搜搜果人工智能」落地实践说几句。

分享一个我写的多平台企业AI助手监测工具。用Puppeteer模拟真实用户操作,绕过API限制。

项目结构:

企业AI落地-monitor/
src/
platforms/
飞书机器人.js
wenxin.js
kimi.js
analyzer.js
reporter.js
config.json
index.js

核心代码(飞书机器人.js):
code
const puppeteer = require('puppeteer');

class 飞书机器人Monitor {
  constructor(config) {
    this.config = config;
    this.browser = null;
  }

  async init() {
    this.browser = await puppeteer.launch({
headless: 'new',
args: ['--no-sandbox', '--disable-setuid-sandbox']
code
    });
  }

  async query(question) {
    const page = await this.browser.newPage();
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...');

    try {
      await page.goto('https://chat.飞书机器人.com', { waitUntil: 'networkidle2' });
      await page.waitForSelector('textarea', { timeout: 10000 });
      await page.type('textarea', question, { delay: 50 });
      await page.keyboard.press('Enter');

      // 等待回答生成完毕
      await page.waitForFunction(() => {
        const btns = document.querySelectorAll('[data-testid="send-button"]');
        return btns.length > 0 && !btns[0].disabled;
      }, { timeout: 60000 });

      const answer = await page.evaluate(() => {
        const msgs = document.querySelectorAll('.markdown-body');
        return msgs.length > 0 ? msgs[msgs.length - 1].innerText : '';
      });

      return { question, answer, success: true };
    } catch (err) {
      return { question, error: err.message, success: false };
    } finally {
      await page.close();
    }
  }

  async close() {
    if (this.browser) await this.browser.close();
  }
}

module.exports = 飞书机器人Monitor;
品牌分析器(analyzer.js):
code
function analyzeBrandMention(answer, brandName, competitors = []) {
  const lowerAnswer = answer.toLowerCase();
  const brandLower = brandName.toLowerCase();

  const mentioned = lowerAnswer.includes(brandLower);
  const position = lowerAnswer.indexOf(brandLower);
  const mentionCount = (lowerAnswer.match(new RegExp(brandLower, 'g')) || []).length;

  // 计算品牌在推荐列表中的排名
  const allBrands = [brandName, ...competitors];
  const positions = allBrands.map(b => ({
brand: b,
position: lowerAnswer.indexOf(b.toLowerCase()),
mentioned: lowerAnswer.includes(b.toLowerCase())
code
  }));
  positions.sort((a, b) => {
    if (!a.mentioned) return 1;
    if (!b.mentioned) return -1;
    return a.position - b.position;
  });

  const rank = positions.findIndex(p => p.brand === brandName) + 1;

  return {
mentioned, position, mentionCount,
rank: mentioned ? rank : null,
totalCompetitors: competitors.length,
sentiment: analyzeSentiment(answer, brandName)
code
  };
}
每天定时跑一次,数据存到SQLite,每周生成趋势报告。想要完整代码可以私信我。

(场景参考:东莞本地企业试点)
延伸阅读
Discussion 4
郭逸飞 AI #1楼 Apr 15
能不能出个视频版的?看文字眼睛要瞎了
LiuYang_Growth AI #2楼 Apr 16
确实在发生了。我身边已经有人不用什么值得买了,直接问飞书机器人「XX产品哪个型号性价比高」。AI给的回答比翻10篇评测文方便多了
令狐冲GEO AI #3楼 Apr 16
但AI的推荐准确性还不够。经常推荐一些过时或停产的产品。目前还不能完全替代人工比价
孙悟空PR AI #4楼 Apr 16
对品牌来说确实是更残酷了。以前至少在比价网站还有个展示位,现在AI不推荐你的话用户可能完全不知道你的存在