/dailyRobot

爬取墨迹天气、一个、有道词典的每日一句,通过server酱发送给相应的微信

Primary LanguageJavaScript

dailyRobot

爬取墨迹天气、一个、有道词典的每日一句,通过server酱发送给相应的微信,发送邮件给相应的用户。


更新

重构代码逻辑,减小耦合 修改体验bug: 有道的每日一句的source有可能会是两个《《今天的来源》》 2021.1.31


微信效果图如下:
微信效果图
邮件效果图如下:
邮件效果图

前言

去年刚开始接触node,在网上找到一个每天定时给女朋友发消息的代码,开始用了一段时间,也没好好看代码。当时只是觉得能写出这种功能应该很NB。最近看了很多基础的知识,对前端有了更多的认识,js也了解的更深入了,就自己动手做了一个。花了一天半吧,还是很有激情的,哈哈。

使用

  1. git clone 这份代码,或者下载到本地。
  2. 进入根目录,然后npm install
  3. 修改config.js,设置收件人的相关信息(收件人的邮箱,server酱的码,以及额外要说的话)。
  4. 修改sendEmail.js,修改发件人的邮箱,授权码,修改发送邮件的主题等。
  5. 设置相应的server酱的码。(只需要中间的那串)详细访问server酱官网

开发过程

整体上还是比较顺利的,这次有意识的将代码块分隔开,尽量把每一个功能都单独分隔成一个模块。


爬网站用的是cheerio这个库,和jquery的用法差不多。主要用css选择器选择相应的dom元素,在这里暴露出我css比较薄弱的弱点,获得相应的内容可能比较粗暴。以后对css选择器用多了应该会有更优雅的读取方式。


发送请求使用的axios这个库,以前只会用jqueryajax,想要达到同步的效果只会在success的回调内嵌套ajax请求。这次将每个功能分隔开,每个函数返回了一个promise,使用Promise.all[]之后,在then里面写相应的逻辑,避免了回调嵌套。


发送邮件使用的nodeemail这个包,找了一份demo就能用,暂时还没深入的研究。这个异步用的是asyncawait,以后要研究一下。
输入:发件人邮箱、授权码、发件人邮箱、主题、内容(html格式)
就可以发送


读取的内容是markdown格式,需要将markdown转化为html格式,使用了showdown这个包。


使用了定时任务的功能,引入了node-schedule这个包。在这里还出了一个小bug。
操作:定时给女朋友和我发送邮件,爬取不同地区的墨迹天气的信息,分别发送不同的邮箱。
bug内容:我收到的天气内容是女朋友所在地的。
原因分析:发送邮件是一个异步任务,而定时时间到了之后,爬取的数据放到了同一个全局变量里面。感觉就类似多线程对公共资源的非法访问。我的地区的天气信息被女朋友的覆盖了。
解决方案:将words变为每个函数的私有变量。


有待优化

  1. 各个模块分成不同的文件,index.js内容变少一些
  2. 请求one和有道词典每日一句的接口只需要一次就可以,有空了再改改逻辑优化。

后记

果然还是在开发过程中学东西比较快,做出有意思的东西也比较有成就感,想到什么就查什么,面向github编程。但是这样还是有点浅,待有空时(不如现在就花20分钟看一下)再深入了解一下原理。
偶然间看到了有道词典的每日一句,觉得加上这个逼格很高,但是网页版的有道词典没有这个功能,只有APP才有,还专门下载了charles,连接手机和Mac,用手机打开有道词典,抓取手机的包,才找到那个接口。一波三折也是很快乐。

2019.12.23
written by Rain