使用Wechaty实现微信机器人操作

wechaty

  • Wechaty
  • Wechaty token
    • 什么是wechaty token
    • 如果获取wechaty token
  • Wechaty 与微信Hook的区别
  • Wechaty会不会被封号
  • 自己的一个Wechaty的开源项目

Wechaty

Wechaty 按照我的理解就是一个可以实现微信机器人的多端协议框架。为什么说是多端呢,因为他包含了微信pc协议,web协议,pad协议等。最近他在测试企业微信这块,所以有幸申请了一个token来玩。

Wechaty token

什么是wechaty token

什么是wechaty token 呢,我们来看下面代码

const bot = new Wechaty({puppet: 'wechaty-puppet-hostie',puppetOptions: {'your_token_here',}
});

每个wechaty实例都需要一个token,换句话说,没有token什么都做不了。

如果获取wechaty token

方法有两个:

  1. 靠自己的劳动获取。
    1. 去官网 加这个机器人,然后回复 wechaty 进群聊。
      wechaty官方机器人
    2. 然后机器人会给叫你去填一个分享计划的申请表,提交之后,没过几天就有人找到你,然后给你一个15天的临时token这个时候就能开始玩了。原话如下:

    您确认愿意参与开源激励计划,将最终成品代码开源同时在Wechaty社区内撰写一篇博客。在wechaty(wechaty.js.org)博客审核通过后,每在一个平台(知乎/简书/掘金等)提交一篇博客,Wechaty 社区额外提供3个月有效期 Token,凭博客链接联系JuziBOT申请Token 时长。

  2. 直接用钱砸
    简单有效,不浪费时间,200/月,直接找他们客服说付费就ok

所以,要想要token要不然花时间,要不然就花钱。再次感慨时间就是金钱哈。还是富兰克林大大高瞻远瞩啊。

Wechaty 与微信Hook的区别

说起wechaty,就不得不说另一种微信机器人的构建方式 - 微信hook。
这两者算是殊途共归。只是个人感觉微信hook比较符合国人的山寨精神。
微信hook用山寨大神们的话来说就不外乎两个词。

  1. 获取数据
  2. 创建子程序。
    我们这里主要说wechaty,所以微信hook我就一句话归纳一下,大神们用逆向的思想在计算机上找到微信每个动作的内存池,并计算偏移量,最后,找出规律,创建子程序来模拟微信的所有操作。所以微信hook有个最大的缺点,就是太依赖微信版本,也造成了其的不稳定。一旦一个版本停用,就得重新去研究。
    而wechaty完全是两码事,他是模拟的微信的协议来创建的框架,不依赖与微信版本,程序员们可以安心的写下游代码,上游协议框架api这些事就交给wechaty团队来做。

Wechaty会不会被封号

本身是不会封号的,但是用力太猛就说不准了,比如,你一天转发几万条消息,自动加几百个群,几千号人。。那不封你封睡呢-_-||。

自己的一个Wechaty的开源项目

下面呈上自己的用typescript写的一个wecahty项目,实现简单的加群,加好友,智能聊天等操作。

– 文件目录
|-- app.ts
|-- config.ts
|-- mFriendShip.ts
|-- mMessage.ts
|-- mRoomJoin.ts
|-- mScan.ts
|-- mUser.ts

config.ts

let config = {// puppet_padplus Tokentoken: "your_token_here",// 机器人名字name: "疯疯",// 房间/群聊room: {// 管理群组列表roomList: {// 群名(用于展示,最好是群名,可随意) : 群id(这个可不能随意)院子: "R:1234567890",桌子: "R:1234567890"},// 加入房间回复roomJoinReply: `\n 你好,欢迎你的加入,请自觉遵守群规则,文明交流,最后,请向大家介绍你自己! \n\n Hello, welcome to join, please consciously abide by the group rules, civilized communication, finally, please introduce yourself to everyone!😊`},// 私人personal: {// 好友验证自动通过关键字addFriendKeywords: ["加群", "前端"],// 是否开启加群addRoom: true}}export default config

app.ts

import { Wechaty } from 'wechaty'
import mRoomJoin from "./mRoomJoin"
import mScan from "./mScan"
import mUser from "./mUser"
import mMessage from "./mMessage"
import mFriendShip from "./mFriendShip"import config from "./config"const token = config.tokenconst bot = new Wechaty({puppet: 'wechaty-puppet-hostie',puppetOptions: {token,}
});bot.on("scan", mScan) // 机器人需要扫描二维码时监听.on('login', mUser).on("room-join", mRoomJoin) // 加入房间监听.on("message", mMessage(bot)) // 消息监听.on("friendship", mFriendShip) // 好友添加监听.start()

mFriendShip.ts

import { Friendship } from "wechaty"// 配置文件
import config from "./config"
// 好友添加验证消息自动同意关键字数组
const addFriendKeywords = config.personal.addFriendKeywords// 好友添加监听回调
const mFriendShip = async (friendship: any) =>{let logMsgtry {logMsg = "添加好友" + friendship.contact().name()console.log(logMsg)switch (friendship.type()) {/*** 1. 新的好友请求* 设置请求后,我们可以从request.hello中获得验证消息,* 并通过`request.accept()`接受此请求*/case Friendship.Type.Receive:// 判断配置信息中是否存在该验证消息if (addFriendKeywords.some(v => v == friendship.hello())) {logMsg = `自动通过验证,因为验证消息是"${friendship.hello()}"`// 通过验证await friendship.accept()} else {logMsg = "不自动通过,因为验证消息是: " + friendship.hello()}break/*** 2. 友谊确认*/case Friendship.Type.Confirm:logMsg = "friend ship confirmed with " + friendship.contact().name()break}console.log(logMsg)} catch (e) {logMsg = e.message}
}
export default mFriendShip;

mMessage.ts

import { Message } from "wechaty"
// node-request请求模块包
import request from "request"// 请求参数解码
import urlencode from "urlencode"
// 配置文件
import config from "./config"// 机器人名字
let {name, room} = config
// 管理群组列表
const roomList = room.roomList// 消息监听回调
let bot = (bot: any) => {return async function mMessage(msg: any) {// 判断消息来自自己,直接returnif (msg.self()) returnconsole.log("=============================")console.log(`msg : ${msg}`)console.log(`from: ${msg.from() ? msg.from().name() : null}: ${msg.from() ? msg.from().id : null}`)console.log(`to: ${msg.to()}`)console.log(`text: ${msg.text()}`)console.log(`isRoom: ${msg.room()}`)console.log("=============================")// 判断此消息类型是否为文本if (msg.type() == Message.Type.Text) {// 判断消息类型来自群聊if (msg.room()) {// 获取群聊const room = await msg.room()// 收到消息,提到自己if (await msg.mentionSelf()) {// 获取提到自己的名字let self = await msg.to()self = "@" + self.name()// 获取消息内容,拿到整个消息文本,去掉 @+名字let sendText = msg.text().replace(self, "")// 请求机器人接口回复let res = await requestRobot(sendText)// 返回消息,并@来自人room.say(res, msg.from())return}// 收到消息,没有提到自己  忽略} else {// 回复信息是关键字 “加群”if (await isAddRoom(msg)) return// 回复信息是所管理的群聊名if (await isRoomName(bot, msg)) return// 请求机器人聊天接口let res = await requestRobot(msg.text())// 返回聊天接口内容await msg.say(res)}} else {console.log("消息不是文本!")}}
}export default bot;/*** @description 回复信息是关键字 “加群” 处理函数* @param {Object} msg 消息对象* @return {Promise} true-是 false-不是*/
async function isAddRoom(msg: any) {// 关键字 加群 处理if (msg.text() == "加群") {let roomListName = Object.keys(roomList)let info = `${name}当前管理群聊有${roomListName.length}个,回复群聊名即可加入哦\n\n`roomListName.map(v => {info += "【" + v + "】" + "\n"})msg.say(info)return true}return false
}/*** @description 回复信息是所管理的群聊名 处理函数* @param {Object} bot 实例对象* @param {Object} msg 消息对象* @return {Promise} true-是群聊 false-不是群聊*/
async function isRoomName(bot:any, msg:any) {// 回复信息为管理的群聊名if (Object.keys(roomList).some(v => v == msg.text())) {// 通过群聊id获取到该群聊实例const room = await bot.Room.find({ id: roomList[(msg.text())] })// 判断是否在房间中 在-提示并结束if (await room.has(msg.from())) {await msg.say("您已经在房间中了")return true}// 发送群邀请await room.add(msg.from())await msg.say("已发送群邀请")return true}return false
}/*** @description 机器人请求接口 处理函数* @param {String} info 发送文字* @return {Promise} 相应内容*/
function requestRobot(info: string) {console.log("the request info is "+info)return new Promise((resolve, reject) => {let url = `http://i.itpk.cn/api.php?question=${urlencode(info)}&api_key=xxxx&api_secret=xxxx`//这里去这个api网站itpk.cn登录注册一个就好request.get(url, (error, response, body) => {let sendStr:string = ""// console.log(response)if (!error && response.statusCode == 200) {if(body.indexOf("{") == -1){ sendStr = bodyresolve(sendStr)}else{let res = JSON.stringify(body)res = res.substr(1)res = res.substr(0, res.length-1)if (res) {const reg = /\\/glet send = unescape(res.replace(/\u/g, '%u')); //unicode转中文send = send.replace(reg,''); //去转义,然后编辑字符串send = send.replace(/rn/g,'\\r\\n');send = send.trim()let sendObj = JSON.parse(send)if(sendObj.title){sendStr = "【标题】" + "\n" + JSON.stringify(sendObj.title)+ "\n"}sendStr = sendStr + "【内容】" + "\n" + JSON.stringify(sendObj.content).trim().substr(1).substr(0, res.length-1)console.log("the response send is "+ sendStr)// 免费的接口,所以需要把机器人名字替换成为自己设置的机器人名字resolve(sendStr)}} }else {resolve("你在说什么,我脑子有点短路诶!")}})})
}

mRoomJoin.ts

// 配置文件
import config from "./config"// 加入房间回复
const roomJoinReply = config.room.roomJoinReply
// 管理群组列表
const roomList = config.room.roomList// 进入房间监听回调 room-群聊 inviteeList-受邀者名单 inviter-邀请者
const mRoomJoin = async (room: any, inviteeList:any[], inviter:any) => {// 判断配置项群组id数组中是否存在该群聊idif (Object.values(roomList).some(v => v == room.id)) {// let roomTopic = await room.topic()inviteeList.map(c => {// 发送消息并@room.say(roomJoinReply, c)})}    
}export default mRoomJoin;

mScan.ts


import QrcodeTerminal from "qrcode-terminal"
import { ScanStatus } from 'wechaty-puppet'const mScan = (qrcode:any, status:any) => {if (status === ScanStatus.Waiting) {QrcodeTerminal.generate(qrcode, {small: true}) }
}export default mScan;

mUser.ts


const mUser = async (user: any) => {console.log(`user: ${JSON.stringify(user)}`)}export default mUser;

代码GitHub地址: wechaty_group_managment.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/70018.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

REMIX:重构·连接·进化|徐亚波博士D3大会演讲实录

“欢迎大家和数说故事一起来到新世界,和我们一起,来玩一个AI普适场景的无限游戏。” 在数说故事第六届D3智能营销峰会上,数说故事创始人兼CEO徐亚波博士带来「REMIX——重构连接进化」的主题分享,聚焦“ChatGPT开启的AGI时代有什么…

UBUNTU虚拟机镜像安装后无法联网解决办法

在虚拟机中安装Ubuntu 18.04.6 LTS的过程中,遇到了问题:当我把镜像源更改好之后,运行apt-get update命令,突然发现不能联网,如下图,之后访问baidu验证,确实也无响应; 但是其他装好的…

实在智能魅力抢眼!携超自动化解决方案和校企合作新范式点燃第七届世界智能大会

为深入实施创新驱动发展战略,推动智能科技赋能经济社会发展,促进校企双方交换需求清单,全方位搭建校企握手通道,5月18日,由国家发展和改革委员会、科学技术部、国家广播电视总局、中国科学院等联合主办的第七届世界智能…

使用AI协助写代码步骤:

1,安装 Visual Studio Code 这个软件 下载地址:https://code.visualstudio.com/Download 或 https://o0b.cn/tk/?dvscode (这个地址下载更快) 2,安装ChatGPT扩展 安装好 Visual Studio Code 后,打开Visual Studio Cod…

聊聊A股市场

聊聊A股市场 昨晚关于这块美联储这快,其实从消息层面来讲的话,个人觉得到没什么的,核心还是看整体市场表现,昨天在文章中也谈及不用过多的关心很多的东西这块的,毕竟系统性风险都不在你我的控制范围之内这块的&#xf…

班导师见面会会议记录

班导师见面会会议记录 会议名称 班导师见面会 应到人数 7人 敬泓杰,夏景陶,王宇昊,张俊波,许林霞,陈禹池,张会 会议时间 10月16日下午3点 请假人数 0人 会议地点 明理楼b505 迟到人数 0人 记录人 张剑 缺席…

即兴社交记录#一场跨学科聚会

一个简单的记录, 感兴趣可以关注社群动态

Tal Ben-Shahar 积极心理学_课程小结

本贴只用于自我课程记录,不喜勿喷,喷者biss。 课程介绍:我们来到这个世上,到底追求什么才是最重要的?他坚定地认为:幸福感是衡量人生的唯一标准,是所有目标的最终目标。塔尔博士被誉为"最受…

这份会议录音转文字教程请记得收藏好

录音转文字是一项令人惊叹的技术,它可以将语音内容快速准确地转换成文字形式。无论是会议记录、采访讲话还是个人笔记,通过将录音转换为文字,我们可以更方便地阅读、编辑和分享内容。这项技术不仅提高了工作效率,还有助于信息存储…

对话庄表伟老师-文字实录

我内心有一套价值观,有一套世界观,它是一个完整的整体,无论我做任何的事情,工作也好、生活也好、学习也好、去做社区也好、或者是结识朋友也好、去聊天也好,背后的价值观在内心都是一整套的,互相之间是不会…

如何写出高效、准确的会议记录?

在企业或组织中,会议是一种常见的沟通和决策方式。作为参会人员之一,撰写一份高效、准确的会议记录显得尤为重要。会议记录不仅记录了会议的主题、议题和讨论结果,还能帮助参与者回顾会议过程、梳理思路、明确职责,同时也为后续工…

图书管理系统项目开发计划书

项目开发计划书.rar 来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12443821/viewspace-567546/,如需转载,请注明出处,否则将追究法律责任。 转载于:http://blog.itpub.net/12443821/viewspace-567546/

【项目篇- 项目计划书封面如何设计?(千字图文总结建议)】创新创业竞赛项目计划书

目录 适用范围1 总体建议2 简单设计2.1 形状背景2.2 图片背景 3 复杂设计3.1 项目内容展现3.2 计划书整体设计风格定调 4 互联网、挑战杯等高等级比赛封面设计 本篇结合了若干份国奖省奖计划书,结合个人经验,给出一些项目计划书封面设计的建议&#xff0…

py0_二十一天计划书(前言以及本计划书)

​################################################## 目录 Python 小白的二十一天学习挑战赛 Python 活动简介 创作计划 学习计划 学习日记 学习计划实际完成情况 第一部分 初识 Python 第一天 —— py0_二十一天计划书(前言以及本计划书) …

软件测试——图书管理系统的测试计划书

《图书管理系统》一、简介 1.目的 为了验证图书管理系统的图书管理模块能否正常实现,以图书管理系统作为测试对象,展开系统测试。 2.背景 图书管理系统包括图书录入、图书修改、图书删除、图书查询等九个子系统,用于管…

商业计划书编写注意事项(我真的是正经的程序员。。)

前言 : 公司要写商业计划书,我是社会主义一块砖。把其中一些重要的点记录下来,也是分享给有缘人哈。 1、 要点 1、整体文档要有逻辑性,体系化,每一页应该有其存在的价值。 2、介绍公司主要产品,其他产品可…

博士申请研究计划书

肌肉协同理论的完善与应用 (1)分析不同技术动作中肌肉激活模式,探讨肌肉协同假说在这些激活模式与前人对 于行走运动研究的差异性,同时对核心肌群和上肢肌的肌肉激活模型特征进行整理,总结其 规律性与差异性&#xff…

Python数据分析:爬虫从网页爬取数据需要几步?

对于数据分析师来说,数据获取通常有两种方式,一种是直接从系统本地获取数据,另一种是爬取网页上的数据,爬虫从网页爬取数据需要几步?总结下来,Python爬取网页数据需要发起请求、获取响应内容、解析数据、保…

我用python疯狂爬取公司数据

我是半路从一个纯小白学过来的,学习途中也掉过许多坑,在这里建议新手要先把基础打扎实,然后再去学习自己需要的内容,不要想着全部学完再用,那样你是永远学不完的,用哪方面就学习哪方面的内容,不…

【Python爬虫与数据分析】爬虫网络请求

目录 一、网络请求流程 1.HTTP 2.URL 3.网络传输模型 4.长链接/短链接 二、爬虫基础 1.基础概念 2.发送请求 3.请求模式 4.cookie 5.retrying 一、网络请求流程 1.HTTP 用户输入网址,例如 www.baidu.com浏览器先向DNS请求,找到网址域名对应的…