点击上方“前端小苑”,选择“置顶公众号”

精品技术文章,热门资讯第一时间送达

wechatBot

微信每日说,每日自动发送微信消息给你心爱的人

项目介绍


灵感来源

在掘金看到了一篇《用Node + EJS写一个爬虫脚本每天定时女朋友发一封暖心邮件》后, 在评论区偶然看到一位读者说可不可以用微信实现一下。然后最近刚好在做微信机器人的小项目,那就把这个定时任务放到微信上去做吧,说干就干,撸了一下午终于撸出来了。

项目地址

github:github.com/gengchen528…


使用库

  • wechaty - 微信操作

  • node-schedule - 定时任务

  • superagent - 爬取页面信息

  • cheerio - 抓取页面

  • qrcode-terminal - 终端显示二维码

功能

  • 定时给朋友发送每日天气提醒以及每日一句

  • 根据关键词自动加好友和自动拉群功能

  • 后续继续扩展吧...(你有好的想法也可以提pr)

数据来源

  • 每日一句和上面的大佬一样也是来自one

  • 天气信息来自墨迹天气

定时任务

node-schedule非你莫属了, 可以定时每个月、每个礼拜、每天具体什么时候执行什么任务


实现效果

由于是微信定时发送消息,较邮件来说,微信无法把图片和文字放在同一消息框中,所以美观度来说可能没有邮件好,不过文字进行排版后还是可以的,由于时间仓促,所以文字比较少,后续会继续增加内容;

代码说明

目录结构

  • config: 存放公共变量和superagent的配置

  • schedule: 任务调度的配置

  • superagent: 获取每日一句和天气信息

  • untils: 抽取的共用方法

核心代码

index.js

关于微信的登录,定时任务的创建,发送信息的获取都在这个文件里

/*** WechatBot*  - https://github.com/gengchen528/wechatBot*/
const {Wechaty,Friendship} = require('wechaty')
const schedule = require('./schedule/index')
const config = require('./config/index')
const untils = require('./untils/index')
const superagent = require('./superagent/index')
const {FileBox} = require('file-box') //文件读取模块
//  二维码生成
function onScan (qrcode, status) {require('qrcode-terminal').generate(qrcode)  // 在console端显示二维码const qrcodeImageUrl = ['https://api.qrserver.com/v1/create-qr-code/?data=',encodeURIComponent(qrcode),].join('')console.log(qrcodeImageUrl)
}// 登录
async function onLogin (user) {console.log(`贴心小助理${user}登录了`)// 登陆后创建定时任务schedule.setSchedule(config.SENDDATE,()=>{console.log('你的贴心小助理开始工作啦!')main()})
}//登出
function onLogout(user) {console.log(`${user} 登出`)
}
// 监听对话 根据关键词自动加群
async function onMessage (msg) {const contact = msg.from() // 发消息人const content = msg.text() //消息内容const room = msg.room() //是否是群消息const roomCodeUrl = FileBox.fromUrl(config.ROOMCODEURL) //来自url的文件const roomCodeLocal = FileBox.fromFile(config.ROOMLOCALPATH) //添加本地文件if (msg.self()) {return}if(room){ // 如果是群消息const topic = await room.topic()console.log(`群名: ${topic} 发消息人: ${contact.name()} 内容: ${content}`)}else { // 如果非群消息console.log(`发消息人: ${contact.name()} 消息内容: ${content}`)let addRoomReg = eval(config.ADDROOMWORD)let roomReg = eval(config.ROOMNAME)if(addRoomReg.test(content)&&!room){let keyRoom = await this.Room.find({topic: roomReg})if(keyRoom){try{await contact.say(roomCodeLocal||roomCodeUrl)await keyRoom.say('微信每日说:欢迎新朋友', contact)}catch (e) {console.error(e)}}}else {await contact.say('你好,不要轻易调戏我,我只会发群二维码,不会聊天的!')await contact.say('请回复暗号:加群  获取群二维码图片')}}
}
// 自动加好友功能
async function onFriendShip(friendship) {let logMsgtry {logMsg = '添加好友' + friendship.contact().name()console.log(logMsg)switch (friendship.type()) {/**** 1. New Friend Request** when request is set, we can get verify message from `request.hello`,* and accept this request by `request.accept()`*/case Friendship.Type.Receive:let addFriendReg = eval(config.ADDFRIENDWORD)if (addFriendReg.test(friendship.hello())) {logMsg = '自动添加好友,因为验证信息中带关键字‘每日说’'await friendship.accept()} else {logMsg = '没有通过验证 ' + friendship.hello()}break/**** 2. Friend Ship Confirmed**/case Friendship.Type.Confirm:logMsg = 'friend ship confirmed with ' + friendship.contact().name()break}} catch (e) {logMsg = e.message}console.log(logMsg)
}
// 自动发消息功能
async function main() {let  contact = await bot.Contact.find({name:config.NICKNAME}) || await bot.Contact.find({alias:config.NAME}) // 获取你要发送的联系人let one = await superagent.getOne() //获取每日一句let weather = await superagent.getWeather() //获取天气信息let today = await untils.formatDate(new Date())//获取今天的日期let memorialDay = untils.getDay(config.MEMORIAL_DAY)//获取纪念日天数let str = today + '<br>' + '今天是我们在一起的第' + memorialDay + '天'+ '<br><br>今日天气早知道<br><br>' + weather.weatherTips +'<br><br>' +weather.todayWeather+ '每日一句:<br><br>'+one+'<br><br>'+'------来自最爱你的我'await contact.say(str)//发送消息
}const bot = new Wechaty()bot.on('scan',    onScan)
bot.on('login',   onLogin)
bot.on('logout',  onLogout)
bot.on('message', onMessage)
bot.on('friendship', onFriendShip)bot.start().then(() => console.log('开始登陆微信')).catch(e => console.error(e))

superagent/index.js

const superagent = require('../config/superagent')
const config = require('../config/index')
const cheerio = require('cheerio')async function getOne() { // 获取每日一句let res = await superagent.req(config.ONE,'GET')let $ = cheerio.load(res.text)let todayOneList = $('#carousel-one .carousel-inner .item')let todayOne = $(todayOneList[0]).find('.fp-one-cita').text().replace(/(^\s*)|(\s*$)/g, "")return todayOne;
}async function getWeather() { //获取墨迹天气let url = config.MOJI_HOST+config.CITY+'/'+config.LOCATIONlet res = await superagent.req(url,'GET')let $ = cheerio.load(res.text)let weatherTips = $('.wea_tips em').text()const today = $('.forecast .days').first().find('li');let todayInfo = {Day:$(today[0]).text().replace(/(^\s*)|(\s*$)/g, ""),WeatherText:$(today[1]).text().replace(/(^\s*)|(\s*$)/g, ""),Temp:$(today[2]).text().replace(/(^\s*)|(\s*$)/g, ""),Wind:$(today[3]).find('em').text().replace(/(^\s*)|(\s*$)/g, ""),WindLevel:$(today[3]).find('b').text().replace(/(^\s*)|(\s*$)/g, ""),PollutionLevel:$(today[4]).find('strong').text().replace(/(^\s*)|(\s*$)/g, "")}let obj = {weatherTips:weatherTips,todayWeather:todayInfo.Day + ':' + todayInfo.WeatherText + '<br>' + '温度:' + todayInfo.Temp +  '<br>'+ todayInfo.Wind + todayInfo.WindLevel + '<br>' + '空气:' + todayInfo.PollutionLevel + '<br>'}return  obj
}
module.exports ={getOne,getWeather
}


项目运行

由于需要安装chromium, 所以要先配置一下镜像,注意由于wechaty的限制,最好使用node10以上版本

npm

npm config set registry https://registry.npm.taobao.org
npm config set disturl https://npm.taobao.org/dist
npm config set puppeteer_download_host https://npm.taobao.org/mirrors

yarn

yarn config set registry https://registry.npm.taobao.org
yarn config set disturl https://npm.taobao.org/dist
yarn config set puppeteer_download_host https://npm.taobao.org/mirrors

然后进行项目安装

git clone git@github.com:gengchen528/wechatBot.git
cd wechatBot
npm install 或 cnpm install

参数配置

wechatBot/config/index.js

// 配置文件
module.exports ={ONE:'http://wufazhuce.com/',ONE的web版网站MOJI_HOST:'https://tianqi.moji.com/weather/china/', //中国墨迹天气urlCITY:'shanghai',//收信者所在城市LOCATION:'pudong-new-district',//收信者所在区 (可以访问墨迹天气网站后,查询区的英文拼写)MEMORIAL_DAY:'2015/04/18', //你和收信者的纪念日NAME:'Leo_chen',//备注姓名NICKNAME:'Leo_chen', //昵称SENDDATE:'30 15 8 * * *',//定时发送时间 每天8点15分30秒发送,规则见 /schedule/index.jsROOMNAME:'/^微信每日说/i', //群名(请只修改中文,不要删除符号,这是正则)ADDFRIENDWORD:'/微信每日说/i',//自动加好友触发的关键词(请只修改中文,不要删除符号,这是正则)ADDROOMWORD:'/加群/',//自动发送群图片触发关键词(请只修改中文,不要删除符号,这是正则)ROOMCODEURL:'http://image.bloggeng.com/qun.png',//群二维码url链接(与本地群二维码路径选填一个)ROOMLOCALPATH:'./static/qun.png',//本地群二维码图片路径(与群url选填一个)}

开始运行

npm run start
然后掏出你的手机,最好使用小号,扫描控制台的二维码即可
复制代码

待解决问题

  • 由于微信登录和邮件登录不同,所以无法使用进程守护工具,目前没有测试是否能够长时间登录

  • 因为node的原因,如果发生错误,可能会导致任务无法进行,需要手动重启并登录

  • 最好能够使用小号登录,如果是常用微信登录,在电脑客户端登陆后可能会wechaty挤掉

  • 墨迹天气页面在获取的时候可能会存在延时,有时可能获取不到

后续功能

  • 为了防止占用你的微信号,你和你的爱人添加我的微信后。你发送指定内容,我将会每天帮你发送消息

  • 还有在思考中...(你有好的想法也可以提出来)

关于本文

作者:Leo_Chen

来源:掘金

原文链接:https://juejin.im/post/5c77c6bef265da2de6611cff

版权声明:本文经作者授权转载,版权归作者所有

用Node+wechaty写一个爬虫脚本每天定时给女朋友发微信暖心话相关推荐

  1. 用 Python + itchat 写一个爬虫脚本每天定时给女朋友发微信暖心话

    项目介绍: 灵感来源 在掘金看到了一篇<用Node+wechaty写一个爬虫脚本每天定时给女(男)朋友发微信暖心话>后,我就想为什么不用 Python 去实现这个功能呢. JUST TO ...

  2. 用Python加itchat写一个爬虫脚本每天定时给朋友发微信暖心话

    功能 定时给女朋友发送每日天气.提醒.每日一句. 数据来源 每日一句和上面的大佬一样也是来自ONE·一个 天气信息来自SOJSON 实现效果 代码说明 目录结构 city_dict.py :城市对应编 ...

  3. 用 Python + Itchat 写一个爬虫脚本 每天定时给女友发微信暖心话

    序: 很多小姐姐对于程序员男朋友印象大多是木讷的形象,小编要正义凌然的在此发声,程序员男友绝对不是你认为的死板,他们表达的方式其实更独特,更能温暖到你的心田. 怎么浪漫?看这儿它不就来了吗.!? 项目 ...

  4. 用Node+wechaty写一个爬虫脚本每天定时给女(男)朋友发微信暖心话

    wechatBot 微信每日说,每日自动发送微信消息给你心爱的人 项目介绍 灵感来源 在掘金看到了一篇<用Node + EJS写一个爬虫脚本每天定时女朋友发一封暖心邮件>后, 在评论区偶然 ...

  5. function 多个函数用一个_程序员如何用一个脚本每天定时给多个女友发微信暖心话...

    来自:开源最前线(ID:OpenSourceTop) 很多女孩子都认为程序猿太过老实,一点都不懂得浪漫,但事实是程序猿浪漫起来真没别的男生的事 如果一个女生每天早上醒来,都能收到男朋友发来的暖心问候, ...

  6. 程序员如何用一个脚本每天定时给多个女友发微信暖心话

    来自:开源最前线(ID:OpenSourceTop) 很多女孩子都认为程序猿太过老实,一点都不懂得浪漫,但事实是程序猿浪漫起来真没别的男生的事 如果一个女生每天早上醒来,都能收到男朋友发来的暖心问候, ...

  7. 花三分钟给女票写一个爬虫,做一回模范男友!

    烦恼波及 女票是做运营的,一直苦恼于起推文标题.领导还会频繁突袭:"XX,给这次活动拟一个标题." tmd,自己分内的活都干不完,却要为活动策划起标题流汗,不是自己的活,还得笑着干 ...

  8. python可抓取数据包括什么_Python对JS型数据抓取有什么特别好的方法吗,pythonjs型抓取,想写一个爬虫,但是需要抓...

    Python对JS型数据抓取有什么特别好的方法吗,pythonjs型抓取,想写一个爬虫,但是需要抓 想写一个爬虫,但是需要抓去的的数据是js生成的,在源代码里看不到,要怎么才能抓到呢? 最好是用pyt ...

  9. Storm【实践系列-如何写一个爬虫】 - ParserBolt

    2019独角兽企业重金招聘Python工程师标准>>> 阅读背景: 如果您对爬虫,或则web前端不够了解,请自行google. 代码前提:您需要参阅本ID 所写的前面两篇博文:  S ...

最新文章

  1. 虚拟机win2003安装mysql教程_CentOS7.2虚拟机上安装MySQL 5.6.32的教程
  2. jittor和pytorch生成网络对比之pixelda
  3. 基于脑功率谱检测飞行过程认知网络的脑机接口
  4. python 最小栈
  5. 解压与压缩ramdisk.img文件,生成uramdisk.img文件
  6. java 数组group by_java Group by分组算法
  7. Sql Server中Case函数的使用(上篇)----转载
  8. AIX上增加逻辑卷时报错误0516-787 extendlv: Maximum allocation for logical volume
  9. 神奇的机器人评课_《机器人》教学反思
  10. 香港科技大学计算机专业国内就业6,香港科技大学就业好吗?
  11. forEach与map
  12. NET Compact Framework 与 .NET Framework 之间的差异
  13. Error:不允许有匹配 [xX][mM][lL] 的处理指令目标。
  14. lockdir.exe(文件夹加密软件)重装系统后打不开的解决办法
  15. QuantLib教程(三)BS模型、二叉树模型与欧式期权定价
  16. VLAN-TAG超经典解释
  17. Win10中photoshop打开camera raw 报错
  18. 风能设备物流的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  19. 如何保存卡住的wps_我告诉你wps卡住了怎么办
  20. 中国水泥工业节能减排行业竞争力现状与投资前景规划研究报告2022-2027年新版

热门文章

  1. python爬取饿了么奶茶店外卖数据_奶茶外卖店铺单量太少?那是你忽略了很多细节...
  2. 两部苹果手机同步照片_苹果手机上的备忘录怎么同步
  3. 计算机动画_3dmax的使用(六)
  4. 基于ThinkPHP日历
  5. Java_io体系之PipedWriter、PipedReader简介、走进源码及示例——14
  6. java把距离1970年 1月1日 的秒数 转换成对应的日期
  7. Android项目上传到GItHub
  8. Python输出格式化 格式化字符串语法 format f-string 格式化操作符% 数据类型转换 对齐方式 转换标志字符
  9. 【有利可图网】PS教程:设计制作立体条纹数字
  10. python转exe可执行程序在其他系统上运行时出现的错误