采集天气每日一句发送邮件
爬取墨迹天气、一个、有道词典的每日一句,通过server酱发送给相应的微信,发送邮件给相应的用户。
微信效果图如下:
邮件效果图如下:
#
前言去年刚开始接触node,在网上找到一个每天定时给女朋友发消息的代码,开始用了一段时间,也没好好看代码。当时只是觉得能写出这种功能应该很NB。最近看了很多基础的知识,对前端有了更多的认识,js也了解的更深入了,就自己动手做了一个。花了一天半吧,还是很有激情的,哈哈。
#
使用git clone
这份代码,或者下载到本地。- 进入根目录,然后
npm install
- 修改
config.js
,设置收件人的相关信息(收件人的邮箱,server酱的码,以及额外要说的话)。 - 修改
sendEmail.js
,修改发件人的邮箱,授权码,修改发送邮件的主题等。 - 设置相应的server酱的码。(只需要中间的那串)详细访问server酱官网。
#
开发过程整体上还是比较顺利的,这次有意识的将代码块分隔开,尽量把每一个功能都单独分隔成一个模块。
爬网站用的是cheerio
这个库,和jquery的用法差不多。主要用css选择器选择相应的dom元素,在这里暴露出我css比较薄弱的弱点,获得相应的内容可能比较粗暴。以后对css选择器用多了应该会有更优雅的读取方式。
发送请求使用的axios
这个库,以前只会用jquery
的ajax
,想要达到同步的效果只会在success
的回调内嵌套ajax
请求。这次将每个功能分隔开,每个函数返回了一个promise
,使用Promise.all[]
之后,在then里面写相应的逻辑,避免了回调嵌套。
发送邮件使用的nodeemail
这个包,找了一份demo就能用,暂时还没深入的研究。这个异步用的是async
和await
,以后要研究一下。
输入:发件人邮箱、授权码、发件人邮箱、主题、内容(html格式)
就可以发送
读取的内容是markdown格式,需要将markdown转化为html格式,使用了showdown
这个包。
使用了定时任务的功能,引入了node-schedule
这个包。在这里还出了一个小bug。
操作:定时给女朋友和我发送邮件,爬取不同地区的墨迹天气的信息,分别发送不同的邮箱。
bug内容:我收到的天气内容是女朋友所在地的。
原因分析:发送邮件是一个异步任务,而定时时间到了之后,爬取的数据放到了同一个全局变量里面。感觉就类似多线程对公共资源的非法访问。我的地区的天气信息被女朋友的覆盖了。
解决方案:将words变为每个函数的私有变量。
#
有待优化- 各个模块分成不同的文件,
index.js
内容变少一些 - 请求one和有道词典每日一句的接口只需要一次就可以,有空了再改改逻辑优化。
#
后记果然还是在开发过程中学东西比较快,做出有意思的东西也比较有成就感,想到什么就查什么,面向github编程。但是这样还是有点浅,待有空时(不如现在就花20分钟看一下)再深入了解一下原理。
偶然间看到了有道词典的每日一句,觉得加上这个逼格很高,但是网页版的有道词典没有这个功能,只有APP才有,还专门下载了charles,连接手机和Mac,用手机打开有道词典,抓取手机的包,才找到那个接口。一波三折也是很快乐。
2019.12.23 晴
written by Rain