欢迎访问 生活随笔!

凯发ag旗舰厅登录网址下载

当前位置: 凯发ag旗舰厅登录网址下载 > 编程语言 > >内容正文

asp.net

基于 abp vnext 和 .net core 开发博客项目 -凯发ag旗舰厅登录网址下载

发布时间:2025/1/21 17 豆豆
凯发ag旗舰厅登录网址下载 收集整理的这篇文章主要介绍了 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

基于 abp vnext 和 .net core 开发博客项目 - 定时任务最佳实战(三)
转载于:https://github.com/meowv/blog

本篇继续围绕抓取完成后的操作做一个提醒。当每次抓取完数据后,自动发送邮件进行提醒。

在开始正题之前还是先玩一玩之前的说到却没有用到的一个库puppeteersharp。

puppeteersharp:headless chrome .net api ,它运用最多的应该是自动化测试和抓取异步加载的网页数据,更多介绍可以看github:https://github.com/hardkoded/puppeteer-sharp 。

我这里主要来试试它的异步抓取功能,同时它还能帮我们生成网页截图或者pdf。

如果没有安装可以先安装一下,在.backgroundjobs层安装puppeteersharp:install-package puppeteersharp

在jobs文件夹下新建一个puppeteertestjob.cs,继承ibackgroundjob,同样是在executeasync()方法中执行操作。

//puppeteertestjob.cs
using system;
using system.threading.tasks;

namespace meowv.blog.backgroundjobs.jobs.puppeteertest
{
public class puppeteertestjob : ibackgroundjob
{
public async task executeasync()
{
throw new notimplementedexception();
}
}
}
使用 await new browserfetcher().downloadasync(browserfetcher.defaultrevision); 第一次检测到没有浏览器文件会默认帮我们下载 chromium 浏览器。

downloadasync(…)可以指定 chromium 版本,browserfetcher.defaultrevision 下载当前默认最稳定的版本。

然后配置浏览器启动的方式。

using var browser = await puppeteer.launchasync(new launchoptions
{
headless = true,
args = new string[] { “–no-sandbox” }
});
感兴趣的可以自己看看launchoptions有哪些参数,我这里指定了headless = true 以无头模式运行浏览器,然后加了一个启动参数 “–no-sandbox”。针对linux环境下,如果是运行在 root 权限下,在启动 puppeteer 时要添加 “–no-sandbox” 参数,否则 chromium 会启动失败。

我们打开一个异步加载的网页,然后获取到页面加载完后的html,以我个人博客中的某个单页为例:https://meowv.com/wallpaper 。

//puppeteertestjob.cs
using puppeteersharp;
using system.threading.tasks;

namespace meowv.blog.backgroundjobs.jobs.puppeteertest
{
public class puppeteertestjob : ibackgroundjob
{
public async task executeasync()
{
await new browserfetcher().downloadasync(browserfetcher.defaultrevision);

using var browser = await puppeteer.launchasync(new launchoptions{headless = true,args = new string[] { "--no-sandbox" }});using var page = await browser.newpageasync();await page.setviewportasync(new viewportoptions{width = 1920,height = 1080});var url = "https://meowv.com/wallpaper";await page.gotoasync(url, waituntilnavigation.networkidle0);var content = await page.getcontentasync();} }

}
page.setviewportasync()设置网页预览大小,page.gotoasync()语法打开网页,waituntilnavigation.networkidle0等待网页加载完毕,使用page.getcontentasync()获取到html。

新建扩展方法,调用这个puppeteertestjob的executeasync()方法,调试看看效果。

图片

html已经出来了,此时该干嘛就干嘛就可以了。

第一次运行可能会很慢,因为如果你本地不存在 chromium 是会去帮我们下载的,因为网络原因可能会下载的很慢,所以推荐大家手动下载。

可以使用淘宝的源:https://npm.taobao.org/mirrors/chromium-browser-snapshots 。

要注意的是,下载完成后的解压的路径不能出错,默认下载地址是在启动目录下面。

windows:…local-chromium\win64-706915\chrome-win 、 linux:…/.local-chromium/linux-706915/chrome-linux

接下来试试生成pdf和保存图片功能,使用方式也很简单。

await page.pdfasync(“meowv.pdf”,new pdfoptions { });
await page.screenshotasync(“meowv.png”, new screenshotoptions
{
fullpage = true,
type = screenshottype.png
});
这里只做简单的展示,page.pdfasync()直接生成pdf文件,同时还有很多方法可以自己调用page.试试,pdfoptions选项中可以设置各种参数。

page.screenshotasync()保存图片,screenshotoptions中fullpage可以设置保存图片为全屏模式,图片格式为png类型。

图片

可以看到项目根目录已经生成了图片和pdf,感觉去试试吧。

接下里来实现发送邮件的功能。

我这里发邮件的账号是用的腾讯企业邮箱,也可以用普通邮箱开通smtp服务即可。

在appsettings.json配置收发邮件的账号等信息。

//appsettings.json
“email”: {
“host”: “smtp.exmail.qq.com”,
“port”: 465,
“usessl”: true,
“from”: {
“username”: “123@meowv.com”,
“password”: “[password]”,
“name”: “meowv.com”,
“address”: “123@meowv.com”
},
“to”: [
{
“name”: “test1”,
“address”: “test1@meowv.com”
},
{
“name”: “test2”,
“address”: “test2@meowv.com”
}
]
}
然后再appsettings中读取配置的项。

//appsettings.cs
public static class email
{
///
/// host
///
public static string host => _config[“email:host”];

/// /// port /// public static int port => convert.toint32(_config["email:port"]);/// /// usessl /// public static bool usessl => convert.toboolean(_config["email:usessl"]);/// /// from /// public static class from {/// /// username/// public static string username => _config["email:from:username"];/// /// password/// public static string password => _config["email:from:password"];/// /// name/// public static string name => _config["email:from:name"];/// /// address/// public static string address => _config["email:from:address"]; }/// /// to /// public static idictionary to {get{var dic = new dictionary();var emails = _config.getsection("email:to");foreach (iconfigurationsection section in emails.getchildren()){var name = section["name"];var address = section["address"];dic.add(name, address);}return dic;} }

}
分别介绍下每项的含义:

host:发送邮件服务器地址。

port:服务器地址端口号。

usessl:是否使用ssl方式。

from:发件人的账号密码,名称及邮箱地址,一般邮箱地址和账号是相同的。

to:收件人邮箱列表,也包含名称和邮箱地址。

收件人邮箱列表我将其读取为idictionary了,key是名称,value是邮箱地址。

接着在.toolkits层添加一个emailhelper.cs,收发邮件我选择了mailkit和mailkit两个库,没有安装的先安装一下,install-package mailkit、install-package mimekit。

直接新建一个发送邮件的方法sendasync(),按照要求将基本的配置信息填进去,然后直接调用即可。

//emailhelper.cs
using mailkit.net.smtp;
using meowv.blog.domain.configurations;
using mimekit;
using system.linq;
using system.threading.tasks;

namespace meowv.blog.toolkits.helper
{
public static class emailhelper
{
///
/// 发送email
///
///
///
public static async task sendasync(mimemessage message)
{
if (!message.from.any())
{
message.from.add(new mailboxaddress(appsettings.email.from.name, appsettings.email.from.address));
}
if (!message.to.any())
{
var address = appsettings.email.to.select(x => new mailboxaddress(x.key, x.value));
message.to.addrange(address);
}

using var client = new smtpclient{servercertificatevalidationcallback = (s, c, h, e) => true};client.authenticationmechanisms.remove("xoauth2");await client.connectasync(appsettings.email.host, appsettings.email.port, appsettings.email.usessl);await client.authenticateasync(appsettings.email.from.username, appsettings.email.from.password);await client.sendasync(message);await client.disconnectasync(true);} }

}
sendasync(…)接收一个参数mimemessage对象,这样就完成了一个通用的发邮件方法,接着我们去需要发邮件的地方构造mimemessage,调用sendasync()。

//wallpaperjob.cs

// 发送email
var message = new mimemessage
{
subject = “【定时任务】壁纸数据抓取任务推送”,
body = new bodybuilder
{
htmlbody = $“本次抓取到{wallpapers.count()}条数据,时间:{datetime.now:yyyy-mm-dd hh:mm:ss}”
}.tomessagebody()
};
await emailhelper.sendasync(message);

//hotnewsjob.cs

// 发送email
var message = new mimemessage
{
subject = “【定时任务】每日热点数据抓取任务推送”,
body = new bodybuilder
{
htmlbody = $“本次抓取到{hotnews.count()}条数据,时间:{datetime.now:yyyy-mm-dd hh:mm:ss}”
}.tomessagebody()
};
await emailhelper.sendasync(message);

分别在两个爬虫脚本中添加发送email,mimemessage中设置了邮件主题subject,正文body,最后调用await emailhelper.sendasync(message)执行发送邮件操作。

编译运行执行两个定时任务,看看能否收到邮件提醒。

图片

成功了,邮箱收到了两条提醒。

还有一种比较特殊的用法,也介绍一下,如果想要发送带图片的邮件怎么操作呢?注意不是附件,是将图片内嵌在邮箱中。

一般常规都是有邮件模板的,将图片的具体地址插入到img标签中,这就不说了,这里选择另外一种方式。以前面添加的puppeteertestjob为例,正好我们生成了一张图片的。将这种图片以邮件的形式发出去。

public class puppeteertestjob : ibackgroundjob
{
public async task executeasync()
{
var path = path.combine(path.gettemppath(), “meowv.png”);

...await page.screenshotasync(path, new screenshotoptions{fullpage = true,type = screenshottype.png});// 发送带图片的emailvar builder = new bodybuilder();var image = builder.linkedresources.add(path);image.contentid = mimeutils.generatemessageid();builder.htmlbody = "当前时间:{0}.".formatwith(datetime.now.tostring("yyyy-mm-dd hh:mm:ss"), image.contentid);var message = new mimemessage{subject = "【定时任务】每日热点数据抓取任务推送",body = builder.tomessagebody()};await emailhelper.sendasync(message); }

}
先确定我们生成图片的路径 path ,将图片生成message-id,然后赋值给contentid,给模板中图片标签cid赋上值在调用发送邮件方法即可。

图片

成功收到邮件,搞定了,你学会了吗?😁😁😁

开源地址:https://github.com/meowv/blog/tree/blog_tutorial

基于 abp vnext 和 .net core 开发博客项目,截止到本篇所用到的基础模块算是写完了,如果对您有些许帮助请多多分享,我的所有原创文章都首发于我发个人公众号:阿星plus 。

不管因为什么,如果你在学习这个项目或者跟着我一起做这个项目,里面肯定还是有瑕疵的,大家可以根据自己的需求自行修改。

接下来应该还会更新博客所用到的接口,这个纯属于crud,可

总结

以上是凯发ag旗舰厅登录网址下载为你收集整理的的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得凯发ag旗舰厅登录网址下载网站内容还不错,欢迎将凯发ag旗舰厅登录网址下载推荐给好友。

网站地图