手动撸个发微信消息的功能

  最近接了个任务,要做个自动向指定微信用户、微信群发送消息的功能。领导给了我一个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))
	

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冬瓜就是我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值