Nodejs监控Apple召回计划邮件提醒
最近,我的13寸 MacBook Pro 2015款电池膨胀了
把笔记本平放在桌面,四个脚中的前两个无法落地,笔记本盖合上之后,屏幕上会印上键盘的纹路,也就是说,笔记本C面D面变形了,已经购买超过3年,售后不给换,同年生产的15寸的MacBook Pro因为同样的问题出了电池召回计划,我想着再坚持一下,看看13寸的会不会也出召回计划
Apple的召回计划全都更新在这里https://support.apple.com/zh-cn/exchange_repair,每天手动去查看一次,不太对得起这台笔记本,干脆写了一个爬虫监控这个页面,有最新消息就邮件通知我,对笔记本来说,也算是“自己的事情自己做”
首先利用axios加载页面,cheerio负责解析,然后找到最新一篇召回计划的标题和链接
import axios from 'axios'; import async from 'async'; import cheerio from 'cheerio';const URL = 'https://support.apple.com/zh-cn/exchange_repair'; const homePage = await axios.get(URL); const $ = cheerio.load(homePage.data); const firstRepair = $('.as-columns .table-responsive .icon-chevronright'); const firstTitle = firstRepair.eq(0).text(); const firstHref = firstRepair.closest('a').attr('href');
比对标题的开头,是不是以“13 英寸 MacBook Pro”开头的,如果是,用nodemailer以我qq邮箱的身份发邮件给我(发到我的gmail邮箱)
import nodemailer from 'nodemailer';import path from 'path';
const reg = /^13 英寸 MacBook Pro/g; // 创建传输器对象 let transporter = nodemailer.createTransport({service: 'qq',port: 465,secureConnection: true,auth: {// 发件人地址user: 'xxxx@qq.com',// SMTP授权码pass: 'xxxx'} });// 有针对MacBook Pro 13寸的新召回计划,邮件我 if (reg.test(firstTitle)) {let mailOptions = {// 发件人from: '"【我的定时任务】"xxxx@qq.com', // 收件人to: 'wangmeijian2016@gmail.com', // 邮件主题subject: '有针对MacBook Pro 13寸的新召回计划了', // 发送text或者html格式// text: 'Hello world?',html: `<div><h3><a style="color: black" href="https://support.apple.com${firstHref}" target="_blank">${firstTitle}</a></h3><img src="cid:01" /></div>`,// 附件 attachments: [{filename: 'Apple.png',path: path.resolve(__dirname, 'Apple.png'),cid: '01',}]};transporter.sendMail(mailOptions, (err, info) => {if (err) {return console.log(err);}}); }
其中transporter里的pass不是邮箱密码,而是SMTP授权码,就是授权nodejs用我的qq邮箱发邮件,在qq邮箱【设置】-【账户】里面开启SMTP服务并获取SMTP授权码
你可能注意到我在邮件HTML模板里加入了一张图片Apple.png,并且这张图片的来源就是附件,给附件加个cid就可以在模板里引用了,图片是邮件HTML模板唯一可以引用的外部资源,其他包括字体文件、视频、js文件等都不可引用
另外需要注意的是,我将召回计划的标题颜色设置为黑色,用的是行间样式,是考虑到两个问题
一是兼容性问题,部分邮箱客户端会过滤掉style标签
二是行间样式权重高,web版gmail会给a链接增加一个样式类,设置链接的字体颜色为蓝色,我利用样式权重高的特性,将浏览器给的样式覆盖,从而达到我要的效果
做了个测试,字体颜色前后对比
更多类似兼容性去这里查询
mailOptions还有更多配置,如CC抄送等,更多配置请到这里查看
回到正题,我的需求是每天自动查看一次,此处需要一个定时任务,交给node-schedule
import schedule from 'node-schedule';// 每天上午9点执行 schedule.scheduleJob('0 9 * * *', () => {// 每天到点干某事 });
综上,完整代码如下
/*** 定时查看Apple召回计划&邮件提醒*/ import schedule from 'node-schedule'; import axios from 'axios'; import async from 'async'; import cheerio from 'cheerio'; import nodemailer from 'nodemailer'; import dayjs from 'dayjs'; import path from 'path';const formatString = 'YYYY-MM-DD HH:mm'; const timestamp = () => {return dayjs().format(formatString); } const reptile = async () => {const URL = 'https://support.apple.com/zh-cn/exchange_repair';const homePage = await axios.get(URL);const $ = cheerio.load(homePage.data);const firstRepair = $('.as-columns .table-responsive .icon-chevronright');const firstTitle = firstRepair.eq(0).text();const firstHref = firstRepair.closest('a').attr('href');const reg = /^13 英寸 MacBook Pro/g;// 创建传输器对象let transporter = nodemailer.createTransport({service: 'qq',port: 465,secureConnection: true,auth: {user: 'xxx@qq.com',pass: 'xxx'}});// 有针对MacBook Pro 13寸的新召回计划,邮件我if (reg.test(firstTitle)) {let mailOptions = {// 发件人from: '"【我的定时任务】"xxx@qq.com', // 收件人to: 'wangmeijian2016@gmail.com', // 邮件主题subject: '有针对MacBook Pro 13寸的新召回计划了', // 发送text或者html格式// text: 'Hello world?',html: `<div><h3><a style="color: black" href="https://support.apple.com${firstHref}" target="_blank">${firstTitle}</a></h3><img src="cid:01" /></div>`,// 附件 attachments: [{filename: 'Apple.png',path: path.resolve(__dirname, 'Apple.png'),cid: '01',}]};transporter.sendMail(mailOptions, (err, info) => {if (err) {return console.log(err);} else {console.log(`${timestamp()}:邮件已发送~`);}});}else{console.log(`${timestamp()}:Apple暂无新召回计划~`);} }; reptile(); console.log(`${timestamp()}:定时任务执行中……`);// 每天上午9点执行 schedule.scheduleJob('0 9 * * *', () => {try {reptile();} catch (err) {console.log(err);} });
由于nodejs不能直接执行ES6,需要配置一下环境
一、安装babel-node
npm i -g @babel/core @babel/node
二、安装 presets 并配置 .babelrc 文件
npm i @babel/preset-env --save-dev
配置.babelrc
{"presets": [ "@babel/preset-env" ] }
OK,可以执行了
babel-node xxx.js
……
本文地址:https://www.cnblogs.com/wangmeijian/p/11225845.html
转载于:https://www.cnblogs.com/wangmeijian/p/11225845.html
Nodejs监控Apple召回计划邮件提醒相关推荐
- 部份AirPods Pro出现声音问题 Apple宣布召回计划
Apple已确定有少数的AirPodsPro可能会遇到声音问题.受影响的装置是在2020年10月前制造,受影响的AirPodsPro可能会出现下列一或多项状况: 1.爆裂声或杂音在吵杂的环境.运动时或 ...
- SpringBootAdminServer使用邮件监控服务(服务下线邮件提醒)
首先需要创建三个项目(或者两个):EurekaServerAdmin.EurekaClientAdmin及EurekaServer(可不要) 这里讲SpringBootAdmin监控服务和使用spri ...
- python 监控京东霍尼韦尔(Honeywell)N95口罩是否到货,到货邮件提醒
python 监控京东霍尼韦尔(Honeywell)N95口罩是否到货,到货邮件提醒 https://item.jd.com/100011293950.html import requests,jso ...
- [京东价格监控网站]自定义商品监控/品类商品监控/降价邮件提醒
在京东购物时,你是否遇到如下情况: 心仪的商品降价了,你却一无所知,等发现了却只有四个大字"到货登记" 你设置了京东自带的降价提醒,结果京东在降价后很久才发邮件提醒你或者干脆没有提 ...
- linux 设置邮件提醒,linux 定时邮件提醒
简单实现对Linux服务器的定时监控,可以通过定时执行任务和邮件收发来实现. 定时执行任务:crontab crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程.crond ...
- 域帐号密码快过期邮件提醒
社会的快速发展,企业的规模也随之变大,这样企业的人数自然也增多,由于人数的众多,为了便于管理所以用起了域环境,但是根据某些企业的性质,部分员工也可能不登陆域帐号,以至密码过期,这样,时间一长,域帐号的 ...
- 苹果产品信息查询_苹果维修召回计划 + iPhone辨别真伪
苹果维修召回计划 近期苹果在其官网发布了一项维修计划,旨在召回部分 MacBook Pro 电脑,他们给出的理由是2015年中期出厂的15寸 MacBook Pro 电池可能存在燃烧风险,为此他们愿意 ...
- 用Python做了一个 盯盘机器人,股票价格实时监控,还能邮件通知你!
点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 丈夫当为国,破敌如摧山. 前言 P ...
- Prometheus 监控报警系统 AlertManager 之邮件告警
文章目录 1.Prometheus & AlertManager 介绍 2.环境.软件准备 3.启动并配置 Prometheus 3.1.Docker 启动 Prometheus 3.2.Do ...
最新文章
- TVM Reduction降低算力
- LeetCode 2 Keys Keyboard
- python模块之lib2to3(py2转py3自动化工具)
- freemarker跳出循环
- LeetCode 1197. 进击的骑士(BFS)
- arm linux 中断优先级,ARM中断处理过程
- jee-weapp是一套基于jfinal,dubbo微服务开发的微信小程序商城项目,首次开放全部拼团前后台源码
- 在 Queue 中 poll()和 remove()有什么区别?
- 《iOS面试之道》算法基础学习(上)
- 导航栏html_html操作和思考(二):统一导航栏文字高度的方法
- vb6.0连接access数据库
- Neo4j 下载安装
- 【小程序】安卓端InnerAudioContext无法销毁
- 计算图像中任意四个点连成的四边形面积与Ground truth的IOU(Python)
- js中的点击事件(click)的实现方式
- 长度标注神器----MarkMan
- 分析全基因组上的蛋白信息
- 简述https的几种加密方式
- Redis源码精炼版
- yocto下的cmake版本hello world,追加分层使用