目錄

前言

準備工作

起步

實踐

寫在最後


docker搭建個人版微信機器人_os模塊

前言

這篇文章將結合Wechaty去實現一個機器人

在開始編碼之前,我們先了解一下wechaty

Wechaty是一個聊天機器人,只需6行代碼即可實現一個機器人,其跨平台性,多編程語言支持,使其在眾多開源的bot項目中大放光彩。

關於它的使用,官方給的文檔已經非常詳細了,這裏就不做描述

準備工作

  • node環境(v16+)
  • wechaty
  • qrcode-terminal(在控制枱顯示二維碼)

起步

首先使用pnpm/npm/yarn安裝以上依賴

創建一個wechaty server

const { WechatyBuilder } = require("wechaty");

const wechaty = WechatyBuilder.build();
wechaty
  .on("scan", (c, status) => {
    // status: 2代表鏈接等待調用,3代表鏈接已打開,這個鏈接實際上是提供一個登錄的二維碼供掃描
    if (status===2) {
      console.log(c)
    }
  })
  .on("login", (user) => console.log(`用户 ${user} 登錄成功`))
  .on("message", (message) => console.log(`收到消息: ${message}`));
wechaty.start();

注意:在使用wechaty時一定要在node v16+環境下運行,我的電腦是win7,不支node13+的,所以我使用強制使用高版本node的方式在win7中運行了node18,這樣做的話會導致下面這個報錯

docker搭建個人版微信機器人_用户名_02

這是由於高版本(14.6版本後才增加這個函數)的node取os.hostname()時找不到當前計算機的用户名

docker搭建個人版微信機器人_用户名_03

docker搭建個人版微信機器人_docker搭建個人版微信機器人_04

突然給電腦換系統又不太現實,所以我的快速的解決方式是增加以下代碼(有其他補充,還請大佬指教)

Object.defineProperty(require("os"), "hostname", {
  value: () => {
    // 防止win7環境下,高版本node取不到os模塊的hostname函數結果
    return "my-pc-host-name";
  },
});

const os = require("os");
console.log(os.hostname());

到這一步,我們還需要一個二維碼的工具qrcode-terminal,將url轉換為二維碼,提供給手機掃描,代碼如下:

Object.defineProperty(require("os"), "hostname", {
  value: () => {
    // 防止win7環境下,高版本node取不到os模塊的hostname函數結果
    return "my-pc-host-name";
  },
});
const qrcode = require("qrcode-terminal");
const { WechatyBuilder } = require("wechaty");

const wechaty = WechatyBuilder.build();
wechaty
  .on("scan", (c, status) => {
    // status: 2代表等待,3代表掃碼完成
    status === 2 && qrcode.generate(c, { small: true }, console.log);
  })
  .on("login", (user) => console.log(`用户 ${user} 登錄成功`))
  .on("message", (message) => console.log(`收到消息: ${message}`));
wechaty.start();

效果:

確認登錄

docker搭建個人版微信機器人_用户名_05

 

docker搭建個人版微信機器人_os模塊_06

發送消息

docker搭建個人版微信機器人_os模塊_07

接收消息

 

docker搭建個人版微信機器人_os模塊_08

實踐

大家如果使用過socket的話,應該比較容易理解,這個模塊消息的傳遞是基於發佈訂閲的

接下來,我們把這個機器人完善一下,配合這篇文章實現的接口,將機器人完整的功能實現一下

Object.defineProperty(require("os"), "hostname", {
  value: () => {
    // 防止win7環境下,高版本node取不到os模塊的hostname函數結果
    return "my-pc-host-name";
  },
});

const qrcode = require("qrcode-terminal");
const { WechatyBuilder, ScanStatus } = require("wechaty");
const { sessionToken } = require("./session");
const request = require("request");
const wechaty = WechatyBuilder.build();
const url = "http://127.0.0.1:1024/sendMsg";
const sendChatGPT = (msg) => {
  const { promise, reject, resolve } = defer();
  request.post(
    url,
    {
      json: {
        msg,
        sessionToken,
      },
    },
    (error, res, body) => {
      if (error) return reject(error);
      console.log(body.msg);
      resolve(body.msg);
    }
  );
  return promise;
};
/**
 * @name:
 * @description: promise扁平處理
 * @return {*}
 */
const defer = () => {
  let resolve, reject;
  return {
    promise: new Promise((_resolve, _reject) => {
      resolve = _resolve;
      reject = _reject;
    }),
    resolve,
    reject,
  };
};

const onMessage = async (msg) => {
  // console.log(`收到消息: ${msg.toString()}`);
  const msgText = await msg.text();
  if (msgText) {
    try {
      const gptMsg = await sendChatGPT(msgText);
      msg.say(gptMsg);
    } catch (error) {
      msg.say(error);
    }
  }
};
const onLogout = (user) => {
  console.log(`用户 ${user} 退出成功`);
};
const onLogin = (user) => {
  console.log(`用户 ${user} 登錄成功`);
};
const onError = console.error;
const onScan = (code, status) => {
  // status: 2代表等待,3代表掃碼完成
  status === ScanStatus.Waiting &&
    qrcode.generate(code, { small: true }, console.log);
};

wechaty
  .on("scan", onScan)
  .on("login", onLogin)
  .on("logout", onLogout)
  .on("error", onError)
  .on("message", onMessage);
wechaty.start();

效果:

docker搭建個人版微信機器人_用户名_09

這裏由於選擇的是text而不是富文本的方式,所以中間的代碼塊沒有顯示出來,但是簡單的問答還是能夠實現的

寫在最後

本文介紹瞭如何使用wechaty接入node,實現機器人的功能

感謝你看到了最後,如果文章對你有幫助的話,還請點贊支持一下博主,非常感謝