目錄
前言
準備工作
起步
實踐
寫在最後
前言
這篇文章將結合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,這樣做的話會導致下面這個報錯
這是由於高版本(14.6版本後才增加這個函數)的node取os.hostname()時找不到當前計算機的用户名
突然給電腦換系統又不太現實,所以我的快速的解決方式是增加以下代碼(有其他補充,還請大佬指教)
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();
效果:
確認登錄
發送消息
接收消息
實踐
大家如果使用過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();
效果:
這裏由於選擇的是text而不是富文本的方式,所以中間的代碼塊沒有顯示出來,但是簡單的問答還是能夠實現的
寫在最後
本文介紹瞭如何使用wechaty接入node,實現機器人的功能
感謝你看到了最後,如果文章對你有幫助的話,還請點贊支持一下博主,非常感謝