飞道的博客

微信接入ChatGPT,使用Node+ChatGPT+Wechaty做一个微信机器人

1610人阅读  评论(0)

目录

前言

准备工作

起步

实践

写在最后


前言

接上篇文章:站在巨人的肩膀上,用Node+ChatGPT模块实现一个接口_DieHunter1024的博客-CSDN博客

我将ChatGPT模块的使用介绍了一下,使用自己的session发送请求达到调用ChatGPT进行聊天的目的,这篇文章会结合Wechaty去实现一个微信机器人

在开始编码之前,我们先了解一下wechaty

Wechaty是一个支持接入微信的聊天机器人,只需6行代码即可实现一个机器人,其跨平台性,多编程语言支持,使其在众多开源的bot项目中大放光彩。

关于它的使用,官方给的文档已经非常详细了,这里就不做描述

准备工作

  • node环境(v16+)
  • wechaty
  • qrcode-terminal(在控制台显示二维码)

起步

首先使用pnpm/npm/yarn安装以上依赖

创建一个wechaty server


  
  1. const { WechatyBuilder } = require( "wechaty");
  2. const wechaty = WechatyBuilder. build();
  3. wechaty
  4. . on( "scan", (c, status) => {
  5. // status: 2代表链接等待调用,3代表链接已打开,这个链接实际上是提供一个登录的二维码供扫描
  6. if (status=== 2) {
  7. console. log(c)
  8. }
  9. })
  10. . on( "login", (user) => console. log( `用户 ${user} 登录成功`))
  11. . on( "message", (message) => console. log( `收到消息: ${message}`));
  12. wechaty. start();

注意:在使用wechaty时一定要在node v16+环境下运行,我的电脑是win7,不支node13+的,所以我使用强制使用高版本node的方式在win7中运行了node18,这样做的话会导致下面这个报错

这是由于高版本(14.6版本后才增加这个函数)的node取os.hostname()时找不到当前计算机的用户名

突然给电脑换系统又不太现实,所以我的快速的解决方式是增加以下代码(有其他补充,还请大佬指教)


  
  1. Object. defineProperty( require( "os"), "hostname", {
  2. value: () => {
  3. // 防止win7环境下,高版本node取不到os模块的hostname函数结果
  4. return "my-pc-host-name";
  5. },
  6. });
  7. const os = require( "os");
  8. console. log(os. hostname());

到这一步,我们还需要一个二维码的工具qrcode-terminal,将url转换为二维码,提供给手机微信扫描,代码如下:


  
  1. Object. defineProperty( require( "os"), "hostname", {
  2. value: () => {
  3. // 防止win7环境下,高版本node取不到os模块的hostname函数结果
  4. return "my-pc-host-name";
  5. },
  6. });
  7. const qrcode = require( "qrcode-terminal");
  8. const { WechatyBuilder } = require( "wechaty");
  9. const wechaty = WechatyBuilder. build();
  10. wechaty
  11. . on( "scan", (c, status) => {
  12. // status: 2代表等待,3代表扫码完成
  13. status === 2 && qrcode. generate(c, { small: true }, console. log);
  14. })
  15. . on( "login", (user) => console. log( `用户 ${user} 登录成功`))
  16. . on( "message", (message) => console. log( `收到消息: ${message}`));
  17. wechaty. start();

效果:

确认登录

 

发送消息

接收消息

 

实践

大家如果使用过socket的话,应该比较容易理解,这个模块消息的传递是基于发布订阅的

接下来,我们把这个机器人完善一下,配合这篇文章实现的接口,将机器人完整的功能实现一下


  
  1. Object. defineProperty( require( "os"), "hostname", {
  2. value: () => {
  3. // 防止win7环境下,高版本node取不到os模块的hostname函数结果
  4. return "my-pc-host-name";
  5. },
  6. });
  7. const qrcode = require( "qrcode-terminal");
  8. const { WechatyBuilder, ScanStatus } = require( "wechaty");
  9. const { sessionToken } = require( "./session");
  10. const request = require( "request");
  11. const wechaty = WechatyBuilder. build();
  12. const url = "http://127.0.0.1:1024/sendMsg";
  13. const sendChatGPT = ( msg) => {
  14. const { promise, reject, resolve } = defer();
  15. request. post(
  16. url,
  17. {
  18. json: {
  19. msg,
  20. sessionToken,
  21. },
  22. },
  23. (error, res, body) => {
  24. if (error) return reject(error);
  25. console. log(body. msg);
  26. resolve(body. msg);
  27. }
  28. );
  29. return promise;
  30. };
  31. /**
  32. * @name:
  33. * @description: promise扁平处理
  34. * @return {*}
  35. */
  36. const defer = ( ) => {
  37. let resolve, reject;
  38. return {
  39. promise: new Promise( (_resolve, _reject) => {
  40. resolve = _resolve;
  41. reject = _reject;
  42. }),
  43. resolve,
  44. reject,
  45. };
  46. };
  47. const onMessage = async ( msg) => {
  48. // console.log(`收到消息: ${msg.toString()}`);
  49. const msgText = await msg. text();
  50. if (msgText) {
  51. try {
  52. const gptMsg = await sendChatGPT(msgText);
  53. msg. say(gptMsg);
  54. } catch (error) {
  55. msg. say(error);
  56. }
  57. }
  58. };
  59. const onLogout = ( user) => {
  60. console. log( `用户 ${user} 退出成功`);
  61. };
  62. const onLogin = ( user) => {
  63. console. log( `用户 ${user} 登录成功`);
  64. };
  65. const onError = console. error;
  66. const onScan = ( code, status) => {
  67. // status: 2代表等待,3代表扫码完成
  68. status === ScanStatus. Waiting &&
  69. qrcode. generate(code, { small: true }, console. log);
  70. };
  71. wechaty
  72. . on( "scan", onScan)
  73. . on( "login", onLogin)
  74. . on( "logout", onLogout)
  75. . on( "error", onError)
  76. . on( "message", onMessage);
  77. wechaty. start();

效果:

这里由于选择的是text而不是富文本的方式,所以中间的代码块没有显示出来,但是简单的问答还是能够实现的

写在最后

感谢你看到了最后,如果文章对你有帮助的话,还请点赞支持一下博主,非常感谢

源码:ChatGPT-Wechaty-Bot: 使用ChatGPT+Wechaty实现的一个对话机器人


转载:https://blog.csdn.net/time_____/article/details/128270242
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场