在黑马程序员学习,免费教程,感谢!(还不是因为没钱)
环境配置Node下载
项目依赖包
依赖包名称 | 功能描述 ———- | ————- superagent | HTTP请求 cheerio | 解析HTML art-template| 模板引擎 nodemailer|发送邮件 node-schedule|定时任务
初始化项目+包
npm init -y
npm install superagent cheerio art-template nodemailer node-schedule
邮件功能
创建main.js
日期计算
当前时间-认识时间,再转换成天数
// 计算认识的天数与获取当前日期 并返回到html
function getDayData(){
return new Promise((resolve,reject)=>{
// 现在的时间
const today = new Date();
// 认识的时间2019-03-06
const meet = new Date('2019-03-06');
const count = Math.ceil((today - meet) / 1000 / 60 / 60 / 24);
const format = today.getFullYear() + '/' + (today.getMonth() + 1) + '/' +today.getDate();
const dayDate = {
count,format
}
})
}
爬虫获取天气数据
爬去墨迹天气的数据
// 引入superagent 包,用于服务器发送http请求
const superagent = require('superagent');
// 引入cheerio,把字符串解析为html
const cheerio = require('cheerio');
// 请求墨迹天气获取数据
function getMojiData(){
superagent.get('https://tianqi.moji.com/weather/china/zhejiang/cixi').end((err,res)=>{
if(err) return console.log("数据请求失败,请检查路径");
const $ = cheerio.load(res.text);
const temperature = $('.wea_weather em').text();
const icon = $('.wea_weather span img').attr('src');
const weather = $('.wea_weather b').text();
const tips = $('.wea_tips em').text();
const mojiData = {
temperature,icon,weather,tips
}
console.log(mojiData);
});
}
爬虫获取One页面的数据
function getOneData(){
superagent.get('wufazhuce.com').end((err,res)=>{
if(err) return console.log("数据请求失败,请检查路径");
const $ = cheerio.load(res.text);
const img = $('.carousel-inner>.item>img, .carousel-inner>.item>a>img').eq(0).attr('src');
const text = $('.fp-one .fp-one-cita-wrapper .fp-one-cita a').eq(0).text();
const OneData = {
img,text
}
console.log(OneData);
})
}
用模板引擎替换html数据
引入模板,获取所有数据 要使用await,等待获取数据完毕再进行下一步操作 await需要与Promise配合使用
html钟替换的数据格式为 例如”,
// 引入模板引擎
const template = require('art-template');
// 引入path模块处理路径问题
const path = require('path');
// 通过模板引擎替换html数据
async function renderTemplate(){
// 获取各种信息
const dayData = await getDayData();
const mojiData = await getMojiData();
const oneData = await getOneData();
// 用模板引擎进行数据替换
const html = template(path.join(__dirname,'./love.html'),{
dayData,mojiData,oneData
});
}
引入发送邮件模块
// 引入发送邮件模块
"use strict";
const nodemailer = require("nodemailer");
// async..await is not allowed in global scope, must use a wrapper
async function sendEmail(){
const html = await renderTemplate();
// create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({
host: "smtp.163.com",
port: 465,
secure: true, // true for 465, false for other ports
auth: {
user: "zhjcezh@163.com", // 邮箱账号
pass: "******" // 客户端授权密码
}
});
// send mail with defined transport object
let mailOptions = await transporter.sendMail({
from: '"宇宙无敌第一大帅比" <zhjcezh@163.com>', // sender address
to: "zhjcezh@163.com", // list of receivers
subject: "hulalalala", // Subject line
html: html // html body
});
transporter.sendMail(mailOptions,(error,info={})=>{
if(error){
console.log("失败");
sendEmail();
}
console.log("邮件发送成功");
})
}
每天定时发送
// 定时每天发送
// 引入模块,创建定时器任务
var schedule = require('node-schedule');
var j = schedule.scheduleJob('14 13 20 5 * *', function(){
sendEmail();
console.log('邮件发送成功');
})