无头浏览器 PuppeteerSharp

2023年9月3日 没有评论

在研究无头浏览器的时候,发现了一些不错的工具,例如 phantomjs 就可以让你以前端 js 脚本的方式来操作页面,以满足一些自动化测试方面的需求。后来又发现了 puppeteer,有很多开发语言的实现。

而今天提及的 PuppeteerSharp 就是 .Net 的实现。可能我执念太深,总觉得 Net 是相当不错的选择。

PuppeteerSharp 是一个控制无头Chrome 浏览器的库,它允许开发者通过编程方式模拟浏览器行为,执行网页操作,截取网页截图,获取网页内容,可以把网页转换成PDF等等。

截图

using var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(
new LaunchOptions { Headless = true });
await using var page = await browser.NewPageAsync();
await page.GoToAsync("http://www.google.com");
await page.ScreenshotAsync(outputFile);

也支持设置页面的尺寸

await Page.SetViewportAsync(new ViewPortOptions
{
Width = 500,
Height = 500
});

生成 pdf 文件

using var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions {Headless = true});
await using var page = await browser.NewPageAsync();
await page.GoToAsync("http://www.google.com"); // In case of fonts being loaded from a CDN, use WaitUntilNavigation.Networkidle0 as a second param.
await page.EvaluateExpressionHandleAsync("document.fonts.ready"); // Wait for fonts to be loaded. Omitting this might result in no text rendered in pdf.
await page.PdfAsync(outputFile);

动态注入 html 元素

await using var page = await browser.NewPageAsync();
await page.SetContentAsync("My Receipt");
var result = await page.GetContentAsync();

执行脚本

await using var page = await browser.NewPageAsync();
var seven = await page.EvaluateExpressionAsync("4 + 3");
var someObject = await page.EvaluateFunctionAsync("(value) => ({a: value})", 5);
Console.WriteLine(someObject.a);

等待某个选择器

using (var page = await browser.NewPageAsync())
{
await page.GoToAsync("https://www.baidu.com");
await page.WaitForSelectorAsync("div.main-content")
await page.PdfAsync(outputFile));
}

等待函数的执行

using (var page = await browser.NewPageAsync())
{
await page.GoToAsync("https://www.baidu.com");
var watchDog = page.WaitForFunctionAsync("()=> window.innerWidth < 100");
await page.SetViewportAsync(new ViewPortOptions { Width = 50, Height = 50 });
await watchDog;
}


分类: C#, 日常 标签:

如何在树莓派搭建DLNA流媒体服务器

2023年8月15日 没有评论

以前收集了一波音乐放在了我的香蕉派里,现在偶尔想起来的时候想在电脑上播放,搜索了下,最终实现如下:

sudo apt-get install minidlna

安装完成后,可以对 minidlna 来进行配置

打开配置文件

sudo vim /etc/minidlna.conf
#可参考修改的项有:
#媒体文件目录:

media_dir=A,/example/audio #音频目录
media_dir=P,/example/picture #图片目录
media_dir=V,/example/video #视频目录
#如果不在意这些,media_dir=/home/pi/Desktop/example即可
#请用chmod给予文件夹权限,例如
chmod 777 /home/pi/Desktop/example

#服务器IP
listening_ip=192.168.1.105
#端口
port=8200
#IP和端口不改也可以,存在默认设置
#网络名称,用于其它设备发现当前设备,存在默认设置
friendly_name=DLNA
#其他的进阶内容可以进入conf查看注释

接下来启动minidlna服务

sudo service minidlna start

如果修改配置文件及媒体资源更新,需要强制刷新时,可以执行下面的命令

sudo service minidlna force-reload

下一步你可以通过支持dlna的设备来进行观看了,安装好了后就可以使用电脑上的软件例如windows media player 了。

在安装的过程中,有参考这里,和这里,还有这里,多谢先行者。

分类: Banana Pi, 日常 标签:

SharpShell

2023年7月29日 没有评论

最近在搜索使用C#来实现文件扩展模块,即右键属性对话框里的设置,这个基本上是 com 实现的,当然就是支持 C++,这个东西对我来说过于复杂了,全网搜索了下,最后发现了一个项目满足自己的需求,这里推荐给大家,希望大家喜欢。

https://github.com/dwmkerr/sharpshell#property-sheet-extensions

分类: 一句话, 工具 标签:

Angular http://127.0.0.1:4200 本地无法访问

2023年6月29日 没有评论

今天有收到一个问题,描述是 Angular 项目本地可以通过 http://localhost:4200 访问,但是 http://127.0.0.1:4200 却无法访问。开始以为是 DNS 解析的问题,清理了 host 文件后并更新缓存,问题还是存在。

后来经过搜索,用 ng serve –host 0.0.0.0 –disable-host-check 启动 Angular,问题解决。应该是升级到新版本后,基于安全策略给禁止了。

分类: 一句话, 日常 标签:

PowerShell 操作注册表

2023年5月6日 没有评论

最近是有一个需求而不得不使用 PowerShell 来操作注册表,搜索了一下,有提供常规的命令方式,也有使用 .net framework 的实现,最后看到一个比较简单的方式,像使用文件系统的文件夹一样,比较适合我这样的懒人。

即我们可以以 PSDrive 的形式来访问注册表。

首先,输入 Get-PSDrive 命令可以获取当前提供的 PSDrive,感觉好厉害的样子。

我们可以像文件夹一样,一级级地进入,当然根目录别忘记了分号,例如 cd hklm: 。到达我们指定的路径后,就可以使用 New-Item 和 Set-ItemProperty 命令来新增项和键值了。

Set-ItemProperty .\FileLogger -name AllLogs -value Trace

意思就是说,为 FileLogger 这个项,创建一个键,名称为 AllLogs,值是 Trace。

够简单,够直接。

分类: 一句话, 日常 标签:

Windows 快速切换到 S Mode

2023年4月10日 没有评论

我们在网上经常可以看到如何退出 S Mode,但是对于开发团队来说,想要调试 S Mode 下的问题,就比较麻烦了。

在过去,只能是通过重装系统的方式,这样不是最优解。

无意间,让我发现了一个非正式的做法,供大家把玩。由于微软官方并没有正式承诺,所以只用来快速验证 bug,可能微软将来某一个版本就发生了调整。

HKLM\System\CurrentControlSet\Control\CI\Policy,修改配置项 SkuPolicyRequired,从 0 改成 1 再重启。

重启后,系统会要求使用 Microsoft ID 来登录系统,大家记得去注册一个哈,不然是无法使用 S Mode 模式的。

分类: 日常 标签:

群晖 docker 容器 failed to initialize logging driver 解决办法

2023年3月14日 没有评论

最近发现 docker 里的一个应用无法启动,总是报告 “failed to initialize logging driver”提示,在网上搜索了一下,找到了解决方法。对于我的这个案例来说,就是由于 lock 文件导致的。

来,直接上步骤:

1、在 docker 里开启 22 端口,然后远程 ssh 连上去。
2、输入 sudo -i 切换到管理员权限
3、输入 docker ps -a 可以查询到所有的容器,这一步可以获取到容器的 ID
4、输入 docker inspect –format='{{.LogPath}}’ <容器ID>,可以获取到该容器的日志路径
5、cd 命令进入到该目录下,然后 ls 显示所有的文件
6、删除 log 文件,对于我的案例,删除 log.db 文件
7、输入 docker start <容器ID>

至此,该应用就启动起来了。

网上的说法是由于多个终端曾经操作容器,造成容器日志被锁。而容器的日志作为启动必须加载项,被锁造成启动失败。庆幸的是容器日志可被清空删除,删除后会重新创建。

因此移除异常的日志数据库,重启容器后恢复正常。

分类: 一句话, 日常 标签: , ,

permission denied (publickey) 的解决方法

2023年2月3日 没有评论

我的台式机,也不清楚是在系统升级后还是在卸载 SourceTree 后,再次使用 git 时,报告了 permission denied (publickey),一时之间也无法确认具体是发生了什么。

按照网上的说法,第一步是要生成新的 ssh key,由于我已经确认在目录下存在 id_rsa 和 id_rsa.pub 文件,所以这个问题肯定不是 ssh key 的问题。

我也检查了 pub 文件里的内容,和 bitbucket 里的是一样的,所以这个也可以排除。

有说要把 ssh key 添加到 keychain 里,输入命令 ssh-add “私钥的文件路径例如id_rsa”

发现还是不行,只好把 SourceTree安装回来,导入证书,并在选项里设置使用 OpenSSH,SourceTree 可以正常使用了。

重启系统后,发现 git 也可以使用了。所以,莫名其妙又好了。

分类: 一句话, 日常 标签:

谷歌浏览器组策略清理

2023年1月13日 没有评论

在 chrome 的帮助菜单里经常可以看到 您的浏览器由所属组织管理,不管是否真的受组织管理,这个就让人特别不舒服。

本文提供一些思路:
1、打开浏览器,输入 chrome://management, 回车即可检查到当前电脑上安装的所有相关扩展程序。
2、输入 chrome://policy,回车即可检查到当前电脑上的组策略情况。
3、直接打开注册表,进入到 HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\ExtensionInstallForcelist 路径,可以将里面的键值给删除咯。

既然不守规矩,那么大家都不要吃了,掀桌子。

分类: 一句话, 日常 标签: ,

疫情拼身体素质的时候到了

2022年12月8日 没有评论

要说这个月最重要的事情,莫过于刚发布不久的二十条,以及新十条。

从政策层面,取消了检查核酸有效期的限制,也不再执行落地检,核酸除了特定的场合外,也可以不做了。

万恶的弹窗3即将进入历史的垃圾桶。

下半场正式开始,大家开始拼身体的时候到了。

每个人,都要对自己的健康负责,这东西,能够晚一点触碰到就晚一点吧。

分类: 一句话 标签: