1. 首页

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

wechatBot

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

项目介绍

灵感来源

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

项目地址

github:github.com/gengchen528…

使用库

功能

  • 定时给朋友发送每日天气提醒以及每日一句
  • 根据关键词自动加好友和自动拉群功能
  • 后续继续扩展吧…(你有好的想法也可以提pr)

数据来源

  • 每日一句和上面的大佬一样也是来自one
  • 天气信息来自墨迹天气

定时任务

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

实现效果

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

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

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

代码说明

目录结构

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

  • 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} 登出`)
}
// 监听对话 根据关键词自动加群,Js中文网 - 前端进阶资源教程 www.javascriptc.com,坚信用代码改变世界的平台
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 logMsg
  try {
    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() { // 获取每日一句,Js中文网 - 前端进阶资源教程 www.javascriptc.com,专注用代码改变世界的平台 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.LOCATION let 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 ={ // 基础定时发送功能配置项(必填项) NAME:'A兔子',//备注姓名 NICKNAME:'嗯哼', //昵称 MEMORIAL_DAY:'2015/04/18', //你和收信者的纪念日 CITY:'shanghai',//收信者所在城市 LOCATION:'pudong-new-district',//收信者所在区 (可以访问墨迹天气网站后,查询区的英文拼写) SENDDATE:'0 0 8 * * *',//定时发送时间 每天8点0分0秒发送,规则见 /schedule/index.js ONE:'http://wufazhuce.com/',////ONE的web版网站 MOJI_HOST:'https://tianqi.moji.com/weather/china/', //中国墨迹天气url //高级功能配置项(非必填项) //,Js中文网 - 前端进阶资源教程 www.javascriptc.com,坚信用代码改变世界的平台 AUTOADDFRIEND:false,//自动加好友功能 默认关闭 AUTOADDROOM:false,//自动拉群功能 默认关闭 AUTOREPLY:false,//自动聊天功能 默认关闭 AIBOTAPI:'http://www.tuling123.com/openapi/api',//图灵机器人API 注册地址http://www.turingapi.com/ APIKEY:'你的图灵机器人apikey',//图灵机器人apikey ROOMNAME:'/^你的群名/i', //群名(请只修改中文,不要删除符号,这是正则) ADDFRIENDWORD:'/你要触发的关键词/i',//自动加好友触发的关键词(请只修改中文,不要删除符号,这是正则) ADDROOMWORD:'/加群/',//自动发送群图片触发关键词(请只修改中文,不要删除符号,这是正则) ROOMCODEURL:'http://image.bloggeng.com/qun.png',//群二维码url链接(与本地群二维码路径选填一个) ROOMLOCALPATH:'./static/qun.png',//本地群二维码图片路径(与群url选填一个) }

开始运行


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

待解决问题

  • 由于微信登录和邮件登录不同,所以无法使用进程守护工具,目前没有测试是否能够长时间登录(目前已经解决,第一次需要使用node启动,生成状态维持文件,生成后即可使用pm2等进程守护工具)
  • 因为node的原因,如果发生错误,可能会导致任务无法进行,需要手动重启并登录(已解决)
  • 最好能够使用小号登录,如果是常用微信登录,在电脑客户端登陆后可能会wechaty挤掉
  • 墨迹天气页面在获取的时候可能会存在延时,有时可能获取不到

后续功能

  • 为了防止占用你的微信号,你和你的爱人添加我的微信后。你发送指定内容,我将会每天帮你发送消息
  • 添加了图灵机器人聊天功能
  • 还有在思考中…(你有好的想法也可以提出来)

作者:Leo_chen
链接:https://juejin.im/post/5c77c6bef265da2de6611cff

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「画漫画的程序员」,公众号后台回复「资源」 免费领取我精心整理的前端进阶资源教程

JS中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。欢迎热爱技术的你一起加入交流与学习,JS中文网的使命是帮助开发者用代码改变世界

本文著作权归作者所有,如若转载,请注明出处

转载请注明:文章转载自「 Js中文网 · 前端进阶资源教程 」https://www.javascriptc.com

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

链接:https://www.javascriptc.com/2457.html

« 菜鸟前端也要掌握的几种文件路径知识,你会了吗
用Node+EJS写一个爬虫脚本每天定时女朋友发一封暖心邮件»
Flutter 中文教程资源

相关推荐

QR code