最近,我的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召回计划邮件提醒相关推荐

  1. 部份AirPods Pro出现声音问题 Apple宣布召回计划

    Apple已确定有少数的AirPodsPro可能会遇到声音问题.受影响的装置是在2020年10月前制造,受影响的AirPodsPro可能会出现下列一或多项状况: 1.爆裂声或杂音在吵杂的环境.运动时或 ...

  2. SpringBootAdminServer使用邮件监控服务(服务下线邮件提醒)

    首先需要创建三个项目(或者两个):EurekaServerAdmin.EurekaClientAdmin及EurekaServer(可不要) 这里讲SpringBootAdmin监控服务和使用spri ...

  3. python 监控京东霍尼韦尔(Honeywell)N95口罩是否到货,到货邮件提醒

    python 监控京东霍尼韦尔(Honeywell)N95口罩是否到货,到货邮件提醒 https://item.jd.com/100011293950.html import requests,jso ...

  4. [京东价格监控网站]自定义商品监控/品类商品监控/降价邮件提醒

    在京东购物时,你是否遇到如下情况: 心仪的商品降价了,你却一无所知,等发现了却只有四个大字"到货登记" 你设置了京东自带的降价提醒,结果京东在降价后很久才发邮件提醒你或者干脆没有提 ...

  5. linux 设置邮件提醒,linux 定时邮件提醒

    简单实现对Linux服务器的定时监控,可以通过定时执行任务和邮件收发来实现. 定时执行任务:crontab crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程.crond ...

  6. 域帐号密码快过期邮件提醒

    社会的快速发展,企业的规模也随之变大,这样企业的人数自然也增多,由于人数的众多,为了便于管理所以用起了域环境,但是根据某些企业的性质,部分员工也可能不登陆域帐号,以至密码过期,这样,时间一长,域帐号的 ...

  7. 苹果产品信息查询_苹果维修召回计划 + iPhone辨别真伪

    苹果维修召回计划 近期苹果在其官网发布了一项维修计划,旨在召回部分 MacBook Pro 电脑,他们给出的理由是2015年中期出厂的15寸 MacBook Pro 电池可能存在燃烧风险,为此他们愿意 ...

  8. 用Python做了一个 盯盘机器人,股票价格实时监控,还能邮件通知你!

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 丈夫当为国,破敌如摧山. 前言 P ...

  9. Prometheus 监控报警系统 AlertManager 之邮件告警

    文章目录 1.Prometheus & AlertManager 介绍 2.环境.软件准备 3.启动并配置 Prometheus 3.1.Docker 启动 Prometheus 3.2.Do ...

最新文章

  1. TVM Reduction降低算力
  2. LeetCode 2 Keys Keyboard
  3. python模块之lib2to3(py2转py3自动化工具)
  4. freemarker跳出循环
  5. LeetCode 1197. 进击的骑士(BFS)
  6. arm linux 中断优先级,ARM中断处理过程
  7. jee-weapp是一套基于jfinal,dubbo微服务开发的微信小程序商城项目,首次开放全部拼团前后台源码
  8. 在 Queue 中 poll()和 remove()有什么区别?
  9. 《iOS面试之道》算法基础学习(上)
  10. 导航栏html_html操作和思考(二):统一导航栏文字高度的方法
  11. vb6.0连接access数据库
  12. Neo4j 下载安装
  13. 【小程序】安卓端InnerAudioContext无法销毁
  14. 计算图像中任意四个点连成的四边形面积与Ground truth的IOU(Python)
  15. js中的点击事件(click)的实现方式
  16. 长度标注神器----MarkMan
  17. 分析全基因组上的蛋白信息
  18. 简述https的几种加密方式
  19. Redis源码精炼版
  20. yocto下的cmake版本hello world,追加分层使用

热门文章

  1. 软件加密系统Themida应用程序保护指南(十):高级选项
  2. oj 喵帕斯之天才算数少女
  3. 3款国外比较好用的APK download下载网站推荐
  4. RocketMQ消费者
  5. java处理excel阿里easyexcel
  6. 小区公共广播系统设备接线_广播系统常见四种故障分析
  7. idea中springmvc的配置(结合how2j教程)
  8. 想了解API接口,这一篇就够了
  9. mysql权限系统的工作原理_Mysql权限系统工作原理_PHP教程
  10. SAP 委外加工会计分录