2025保姆级 NodeJS 打造微信 AI 机器人私人助手,抓取最新快讯

《前端开发面试题进阶秘籍》:前端登顶-前端知识点梳理

微信 AI 机器人-人工智能技术,为用户提供服务的自动化系统:具备自然语言处理能力、理解用户的文本或语音输入,并给出相应的回复或执行特定的任务的能力。

AI 机器人能够提供 24 小时的实时服务,无论何时何地,用户都能获得即时的信息反馈和帮助。节省了用户搜索信息的时间,提高了效率,并且还可以帮助管理社群,提高社群的活跃度。

一、需求背景&想法
  1. 实时获取快讯如:近期新闻、热点、某位🍠博主论坛、大盘信息
  2. 第一时间拿到最新资讯,进行分析,算法,判断,结合,实操
  3. 技术方案的实现:选型、框架、完善,前端也可以玩转自动化AI
  4. 技术:nodejs、wechaty、qrcode-termina、axios等
  5. 想法:通过axios请求拿取想要的数据层,进行自我算法分析,数据目录化,模块化、统一主入口,进行类型的拆分,分别处理不同的类型数据,以达到自己想要的数据。
  6. 将所爬取的信息分别写入本地,上限200超出删掉首元素,定期对比防止重复发送
  7. 可能存在封号问题:加间隔异步发送、检测频率、检测微信心跳、重启、敏感词等主要避违规问题优化,这个视自己情况。
  8. 代码精简与释放,监视器占用最高0.6,最低释放0
二、显示效果图

在这里插入图片描述
在这里插入图片描述

三、主要核心代码分享(不全仅供参考):

1) 主入口包含:bot机器人的注册与监听、类型处理函数、异步调用间隔

import { initBot } from './bot.mjs'
import { fetchBtcPrice } from './coin/ws.mjs'
import { checkAndCreateFile } from '../utils/fs.mjs'
import { fetchUsSharesNum } from './news/UsShares.mjs'
import { fetchNewsList } from './news/coinShot.mjs'
import { fetchRunRedbook } from './chat/redbook.mjs';
import { fetchUsNewsList } from './news/usNewsShot.mjs'
import { fetchTwitterAllUsers } from './chat/twitter.mjs';
import { colorMap, timeoutMap, JSONPathFile } from '../utils/constant.mjs'
import { isWithinTimeRange, isBtcWithinTimeRange } from '../utils/timeRule.mjs'

let updateTimeout;

for (const path of JSONPathFile) {
  const asObject = path === './sentRemind.json';
  await checkAndCreateFile(path, asObject);
}

// 初始化机器人
await initBot(checkForUpdates);

// 爬虫调用函数
async function checkForUpdates() {
  if (updateTimeout) {
    clearTimeout(updateTimeout);
  }

  try {
    if (isBtcWithinTimeRange()) {
      await fetchBtcPrice();
      await fetchTwitterAllUsers();
    }

    if (isWithinTimeRange(1)) {
      console.log(`${colorMap.success}开始发送币圈News!${colorMap.reset}`);
      await fetchNewsList();
    }

    if (isWithinTimeRange(2)) {
      console.log(`${colorMap.success}开始发送美股News!${colorMap.reset}`);
      await fetchUsNewsList();
    }

    if (isWithinTimeRange(4)) {
      console.log(`${colorMap.success}开始发送小红书Notes!${colorMap.reset}`);
      await fetchRunRedbook();
    }

    if (isWithinTimeRange(3)) {
      console.log(`${colorMap.success}开始发送美股指数!${colorMap.reset}`);
      await fetchUsSharesNum();
    }

  } finally {
    updateTimeout = setTimeout(checkForUpdates, timeoutMap.newTimeout);
  }
}

2) bot机器人注册&主进程的监听报错处理
import fs from 'fs';
import path from 'path';
import { WechatyBuilder } from 'wechaty';
import qrcodeTerminal from 'qrcode-terminal';
import { PuppetWechat4u } from 'wechaty-puppet-wechat4u';
import { colorMap, groupName } from '../utils/constant.mjs';
import { sleep, formatDateTime } from '../utils/utilsTool.mjs';

const timeoutDuration = 15 * 60000; // 15 minutes

const pingWxTimeout = 35 * 60000

let timeoutId, scanTimeout, sessionTimeout,
  isQrcodeRegistered = false, isLoggedIn = false;

const flagLoginName = 'xxxxx';

// 初始化机器人
const bot = WechatyBuilder.build({
  name: flagLoginName,
  puppet: new PuppetWechat4u()
});

const initBot = (checkFetchFn) => {
  bot.on('scan', (qrcode) => {
    if (isLoggedIn || isQrcodeRegistered) return; // 如果已经登录或者已注册二维码,跳过扫码
    console.log('二维码链接:', `https://wechaty.js.org/qrcode/${encodeURIComponent(qrcode)}`);
    qrcodeTerminal.generate(qrcode, { small: true });
    isQrcodeRegistered = true;

    scanTimeout = setTimeout(async () => {
      console.log('五分钟内未扫码,结束进程。');
      await isCheckWechatOnline()
      await sleep(3000)
      process.exit(1);
    }, 5 * 60000);
  });

  // 监听登录事件
  bot.on('login', async user => {
    isLoggedIn = true;
    clearTimeout(scanTimeout);
    console.log(`${colorMap.error}用户 ${user} 已登录${colorMap.reset}`);
    await checkFetchFn();
    sessionTimeout = setTimeout(() => keepSessionAlive(), pingWxTimeout);
  });

  // 监听登出事件,重置登录状态
  bot.on('logout', user => {
    isLoggedIn = false;
    isQrcodeRegistered = false;
    console.log(`${colorMap.warn}用户 ${user} 已登出${colorMap.reset}`);
  });

  // 启动机器人
  bot.start()
    .then(async () => {
      console.log(`${colorMap.warn}Wechaty 已启动${colorMap.reset}`);
    })
    .catch(e => console.error(`机器人启动失败:${e}`));
}


// 查找群聊
const findGroup = async () => {
  // ....省略
}

// 捕获主进程异常
process.on('uncaughtException', async (err) => {
  // 视自己的报错情况做特殊处理....
  await sleep(1800000) // 30分钟后结束进程
  process.exit(1);
});

// 定义重启逻辑
function resetTimeout() {
  if (timeoutId) clearTimeout(timeoutId);
  const resetLogin = async () => {
    try {
      await bot.stop();
      console.log('Bot 已停止,准备重启...');
      isLoggedIn = false;
      await bot.start()
    } catch (e) {
      console.error('重启时发生错误:', e);
    }
  }
  resetLogin()
  timeoutId = setTimeout(() => resetLogin(), timeoutDuration);
}

// 登录失效检测心跳停止
const isCheckWechatOnline = async () => {
  // 视自己情况而定
}

// 保持wx心跳检测
const keepSessionAlive = async () => {
  // 视自己情况而定
};

export { initBot, findGroup };

export default bot;

四、科技改变生活(不全仅供参考):
  1. 本篇文章仅供技术学习分享,具体思路已在本文展现,核心代码不做分享
  2. 技术是前沿发展的,我们是需要一步步探索学习的,抓取你想要的信息,为自己想要的生活做出一分的小努力!
  3. 如有想法也可跟博主私聊分享想法,也可进群共享体验💐💐💐
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunnyRun!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值