参照传智播客的视频所写代码。
js代码:
//引用superagent包,用于服务器发送http请求 const request = require(‘superagent‘); //导入cheerio包 解析http const cheerio = require(‘cheerio‘); //导入 art-template const template = require(‘art-template‘); //导入PATH const path = require(‘path‘); //导入nodemaler发送邮件的包 const nodemailer = require(‘nodemailer‘); //导入定时任务包 var schedule = require(‘node-schedule‘); function getDate(){ return new Promise((resolve , reject)=>{ //现在的时间 const today = new Date(); //认识的时间 const meet = new Date("**-**-**"); //认识的天数 const count = Math.floor((today - meet)/1000/60/60/24); //今天的日期 const format = today.getFullYear() + " / " +(today.getMonth()+1) + " / " + today.getDate(); const dayDate = { count, format } // console.log(daydate); resolve(dayDate); }); } // getDate(); //请求墨迹天气的数据 function getMojiData(){ return new Promise((resolve , reject)=>{ request.get(‘http://tianqi.moji.com/weather/china/hebei/shijiazhuang‘).end((err,res)=>{ if(err) return console.log("数据请求失败"); // console.log(res.text); const $ = cheerio.load(res.text); //温度 const wendu = $(".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 = { icon, weather, wendu, tips } resolve(mojiData); }); }); } // getMojiData(); //请求One页面抓取数据 function getOneData(){ return new Promise((resolve , reject)=>{ request.get(‘http://wufazhuce.com/‘).end((err,res)=>{ if(err) return console.log("数据请求失败"); //把返回值中的数据解析成HTML const $ = cheerio.load(res.text); //抓取One的图片 const img = $(‘.carousel-inner>.item>img, .carousel-inner>.item>a>img‘).eq(0).attr(‘src‘); //抓取One的文本 const text = $(‘.fp-one .fp-one-cita-wrapper .fp-one-cita a‘).eq(0).text(); const OneData = { img, text } resolve(OneData); }); }); } function getOneData_2(){ return new Promise((resolve , reject)=>{ request.get(‘http://wufazhuce.com/‘).end((err,res)=>{ if(err) return console.log("数据请求失败"); //把返回值中的数据解析成HTML const $ = cheerio.load(res.text); //抓取One的图片 const img = $(‘.carousel-inner>.item>img, .carousel-inner>.item>a>img‘).eq(2).attr(‘src‘); //抓取One的文本 const text = $(‘.fp-one .fp-one-cita-wrapper .fp-one-cita a‘).eq(2).text(); const OneData = { img, text } resolve(OneData); }); }); } // getOneData(); //渲染邮件 async function renderTemplate(){ //获取日期数据 const dayData = await getDate(); //获取墨迹天气数据 const mojiData = await getMojiData(); //获取One数据 const oneData = await getOneData(); // console.log(dayData); // console.log(mojiDate); // console.log(oneData); return new Promise((resolve,reject)=>{ const html = template(path.join(__dirname,"./mail.html"),{ dayData, mojiData, oneData }); // console.log(html); resolve(html); }); } async function renderTemplate_2(){ //获取日期数据 const dayData = await getDate(); //获取墨迹天气数据 const mojiData = await getMojiData(); //获取One数据 const oneData = await getOneData_2(); // console.log(dayData); // console.log(mojiDate); // console.log(oneData); return new Promise((resolve,reject)=>{ const html = template(path.join(__dirname,"./mail.html"),{ dayData, mojiData, oneData }); // console.log(html); resolve(html); }); } // renderTemplate(); async function sendMail() { const html = await renderTemplate(); // console.log(html); let transporter = nodemailer.createTransport({ host: "smtp.163.com", port: 465, secure: true, // true for 465, false for other ports auth: { user: "**@**", // generated ethereal user pass: "***" // generated ethereal password } }); // send mail with defined transport object let mailOptions = { from: ‘"自己" <**@**>‘, // sender address to: "**@**", // list of receivers subject: "最好的自己", // Subject line html: html // html body }; transporter.sendMail(mailOptions,(error,info = {}) =>{ if(error){ console.log(error); sendMail(); } console.log("发送成功",info.messageId); console.log("等待下一次发送!"); }); } async function sendMail_2() { const html = await renderTemplate_2(); // console.log(html); let transporter = nodemailer.createTransport({ host: "smtp.163.com", port: 465, secure: true, // true for 465, false for other ports auth: { user: "**@**", // generated ethereal user pass: "***" // generated ethereal password } }); // send mail with defined transport object let mailOptions = { from: ‘"自己" <**@**>‘, // sender address to: "**@**", // list of receivers subject: "最好的自己", // Subject line html: html // html body }; transporter.sendMail(mailOptions,(error,info = {}) =>{ if(error){ console.log(error); sendMail(); } console.log("发送成功",info.messageId); console.log("等待下一次发送!"); }); } // sendMail_2(); var j = schedule.scheduleJob(‘00 45 21 * * *‘, function(){ sendMail(); console.log(‘定时任务执行完毕!‘); }); var j_2 = schedule.scheduleJob(‘00 35 22 * * *‘, function(){ sendMail_2(); console.log(‘定时任务执行完毕!‘); });
下面是页面的样式:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> </head> <body> <div style="border: 0px solid red; width: 100%; margin: 40px auto; color: gray; text-align: center; font-size: 20px;" align="center"> <span>我们已经生活了</span> <span style="font-size: 24px; color: red;">{{dayData.count}}</span> <span>天</span> </div> <div style="border: 0px solid red; width: 100%; margin: 0 auto; color: gray; text-align: center;"> <img src="{{mojiData.icon}}" style="background: royalblue;" alt="天气图标" > <b style="display: block; color: black; font-size: 24px; margin: 15px 0;"> 天气:{{mojiData.weather}} </b> <span style="display: block; color: black; font-size: 22px; margin: 15px 0;"> 温度:{{mojiData.wendu}} </span> <span style="display: block; color: lightgray; font-size: 20px;"> 提示:{{mojiData.tips}} </span> </div> <div style="text-align: center;margin: 35px 0;"> <span style="display: block; margin-top: 55px;color: gray; font-size: 15px;"> ONE 一个 </span> <span style="display: block; margin-top: 25px;color: lightgray; font-size: 22px;"> {{dayData.format}} </span> <img src="{{oneData.img}}" style="margin-top:10px; width: 100%;" alt="One配图" > <div style="margin: 10px auto; width: 85%; color: gray;"> {{oneData.text}} </div> </div> </body> </html>
每天都要照顾好自己。
原文:https://www.cnblogs.com/wuren-best/p/11782552.html