最近接了个任务,要做个自动向指定微信用户、微信群发送消息的功能。领导给了我一个CHATGPT发的代码,让我去调,结果发现基本上用不了,于是自己研究了一个星期,总算把代码全给搞出来了。
下面把步骤列下,大家需要的可以自己试着做
1、创建项目
1.1、新建文件夹,打开,在上方的地址栏中输入“cmd”,在命令行中输入“npm init”,对项目进行初始化
2、相关插件安装
用HBUILDERX打开项目,点击下方的“终端”,或者使用快捷键“ALT+C”打开终端界面,依次输入以下命令
2.1、安装NODE.JS(wechaty需要用16.0.0或以上版本的node,可以直接安装最新版本):npm install -g node@latest
2.2、升级NPM(wechaty需要用7.0或以上版本的npm):npm install npm -g
2.3、安装内置浏览器:npm install puppeteer --save
2.4、安装微信SDK:npm install wechaty@latest
2.5、安装二维码工具(用于微信登录):npm install qrcode-terminal@latest
2.6、安装定时器(用于定时触发任务):npm install node-schedule@latest
3、功能运行
3.1、在终端界面输入命行“node dingdong.js”,即可开始运行。其中“dingdong.js”是开发使用的js文件名,也就是下面放的代码文件名
3.2、在终端界面按快捷键“CTRL+C”,即可停止运行
4、注意事项
4.1、package.json文件中,“type”属性要使用“module”,否则无法直接运行js
4.2、运行程序时,注意把下方的终端界面拉高一些,占到屏幕的一半左右,因为微信登录时需要扫描二维码,二维码图片比较高,终端界面过低可能会二维码展示不完全
import 'dotenv/config.js'
//微信操作库
import { WechatyBuilder,
ScanStatus,
log
//FileBox
} from 'wechaty'
// 关于定时任务一些库
import { scheduleJob,RecurrenceRule } from 'node-schedule'
//微信二维码操作库,用于二维码登录使用
import qrcodeTerminal from 'qrcode-terminal'
//文件相关API
import { FileBox } from 'file-box'
//扫描二维码完成后,调用微信接口进行登录
//该代码是固定的,不要改动
async function onScan (qrcode, status) {
if (status === ScanStatus.Waiting || status === ScanStatus.Timeout) {
qrcodeTerminal.generate(qrcode, { small: true }) // show qrcode on console
const qrcodeImageUrl = [
'https://wechaty.js.org/qrcode/',
encodeURIComponent(qrcode),
].join('')
//log.info('StarterBot', 'onScan: %s(%s) - %s', ScanStatus[status], status, qrcodeImageUrl)
} else {
//log.info('StarterBot', 'onScan: %s(%s)', ScanStatus[status], status)
}
}
//登录成功后启动的事件
//每次启动程序并登录完成(包含扫码登录和缓存登录),即会执行此事件
//如果之前已经扫码登录过,则成功的扫码结果会缓存起来,跟正常的
async function onLogin (user) {
log.info('StarterBot', '%s login', user) //在调试界面输出日志
//以下为指定执行时间
var date = new Date(2023, 8, 7, 16, 12, 0);//格式年月日时分秒
var sch = scheduleJob(date, function(){
//log.info('test1',new Date());
sendMsg()//调用发送功能
});
//sch.cancel()//取消任务
// // 以下为每分钟的第10秒执行
// var rule = new RecurrenceRule();//每分钟的第10秒执行
// rule.second = 10;
// var sch2 = scheduleJob(rule, function(){
// //log.info('test1',new Date());
// //sendMsg()//发送文本
// //sendPic()//发送图片
// sendFile();//发送文件
// });
// //以下为每天17点34分执行
// var rule = new RecurrenceRule();
// rule.hour = 17;
// rule.minute = 34;
// //rule.dayOfWeek=0;//星期,如果需要可以填写,其中周日为0,其他依次加1
// var sch3 = scheduleJob(rule, function(){
// //log.info('test1',new Date());
// //sendMsg()//发送文本
// //sendPic()//发送图片
// sendFile();//发送文件
// });
}
// 发送信息
const sendMsg = async() => {
//以下为给好友发送
//const contact = await bot.Contact.find({name:'测试'})||await bot.Contact.find({alias:'测试'});//获取联系人个人信息,其中name是微信昵称,alias是备注名,精确查询
//contact.say('hello')//发送信息
//以上为给好友发送
//以下为群信息发送
const room = await bot.Room.find('微信群名');//获取群信息;此处的参数是微信群名,目前没有没有模糊查询,只能根据群名精确查询
//log.info('tt',room);//调试界面输出日志,正式使用时可以去除此行;
room.say('TEST')//发送信息
//以上为群信息发送
}
// 发送文件信息
const sendFile = async() => {
const fileBox = FileBox.fromUrl('http://www.jpwb.cc/soft/jpwb873.exe')//目前上传文件在100K左右,超过150K有很大可能失败
//以下为个人信息发送
const contact = await bot.Contact.find({name:'测试'})||await bot.Contact.find({alias:'测试'});//获取联系人个人信息,其中name是微信昵称,alias是备注名,精确查询
contact.say('fileBox')//发送信息
// //以上为个人信息发送
// //以下为群信息发送
// log.info('tt1',new Date());//调试界面输出日志,正式使用时可以去除此行;
// const room = await bot.Room.find('微信好友');//获取群信息;此处的参数是微信群名,目前没有没有模糊查询,只能根据群名精确查询
// room.say(fileBox)//发送信息
// log.info('tt2',new Date());//调试界面输出日志,正式使用时可以去除此行;
// //以上为群信息发送
}
// 发送图片消息
const sendPic = async() => {
//const fileBox = FileBox.fromUrl('https://lmg.jj20.com/up/allimg/4k/s/02/2109250006343S5-0-lp.jpg')
const fileBox = FileBox.fromUrl('https://lmg.jj20.com/up/allimg/4k/s/02/2109250006343S5-0-lp.jpg')
// room.say(fileBox)
//以下为个人信息发送
//const contact = await bot.Contact.find({name:'测试'})||await bot.Contact.find({alias:'测试'});//获取联系人个人信息,其中name是微信昵称,alias是备注名,精确查询
//contact.say('fileBox')//发送信息
//以上为个人信息发送
//以下为群信息发送
const room = await bot.Room.find('微信群名');//获取群信息;此处的参数是微信群名,目前没有没有模糊查询,只能根据群名精确查询
//log.info('tt',room);//调试界面输出日志,正式使用时可以去除此行;
room.say(fileBox)//发送信息
//以上为群信息发送
}
//退出登录事件
async function onLogout (user) {
log.info('StarterBotLogout', '%s logout', user)
}
// 接收到信息时的事件
// 因为我不用这玩艺,所以注释掉了。使用时千万注意别让领导看见,要不然收到不雅信息就很尴尬了
//async function onMessage (msg) {
//log.info('StarterBot5', msg.toString()) //启用此行后,可以打印所有微信信息,信息格式:Message#Text[Contact<张三>@Room<群名>] 测试信息
// if (msg.text() === 'ding') {
// await msg.say('dong')
// }
//}
//创建wechaty对象
const bot = WechatyBuilder.build({
name: 'ding-dong-bot',
//puppet:'wechaty-puppet-wechat4u',
puppet: 'wechaty-puppet-wechat4u'
})
//为wechaty绑定相关事件
bot.on('scan', onScan) //二维码扫描
bot.on('login', onLogin) //登录成功
bot.on('logout', onLogout) //退出登录
//其他事件:加入微信群的邀请:room-invite;加入微信群:room-join;退出微信群:room-leave;置顶微信群:room-topic;好友邀请:friendship;异常:error
//bot.on('message', onMessage) //接收好友/群发送的信息
bot.start()//开始执行
.then(() => log.info('StarterBotStart', 'Starter Bot Started.'))
.catch((e) => log.error('StarterBotError', e))