参考链接:
RSS 简介:https://www.runoob.com/rss/rss-intro.html
RSSHub:https://docs.rsshub.app/
Fluent Reader:https://github.com/yang991178/fluent-reader
FreshRSS:https://github.com/FreshRSS/FreshRSS
重新捡起 RSS:RSSHub + FreshRSS 建立我的信息流:https://blog.l3zc.com/2023/07/rsshub-freshrss-information-flow/
最近一段时间研究了下 RSS 的最佳实践,经过一番探究,得出了 RSSHub + Fluent Reader + FreshRSS 的最佳组合,现记录一下使用流程。
本文应该是全网最全面的 RSS 使用实践了,如果给你带来了一些收获,不甚荣幸。
或许,你在某些文章中会看到,文章作者对 RSS 夸的天花乱坠,似乎 RSS 就是无所不能,RSS 就是银弹。
但实质上,RSS 也就是种信息传播格式,未必适合每个人,RSS 不是万能的银弹。
来做个简单的小测验,这是RSSHub
的官网:https://docs.rsshub.app/
在搞明白你是否需要 RSS 之后,再接着往下看吧。
在开始使用 RSS 之前,先需要知道 RSS 是什么。
RSS,全称 Really Simple Syndication,即“简易信息聚合”,是一种 XML 的内容格式。
一个标准的 RSS 例子如下:
1 | <rss version="2.0"> |
这是个好问题,也是你在开始折腾 RSS 前需要搞清楚的事情。
以一言盖之,RSS 订阅的本质就是种信息获取渠道,与微信公众号、博客、微博等一样,都是让你来获取信息的。
只是,RSS 订阅 允许你自己来主动获取你想要的信息,而排除一切你不想要的信息。
在这个充满了大数据推送的时代,RSS 订阅是化被动为主动的信息获取方式,让你的信息接收完全被自己掌控!
BitTorrent 资源网站大多也提供 RSS 订阅,可以添加到 BT 下载软件中订阅,实现自动下载资源。
在知道了 RSS 有什么用之后,接下来就得找 RSS 订阅源了。
有些网站会自己提供 RSS 订阅源,例如 GitHub、少数派等,大部分自建的博客也会提供 RSS 订阅源,例如 阮一峰的网络日志、草梅友仁的博客等。
但对于大部分(国内的)网站来说,提供 RSS 订阅服务是没有必要的,所以基本上不提供 RSS 订阅服务。
在这里,就需要靠 RSSHub 来实现 RSS 订阅了。
RSSHub:https://docs.rsshub.app/
RSSHub 是一个开源、简单易用、易于扩展的 RSS 生成器,可以给任何奇奇怪怪的内容生成 RSS 订阅源。
以 B 站为例。
例如我希望订阅 bilibili 上一个名为 草梅友仁
的 up 主的动态。
根据 UP 主动态 的文档,路由为 /bilibili/user/dynamic/:uid/:routeParams?
。
把:uid
替换为 草梅友仁
的 uid: 10822025
,得到路径为 /bilibili/user/dynamic/10822025
再加上域名 https://rsshub.app
,于是就获得了一个订阅源:https://rsshub.app/bilibili/user/dynamic/10822025
基于相同的方法,你还可以得到以下 RSS 订阅源。
由于官方提供的域名仅供 demo,可用性不高,会因为反爬虫等原因失效,所以一般考虑自建来增强可用性(也增加了可自定义的部分),下面来讲一下这部分内容。
注意,近期 RSSHub 进行了大规模的改动,本文所讲述的部署方法和配置可能会过时,一切以官方文档为准!
在 RSSHub 的官方文档中,就已经对如何部署进行了详细描述:https://docs.rsshub.app/zh/install
我个人最推荐的是通过 Docker Compose 部署。
首先确保服务器上安装了 Docker 和 Docker Compose。
然后在合适的位置创建docker-compose.yml
文件,内容参考如下:
1 | version: '3.9' |
然后就可以使用以下命令启动了:
1 | docker-compose up -d |
然后可以通过访问 http://[服务器IP]:1200
来判断启动是否成功。(在此之前,记得开放服务器的 1200 端口)
如果是在本地部署的话则访问 http://127.0.0.1:1200
即可。
停止
1 | docker-compose down |
如何同步最新的 Docker 镜像?
可以考虑通过增加镜像 Tag 来指定具体的镜像版本,例如:diygod/rsshub:2024-02-22。
也可以考虑使用同步更新的 Docker 源,例如:https://dockerproxy.com 等
也许你还想过通过云函数(阿里云/腾讯云等)来调用,可以考虑将 RSSHub 作为 npm 包来使用,参考代码如下:
1 | const RSSHub = require('rsshub'); |
这种使用方法比较冷门,在更新上也有些不便。但如果你需要的话,这也是一种选择。
提示:你可以在安装完 RSS 阅读器后再来处理这个问题
在使用 RSS 阅读器的过程中,你可能会遇到图片加载不出来的问题,例如来自微博的图片就会因为跨域而被禁止加载。
此时就需要添加图片代理。
有关图片外链的解决方案可参考该文章:2023-10-14-免费图床之微博外链图片解决方案
这里以image.baidu.com
为例。
以 RSSHub 为例,参考图片处理一栏中的方法,可以在 docker-compose.yml
进行如下配置。
1 | environment: |
这样就可以正常加载了。
实际的图片地址会变成:
https://image.baidu.com/search/down?url=https%3A%2F%2Ftvax1.sinaimg.cn%2Flarge%2F008dLuZOgy1hn4knw0yq4j31c82141kx.jpg
,从而规避微博图片的跨域限制
在使用 RSSHub 的过程中,你可能会遇到一些需要自建并提供 Cookie 的路由,例如 用户关注动态。
查阅文档可了解相关配置。
不过这时往往也会遇到个问题,那就是 Cookie 失效问题。
B 站的 Cookie 每隔一段时间会自动刷新,此时就失效了。
下面以 B 站为例介绍两个方法
方法一:在浏览器无痕模式(隐身模式)下登录后获取相应的 Cookie。因为用户通过浏览器访问才会触发 Cookie 刷新,所以可以用该方法规避。
方法二:使用 CookieCloud 同步 Cookie。
受限于篇幅原因,此处就不再赘述如何部署 CookieCloud 了,主要来说下怎么用。
在浏览器端设置了要同步的域名后,就可以通过 CookieCloud 的接口来获取到 Cookie 了。
以下是一个简单的 python 脚本,会在根目录生成 .env
文件,此时就可以被 Docker 读取到环境变量,也就解决了 Cookie 问题 。
不过在实际使用中也会遇到 Cookie 更新了,但 RSSHub 这边没有同步更新 Cookie 的问题。
因为 RSSHub 只在启动的时候读取环境变量,所以需要定期重启以同步 Cookie 。
1 | import urllib |
注意,近期 RSSHub 进行了大规模的改动,该配置已过时,一切以官方文档为准!
如果你的 RSSHub 实例部署在公网上,那么你可能并不希望任何人都能访问你的 RSSHub 实例,尤其是你还配置了自己的 Cookie 的时候。
这时,你就需要用到 RSSHub 提供的 访问控制配置 功能来限制其他人访问了。
在这里,我推荐的是通过 DENYLIST
+ ACCESS_KEY
的模式来实现部分路由限制。
例如,我希望禁止其他人访问/bilibili/user/followers
,但除此以外的路由不限制,那么就可以做如下配置
1 | environment: |
在没有访问密钥 key
的情况下访问/bilibili/user/followers
,都会被拒绝;同时其他路由不受影响。
此时需要正常的访问的话就会变成:
/bilibili/user/followers?key=114514
在解决了 RSS 订阅源的问题之后,我们将面临下一个问题:如何阅读 RSS?
很显然的是,原始的 xml 格式的文本,并不适合人类阅读,所以需要一个阅读器来美化内容。
幸运的是,市面上已经有很多 RSS 阅读器了,在这里我推荐的是 Fluent Reader,一个开源的、美观的 RSS 阅读器(也支持中文)。
前往 releases 页面下载最新版本的安装包即可,按自己的操作系统来下载,Windows 用户下载 .exe
后缀的安装包。
在安装完成后,即可进入软件查看。
默认情况下,Fluent Reader 里面什么都没有,需要自己手动添加 RSS 订阅源。
点击右上角的设置按钮
然后输入一个 RSS 订阅源,例如:https://blog.cmyr.ltd/atom.xml
然后再回到主页面,就可以看到订阅的内容了。
基于同样的方式,可以将之前 RSSHub 的那些订阅源都添加进去。
手机端这里推荐的是同个作者的 Fluent Reader Lite。
同样前往 releases 页面下载最新版本的安装包即可。
如果想支持下作者的话也可以通过 Google Play 和 App Store 安装,需要支付 1.99 美元作为费用。
在进入软件后,默认也是没有任何 RSS 订阅源的,需要自己手动添加。
并且和电脑端不同的是,甚至没有给你一个手动添加订阅源的地方,因此,需要一个 RSS 订阅服务。
如果说 RSSHub 提供了 RSS 源的话,那么 FreshRSS 就是负责订阅这些 RSS 源的。
关于部署方式,推荐通过 Docker Compose 部署
1 | version: '3' |
然后就可以通过 8080 端口来访问了,建议改成自己喜欢的端口。
进去之后的第一步就是选择语言了,这里选择简体中文即可。
步骤二是检查环境,通过 Docker Compose 部署的一般不存在环境问题,直接点击下一步即可。
第三步是数据库配置,选默认的 SQLite 即可,如有需要可以选其他数据库。
第四步就是配置管理员账号了,自己配置即可。
然后就大功告成了!
之后就会跳转到登录页面,登录即可。
在首页里,默认只有 FreshRSS releases
这一个订阅源,可以考虑删除。
之后就可以自己添加 RSS 订阅源了!
点击右上角进入配置页面
在认证
页面中启用允许 API 访问 (用于手机应用)
然后再回到账户
页面,设置API 密码
然后就可以点击下方的http://localhost:40201/api/
来检测 API 状态,两个都为 PASS
即为成功。
在这里要说明下为什么不配置Fever compatible API
,原因是经过实测,Fluent Reader 和 Fluent Reader Lite 都无法正常配置Fever compatible API
(虽然提供了相关的配置项),所以这里就选择经过实测可行的 Google Reader compatible API
。
在 Google Reader API
中,端点就设置为上文中的http://localhost:40201/api/greader.php
,注意,域名(或 IP)和端口需要根据你自己的配置改动。
用户名则是你的账号名称。
密码是API 密码,不是账号的密码!!
同步数量自行选择。
随后可以在 分组与排序
中导入分组,这样就可以和服务端同步订阅源与分组(默认情况下分组不会同步)
至此就完成了桌面端的配置
手机端也是类似的配置,此处不再赘述。
你可能偶尔会遇到像 少数派 这样的 RSS 订阅源,只提供了一个简介,而没有正文,这时你就需要抓取全文
功能。
有两种解决方案。
在 Fluent Reader 和 Fluent Reader Lite 中都提供了抓取全文。
临时切换,可在右上角点击按钮切换。
永久配置,在打开方式中配置。
手机端配置
FreshRSS 中当然也提供了抓取全文
功能,只是要自己配置一下。
在 原文的 CSS 选择器
一项中填入 body
或 p
,即可抓取全文。点击左边的小眼睛预览下结果即可,选择效果更好的那个选择器。
经过测试,单独一个
p
选择器会把图片给排除了,因此建议写成img,p,h1,h2,h3,h4,h5,h6
。仅针对少数派的话,可以写成
.article-body p, .article-body img, .article-body h1, .article-body h2, .article-body h3, .article-body h4, .article-body h5, .article-body h6
然后点击最下方的重载文章
,即可看到抓取后的全文。
实际上,FreshRSS 本身,也是可以被订阅的!
在首页和分组中,都可以点击右上角的 RSS 按钮来订阅。
点进去之后就会发现是一个在 FreshRSS 中聚合的 RSS 订阅源。
对于一些没有提供 FreshRSS 订阅支持的 RSS 阅读器,可以采用这种方法来曲线救国。
注意:要先在账号管理中设置认证口令。
至此,我们就实现了 RSS 从订阅源、到同步、到阅读的全流程,尽情的体验 RSS 带来的全新信息流吧!
好像还有一个问题,那就是我要怎么知道一个网站是否提供了 RSS 呢?或者说,我要怎么知道 RSSHub 是否提供了某个网站的 RSS 呢?
答案是通过 RSSHub Radar。
通过在设置中配置 自定义 RSSHub 域名
和 一键订阅
,就可以实现这样的效果,这样一来,订阅 RSS 就方便很多了。
对于支持 BitTorrent/磁力链接
的 RSS 订阅源,只要使用支持 BitTorrent/磁力订阅源的 BitTorrent 客户端即可,例如 qBittorrent 等。
建议使用迅雷以外的任何主流的开源 BitTorrent 客户端,反吸血人人有责。
TODO
实际上,在目前的 RSS 相关应用中,还缺少一类应用,那就是 RSS 推送,即把更新的 RSS 消息推送到某个消息渠道,例如微信、钉钉、邮件等。
虽然已经有 rsspush 在前了,但该软件和 Server 酱 强绑定,也没有和
FreshRSS
等 RSS 订阅服务联动。虽然能用,但没有达到笔者理想中的程度。
如果对 RSS 推送有需求的,可以尝试一下 rsspush。
使用 RSS 是件麻烦事,只有少数愿意折腾的人才会去干这件事。
如果你也愿意为之折腾,那就说明你也有颗不安分的心。
愿你在这充满大数据推送的时代,能有受自己掌控自己的信息流。
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/499d4cee.html
版权声明:转载请注明出处!
参考链接:
Gradle:https://gradle.org
spring-boot-template:https://github.com/CaoMeiYouRen/spring-boot-template
spring-boot-v3-template:https://github.com/CaoMeiYouRen/spring-boot-v3-template
前段时间尝试在 Docker 里构建 Maven 项目的时候,发现 Maven 项目构建的特别慢,在 Gitee Go 流水线上的构建时间长达 7 分钟!这我就忍不了了,实在太慢了!
所以我就决定将项目从 Maven 迁移到 Gradle,然后发现迁移过程比想象的简单很多,只需要进行文件的配置即可。
第一步首先就是安装 Gradle 了。
运行 Gradle 需要 Java8 或以上环境。
1 | java -version |
然后从官网下载压缩包,选择 binary-only 即可。【下载速度慢的话也可以自行寻找 Gradle 镜像。】
然后解压到任意目录,并将 bin 目录添加到环境变量的 PATH 中。
接下来测试 Gradle 是否安装成功。
1 | gradle -v |
有出现版本信息即为安装成功!
默认情况下,Gradle 会从外国的镜像源下载依赖,受限于网络问题,下载速度可能较慢,因此需要配置国内的镜像。
在 Gradle 根目录下的init.d
文件夹中新建文件init.gradle
,里面内容如下。
1 | allprojects { |
然后就可以测试下镜像源是否生效了。
然后就可以把项目从 Maven 迁移到 Gradle 了!
在项目根目录下新建文件build.gradle
,里面内容如下。【以 Java8、Spring Boot2.7 为例,Java17、Spring Boot3.0 可参考spring-boot-v3-template】
1 | plugins { |
随后就可以在 IDEA 中使用 Gradle 了!
下面列一下 Gradle 中如何构建 jar 包。
1 | gradle clean build |
执行测试
1 | gradle test |
剩下的更多功能就等待读者朋友们自行探索了。
在迁移到了 Gradle 后,在 Gitee Go 流水线上的构建时间就缩短到了 4 分钟!减少了快一半了!可见 Gradle 在性能上确实比 Maven 好很多!
在之前看到过一篇文章,《为什么 Spring Boot 2.3.0 放弃 Maven 最终拥抱 Gradle》 中就提到过,
Spring Boot 团队考虑由 Maven 切换到 Gradle 的主要原因为了减少构建项目所需的时间。
这也是笔者迁移到 Gradle 的最大理由。
如果你也觉得 Maven 的构建速度有点慢的话,那就也尝试下迁移到 Gradle 吧!不过仅建议个人项目进行迁移,公司项目就还是要看项目组的意见,给公司节约时间没什么必要~
文章介绍了如何将项目从 Maven 迁移到 Gradle。它首先介绍了如何安装 Gradle 并设置镜像以加速依赖下载,然后显示了如何使用 Gradle 创建一个基本项目,包括生成 jar 文件和运行测试。最后,文章对比了 Maven 和 Gradle 的优缺点,并推荐了使用 Gradle 的原因。文章清晰易懂,配图丰富,对于想要使用 Gradle 的开发者非常有帮助。
总结:
【总结由 Chat LangChain 生成】
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/3d1e83f3.html
版权声明:转载请注明出处!
以前折腾过一段时间的 Docker Desktop,发现要使用 Docker Desktop 话就需要启用 Hyper-V,但是很多 Android 模拟器又会要求禁用 Hyper-V,对于要同时使用 Android 模拟器与 Docker Desktop 的笔者来说,两者无法兼得是一件头疼的事情。
但好在,有越来越多的 Android 模拟器厂家注意到了这个问题,因此本文便来说明一下如何解决这个问题。
如果你只是想看结果的话,那么请安装 逍遥模拟器
、蓝叠模拟器
、MuMu模拟器12
、雷电模拟器
中的一个即可,其中主要推荐逍遥模拟器
(据说性能较好)和MuMu模拟器12
(经过实测)。
在此要特别注意的是MuMu模拟器
一定要安装 12 版本的,不要安装成 6 版本的,旧版本的MuMu模拟器
还不支持启用 Hyper-V。
通过查找资料可知:
Hyper-V 是由 Microsoft 开发的一种虚拟化技术,它允许在一台物理计算机上运行多个虚拟机。Hyper-V 是 Windows Server 操作系统的一部分,并且也可以作为独立的 Hyper-V Server 版本使用。它提供了强大的虚拟化功能,包括硬件虚拟化、内存管理、网络虚拟化和存储虚拟化等。Hyper-V 可以帮助企业节省硬件成本、提高服务器利用率,并简化 IT 管理。它广泛应用于服务器虚拟化、开发和测试环境、云计算和容器化等场景中
但是,在 Android 模拟器的场景下,由于种种原因,往往需要禁用 Hyper-V,例如:
但是,Docker Desktop 又需要启用 Hyper-V
所以这当中就存在一个矛盾,这 Hyper-V,是开还是不开呢?
在此之前,先看下如何启用和禁用 Hyper-V
1.打开控制面板,找到程序
一栏
2.点击启用或关闭Windows功能
3.然后就可以看到 Hyper-V 相关的配置了,勾选或取消勾选即可启用或关闭。这里我们选择勾选。之后会提示你重启计算机,可以稍后再重启。
可以安装 逍遥模拟器
、蓝叠模拟器
、MuMu模拟器12
、雷电模拟器
中的任何一个,其中主要推荐逍遥模拟器
(据说性能较好)和MuMu模拟器12
(经过实测),下文将以MuMu模拟器12
为例。
前往MuMu模拟器12
官网下载:https://mumu.163.com/
安装完成之后直接点击运行即可,如果可以顺利进入主界面,则为成功(注意,要在启用 Hyper-V 后测试才有意义)
MuMu模拟器12
无需特别设置即可在启用 Hyper-V 的情况下正常运行,如果运行失败的话可以尝试用管理员权限运行。
在启用 Hyper-V 的情况下,MuMu模拟器12
的载入和运行会有些慢,论性能是比禁用 Hyper-V 的情况下是要差的,对性能有要求的可以考虑使用逍遥模拟器
。
到此为止解决了模拟器的问题,接下来解决 Docker Desktop 的问题。
前往官网下载即可:Install Docker Desktop on Windows
然后一路安装即可。
如果可以顺利进入主界面且不闪退,即为安装成功。
然后在命令行中执行以下命令
1 | docker version |
如果有类似以下输出的内容,则为安装成功。
然后再执行
1 | docker run hello-world |
如果能看到Hello from Docker!
,则为成功。
以上,便完成了 Docker Desktop 的安装
本文介绍了如何解决 Android 模拟器与 Docker Desktop 之间关于 Hyper-V 的冲突。文章首先介绍了问题的背景和痛点,即 Android 模拟器要求禁用 Hyper-V,而 Docker Desktop 需要启用 Hyper-V。然后,文章提供了解决方案:
总结来说,通过选择合适的 Android 模拟器和正确配置 Hyper-V 和 Docker Desktop,可以解决 Android 模拟器与 Docker Desktop 之间的冲突。
【总结由 Chat LangChain 生成】
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/3d4783a0.html
版权声明:转载请注明出处!
参考链接:
最近突然收到 Tinyletter 发的邮件,说是 Tinyletter 将在 2024 年 2 月 29 日后关闭,这可让我虎躯一震,毕竟前不久(去年)才刚写过一篇博客来推荐 Tinyletter 呢!(详见:2023-09-24 如何通过 Tinyletter 订阅 RSS)
于是就问了下万能的 ChatGPT,有没有开源的邮件订阅系统(Newsletter),毕竟我可不想第二次迁移了。
ChatGPT 也是不负众望,给我推荐了几个开源的邮件订阅系统。
经过一番调研,感觉phplist还是蛮不错的,既有开源版本,也可以直接使用他们部署的版本,故特此记录。
废话不多说,先注册个账号再说,前往官网注册即可。
第一步是叫你取个名字,这个名字会用来当子域名,随便取即可,自己记得住就行了。
第二步就是填邮箱和密码了,和 Tinyletter 一样,还是推荐用国外的邮箱,比如谷歌邮箱。但国内的邮箱应该也是可以用的,只要不被误认为垃圾邮件就好了。
第三步这里就不截图了,主要是补充信息,可以不填。
完成之后就可以点击确定了,之后在邮箱里点下确认邮件,然后再等待一小会儿,就可以进入你的主页了。
【PS:这里如果你仔细观察的话,就可以注意到当前域名是之前取的名称+hosted.phplist.com
,例如xxxx.hosted.phplist.com
】
主页默认进来是全英文的,虽然有中文选项,但翻译烂的一批,还不如英文版看的舒服。
如果真的像我一样是个英语苦手的话,可以借助翻译工具使用,反正只需要知道各个页面是干什么用的就行了。
到了这里,各位读者最关心的就是 phplist 要怎么实现订阅页面(就像下面的 Tinyletter 这样),下面就来说明这个问题
phplist 有关的内容位于 My account
下面的AJAX Integration
,参考上面的内容即可做出差不多的效果。
第一步是创建一个订阅页面,在subscribe
页面操作即可。
然后就是记下 id,我这里是 1。
1 | <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js"></script> |
然后就可以看到订阅按钮了。
怎么说呢,没加样式的情况下确实简单的有些过分了。
话说如此,你就说不能不用吧!
点开之后就可以开看到订阅页面,呃,怎么说呢,虽然相较于 Tinyletter 确实丑了点,但也不是不能用,现阶段还是能用就行了,美化的事之后再考虑。
到此为止,就已经初步实现了邮件订阅功能,如果只是能用就行的话,可以到此结束了
不过,作为一个多年老前端,对于如此丑陋的前端页面是无法容忍的,所以需要狠狠的美化一下!把以前的代码拿过来抄一下!
美化的部分主要是两个,一个是邮件订阅按钮,毕竟长得那么丑,读者看了就不想订阅了;另一个是邮件订阅页面,长得太丑也很劝退读者!
1 |
|
样式上还是采用了原来的方案,如果要自己用的话请修改 action
字段中的链接!
可以前往本文底部查看效果。
该部分暂时还未美化,但填充了一点内容。
本文介绍了如何迁移邮件订阅系统(Newsletter)到 phplist。博客首先提到了 Tinyletter 将在 2024 年 2 月 29 日关闭的消息,引发了作者的关注。作者经过调研后选择了 phplist 作为替代方案,并详细介绍了 phplist 的注册流程和主页界面。博客还提供了如何创建订阅页面的步骤,并附上了相应的代码。最后,博客指出虽然 phplist 的界面相对较简单,但可以通过美化订阅按钮和邮件订阅页面来改善用户体验。整体而言,该博客提供了一个详细的指南,帮助读者了解如何迁移 Newsletter 到 phplist,并提供了一些美化的建议。
【由 Chat LangChain 生成】
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/92ad8b7d.html
版权声明:转载请注明出处!
转眼间 2023 就要过去了,也是时候统计一下今年写了多少代码了。
以下是今年的情况:
没想到今年写的代码还挺多的,去年的数据是 68000+行代码,比去年多了 7000 行!
项目数量上也从去年的 67 个上升到今年的 73 个!
不过仔细看看的话,还是多少有点水分的,毕竟有几个常年维护的项目是固定刷存在感的,所以实际的代码增减量并不准确,还得看 git 上的统计。
但在 git 上看也有个问题,本人是很喜欢到处 fork 项目的,也经常在码云上备份来自 GitHub 的项目,所以这方面的统计也成了个问题,还是看看本地统计的数据吧。
博客方面,今年则是写了 39 篇(不含本篇),感觉还不错吧,总比前几年摸鱼的时候多了,今年也开始全平台更新了,在掘金、知乎、简书、公众号都有同步更新,虽然还是没什么人看吧。
今年的话整体而言是比较摸鱼的了,维护了一段时间的 timing-push,后来 6-8 月份又跑去写小说了,搁置了一段时间的代码,年末则是研究了下 koishi,还是有点意思的。
明年的话,希望写点有趣的项目吧。另外,更重要的是,多少要注意下副业了啊!开源才是硬道理!
附上去年的统计情况:
去年的统计博客:2022-12-31 草梅友仁的 2022 年度项目总结
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/4a5799d3.html
版权声明:转载请注明出处!
废话少说,直接上解决方案
1 | go env -w GO111MODULE=on |
是的没错,就是换一个镜像源。
在之前的配置是https://mirrors.aliyun.com/goproxy/,direct
,一直因为找不到依赖而报错,具体报错如下。
1 | + go build main.go |
可以看到一直报not a valid zip file
这个错误。
但我在本地又是可以成功的。
结果排查了半天,是镜像配置不一样!
修改镜像配置后解决问题。
我个人猜测,问题出现的原因是阿里云这边的 Golang 镜像缺少一些包,所以下载依赖失败了。
没想到居然被这么简单的问题折腾了半天!我感觉还是要怪坑爹的阿里云!
在构建 Golang 项目时,遇到了因镜像源配置问题导致构建失败的情况。原本使用的镜像源是https://mirrors.aliyun.com/goproxy/,direct
,但一直报错找不到依赖。经过排查发现,问题是镜像源缺少一些包,因此无法下载依赖。解决方案是将镜像源更换为https://goproxy.cn,direct
。修改镜像源后,问题得到解决。这个问题花费了一些时间,但最终发现是一个简单的配置问题。总结起来,要注意镜像源的配置,确保能够正常下载依赖。
【总结由 Chat LangChain 生成】
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/9a8bee73.html
版权声明:转载请注明出处!
参考链接:
docker-minimize:https://github.com/CaoMeiYouRen/docker-minimize
RSSHub:https://github.com/DIYgod/RSSHub
Docker 镜像体积优化:https://blog.cmyr.ltd/archives/e0dc9e5a.html
在很久以前,我写过一篇博客 Docker 镜像体积优化 来说明如何 Docker 镜像体积,但实际上,那篇文章有一个遗漏的地方,那就是:只说明了如何优化 Node.js 运行时的体积,而没有说明如何优化包含 node_modules 依赖的体积。
现在,本文将补上这最后一个关键点。
在开始解释 RSSHub 的 Dockerfile 之前,先看下常见的优化 Docker 下 Node.js 项目的体积的方案。
对比以下两个 Dockerfile 的差异
方案一
1 | FROM caomeiyouren/alpine-nodejs:1.1.0 as builder |
方案二
1 | # 阶段一:构建阶段 |
可以看到,相比方案一,方案二采用了分阶段构建的方法。
在这种情况下,最终的构建产物中将只保留生产环境所需的依赖,而不需要开发环境、构建环境下的依赖
具体的体积差异参考下图。
392MB vs 338MB,可见还是有一定差距的。
例如,将
1 | npm i |
替换为
1 | npm i --production |
此时会只下载生产环境依赖,可以减少部分体积。
但在这里,我要揭示一个真相,那就是,在 Node.js 生态中,使用 npm i --production
替换npm i
无法减小多少镜像体积!!!
有图为证。
此处以
docker-minimize
项目作为例子。虽然实际上用的 pnpm ,但原理类似。
caomeiyouren/alpine-nodejs 是我个人封装的一个精简版 Node.js 镜像,比官方的 node:alpine 体积还小。
1 | # 阶段一:构建阶段 |
使用 docker images
查看镜像体积可见,体积达到了 391MB!
那么接下来我们来看看使用 npm i --production
会不会减小镜像体积。
1 | # 阶段一:构建阶段 |
可以看到,在使用了pnpm i --production
后,镜像体积为 390MB,相比之前的镜像体积竟然只减少了1MB!
要知道, docker-minimize
中使用的devDependencies
数目是非常多的,在减去这些之后居然还没有减少!
问题出在了哪里?
实际上,在 Node.js 项目中,node_modules 的体积一般是随项目对数增长的,即依赖越多,node_modules 体积增长的越缓慢。
这又是为什么?
原因在于,无论是 npm、yarn 还是 pnpm,无一例外的都采用了多种方案来复用 node_modules 中存在的相同依赖 ,以减少 node_modules 的总体积,故 node_modules 的体积不是随依赖数目线性增加的,而是对数增长。
可以简单的理解为,安装的依赖越多,新增的依赖和原有依赖存在相同依赖的可能性更大。
读者可以点开 node_modules 看看,依赖的数目是不是惊人的多。如果使用 pnpm 请点开 node_modules/.pnpm。
所以,这就导致了明明使用了npm i --production
,减少的体积却没多少。
那么问题来了,RSSHub 是做了什么才让他们的镜像体积这么小的?
答案就在他们的这个 minify-docker.js 脚本里。
1 | /* eslint-disable no-console */ |
接下来让我们看一下这个脚本做了什么。
1 | const { nodeFileTrace } = require('@vercel/nft'); |
整体而言,这个脚本就做了一件事,使用 @vercel/nft
分析依赖,获取所有真正使用到的依赖,然后保留其中以node_modules/
开头的文件,复制到指定的目录。
而这个脚本,才是今天要说的重点!
本人在 RSSHub 脚本的基础上又改了下, 使之可以适配更多的项目,做到开箱即用!具体参考:minify-docker.js
将 minify-docker.js
放在项目根目录的 scripts
文件夹下,例如scripts/minify-docker.js
。
然后在 Dockerfile 中这样写。
1 | # 阶段一:构建阶段 |
此时你就能得到一个体积非常小的 Node.js 镜像!仅仅 106MB!,差不多是之前的四分之一!
完整的项目请参考:docker-minimize 。可以自动动手试试!
在看完上述 Dockerfile 后,你可能会注意到,我在构建环境和生产环境都使用了caomeiyouren/alpine-nodejs:1.1.0
这个镜像作为基础。
在 caomeiyouren/alpine-nodejs
中,安装了 Node.js、Npm、Git、Pnpm 等构建环境的必须软件,但在生产环境中,只需要 Node.js 就够了,所以还存在减少体积的空间。
所以可以将生产环境的基础镜像改成 caomeiyouren/alpine-nodejs-minimize
,这是一个由我自己打包的最小化 Node.js 镜像,比官方的node:alpine
镜像体积还要小很多!
1 | # 阶段三:生产阶段 |
没图没真相,参考下图可知,本人打包的 Node.js 镜像在压缩后比官方的还要小 22MB!
本文介绍了如何优化 Docker 下 Node.js 项目的体积。首先,通过分段构建和精简依赖的方法可以减小镜像体积。分段构建可以通过多个阶段构建来只保留生产环境所需的依赖,而精简依赖可以通过只下载生产环境依赖来减少体积。然而,仅使用npm i --production
无法显著减小镜像体积,因为在 Node.js 生态中,依赖的体积是随项目对数增长的。为了解决这个问题,可以使用工具如@vercel/nft
来分析真正使用到的依赖,并复制到指定目录,从而减小镜像体积。最终,通过正确的精简依赖的方法,可以得到一个体积更小的 Node.js 镜像。
【总结由 Chat LangChain 生成】
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/be640cee.html
版权声明:转载请注明出处!
参考链接:
网页录屏是一个常见的需求,但具体实现起来有许多需要考虑的地方。
比如说,如果以视频格式保存,无论是上传还是保存到 OSS,都需要耗费大量的流量和硬盘,所以出于成本考虑,往往需要降低视频时长和画质,效果就不是很好了。
那么,有没有一种体积小,但又能清晰的录制网页的软件呢?
有的!
那就是我接下来要讲的这个 npm 包——TimeCat!
废话不多说,先按文档安装!
1 | npm i timecatjs |
如果你只想安装录制模块或播放模块,可以执行以下命令
1 | # 只安装录制模块 |
当然了,直接通过 CDN 引入也是可以的。
1 | <script src="https://cdn.jsdelivr.net/npm/timecatjs"></script> |
在安装好依赖之后,就要在项目中使用了
1 | import { Recorder, Player } from 'timecatjs'; |
在这里要注意的是,当 Recorder 或 Player 实例化的时候,就会开始生效,即开始录屏和开始播放。
更具体的代码可参考官方给出的案例:https://github.com/oct16/timecat-demo/tree/record-and-replay
官方给出了一个 React 版本的例子,那我这里就补充一下 Vue 的例子吧。
使用的 Vue 版本为 Vue 3.3,使用 setup 语法。
Record.vue
1 | <template> |
Player.vue
1 | <template> |
具体逻辑跟 React 版本一样,完整的项目就请读者自行补充了。
如果你有使用过 sentry
的话,可以发现里面有一个跟 TimeCat 很像的功能:Replays
看这进度条和小窗播放,是不是和 TimeCat 有七分像?唯一的区别是 sentry 还帮忙打码了,只会记录用户的操作,而不会记录具体的内容。
实际上,如果仅用于记录日志,是需要和 sentry 一样对提交的内容进行去敏感
处理的,这样有助于保护用户隐私。
当然了,如果是要具体录制某些内容,那自然还是 TimeCat 更好,毕竟全打码了还怎么看啊!
TimeCat 是一个可以实现轻量级网页录屏和播放的 npm 包。它可以帮助我们在网页中录制视频,并以较小的体积保存。使用 TimeCat,我们可以降低视频时长和画质,从而减少流量和硬盘的消耗。安装 TimeCat 非常简单,只需执行npm i timecatjs
命令即可。在使用 TimeCat 时,我们可以实例化 Recorder 对象来录制视频,也可以实例化 Player 对象来播放视频。在 Vue 项目中使用 TimeCat 也非常简单,只需在组件中引入 TimeCat 并实例化 Recorder 或 Player 对象即可。总的来说,TimeCat 是一个非常方便和实用的工具,可以帮助我们实现轻量级网页录屏和播放。
【总结由 Chat LangChain 生成】
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/6e855105.html
版权声明:转载请注明出处!
参考链接:
wechaty:https://github.com/wechaty/wechaty
废话少说,直接上安装流程!
首先,wechaty 是基于 TypeScript 开发的,所以需要 nodejs 环境。
1 | node -v |
其次,需要通过 npm 来安装
1 | npm -v |
只需要创建一个新的 nodejs 项目后安装 wechaty 即可。
1 | cd <your wechaty dir> |
然后就成功安装了 wechaty !
单纯的安装是没有用的,能运行才是真的行!
创建一个新的 index.ts 文件(或者其他任何你喜欢的文件名)
1 |
|
以上代码实现了一个最简单的微信机器人,只要你向机器人发送ding
,它就会回复dong
。
在运行代码之后,会看到一个二维码,使用微信机器人的账号扫码登录即可。(机器人推荐使用小号,毕竟容易被封。)
然后登录成功的话就会看到 session,检查下账号即可
之后,就可以尽情的使用 wechaty 提供的 API 进行开发了!
这篇博客介绍了如何使用 Wechaty 创建自己的微信机器人。首先,需要安装 Node.js 和 npm 环境。然后,通过 npm 安装 Wechaty。接下来,创建一个新的 index.ts 文件,并编写代码实现最简单的微信机器人功能。运行代码后,使用微信扫描生成的二维码进行登录。登录成功后,就可以使用 Wechaty 提供的 API 进行开发了。这篇博客提供了详细的安装和使用步骤,适合想要学习微信机器人开发的开发者阅读。
【总结由 Chat LangChain 生成】
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/eb20e5d9.html
版权声明:转载请注明出处!
参考链接:
进入服务器后 点击 开始——运行 输入命令:
1 | netsh firewall set icmpsetting 8 |
Windows server 2019 采用 :
1 | netsh advfirewall firewall set icmpsetting 8 # 根据实测,这个命令行无法生效,还是上一句生效 |
测试:
1 | ping x.x.x.x # 替换成你服务器的 ip |
正常的话就能看到 ping 的结果了
实际上也可以通过直接关闭防火墙来设置运行 ping,只不过关闭防火墙后服务器的安全会受到很大影响,所以一般不建议开放不必要的端口。
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/cb933e30.html
版权声明:转载请注明出处!
参考链接:
快速创建 Spring Boot 项目模板:https://start.spring.io/
Spring Boot:https://github.com/spring-projects/spring-boot
Spring Boot 3.0 正式发布及新特性解读:https://www.cnblogs.com/jimmyhu/p/17300314.html
最近研究了下如何在 Spring Boot 中使用 Swagger,发现在 Spring Boot 2.7 和 3.0 两个版本中的用法有所不同,特此记录。
如果你只是想找一个能运行的最小 demo,请参考本人写的 demo 模板!!!
Spring Boot 2.7 项目模板:https://github.com/CaoMeiYouRen/spring-boot-template
Spring Boot 3.0 项目模板:https://github.com/CaoMeiYouRen/spring-boot-v3-template
如果你想了解更多细节,请继续往下看
如果你用的是 IDEA,请在项目上右键,点击打开模块设置
,切换到项目设置
,修改 Java SDK 为 1.8。
在 pox.xml
中添加如下依赖
1 | <dependency> |
新建一个配置文件,例如 Swagger2Config.java
1 | // 声明为配置文件,让spring加载 |
1 | package ltd.cmyr.demo.controller; |
在 IDEA 中可通过如下方式运行
默认情况下,访问http://127.0.0.1:8080/swagger-ui.html
即可看见 Swagger 页面
大功告成!
在 Spring Boot 3.0 中使用 Swagger 所需要的依赖和 2.7 有所不同。
原因很简单,Spring Boot 3.0 是一次大版本升级,故造成了很多不兼容更新。
例如最低兼容的 Java 版本为 17,底层也切换到了 Spring 6。
所以自 2020 年以来没有更新过的 springfox-swagger2 和 springfox-swagger-ui 自然不会兼容 2022 年发布的 Spring Boot 3.0。
所以,一个很简单的解决方法就是,换一个 Swagger 依赖不就行了?
请注意,运行 Spring Boot 3.0 必须要 Java 17 及以上,所以请升级你的 Java 版本!
Java >= 17
Maven >= 3.6
如果你用的是 IDEA,请在项目上右键,点击打开模块设置
,切换到项目设置
,修改 Java SDK 为 17。
在 pox.xml
中添加如下依赖
1 | <dependency> |
springdoc-openapi-starter-webmvc-ui
默认情况下即可直接运行,无需其他配置。
你可以在 application.yml
中添加如下配置来设置 swagger-ui
的路径。
更多配置请参考官网:https://springdoc.cn/spring-rest-openapi-documentation/
1 | springdoc: |
由于更换了依赖,因此原先的注解自然也是不能用的,但实际上大同小异,写起来还是类似的。
参考代码如下:
1 | package ltd.cmyr.demo.controller; |
在 IDEA 中可通过如下方式运行
默认情况下,访问http://127.0.0.1:8080/swagger-ui.html
即可看见 Swagger 页面。
由于版本差异,UI 看上去和之前的有些不一样,但功能上还是一样的,没什么区别
至此,我们完成了在 Spring Boot 3.0 中使用 Swagger 的配置!大功告成!
关于 Spring Boot 2.7 和 3.0 两个版本,我们该如何做出选择呢?
没图没真相,请看下图的数据。
数据源自:https://newrelic.com/resources/report/2023-state-of-the-java-ecosystem
在 2023 年,使用率最高的 Java 版本是 11,占比达 56.06%;其次是 Java8,占比 32.99%;然后才是 Java17。
虽然看上去 Java17 目前的使用率还不是很高,但参考 Java8 在短短 3 年内占比就大幅下滑的情况,未来,作为新的 LTS 版本的 Java17 使用率必然会迅速上升。
所以,如果你的项目是新项目,要在未来长期维护的,那么建议选择 Spring Boot 3.0,基于 Java17 进行开发;如果你的项目还需要向下兼容,主要考虑旧的逻辑,那么建议选择 Spring Boot 2.7 ,毕竟 Java8 的生态还是非常完备的,很多旧的依赖包也只支持 Java8。
本文介绍了如何在如何在 Spring Boot 2.7 和 3.0 中使用 Swagger,读者可参考本文的内容按步骤进行配置 Swagger,并选择适合自己的 Spring Boot 版本。
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/5c0eb01b.html
版权声明:转载请注明出处!
哈喽,大家好,我是草梅友仁。
今天的话来跟大家讲一下我这次参加 2023 原神音乐会的观后感。
这次的话,我在看完这场原神音乐会之后,我只能说,物有所值!
现场的气氛非常的热烈!把一场音乐会看出了演唱会的感觉!
现场还有很多 coser,可惜这一次没什么勇气上前拍照合影了!
这一次进场的时候就非常搞笑了,首先是找错了门口,白绕一圈;其次是找错位置,打扰到另一边的观众了;当然,最后还是找到了我自己的位置。
然后我旁边坐了一位大哥,应该是音乐专业的,他非常的专业,甚至还带了个望远镜,还能认出几乎所有的乐器,可以说是非常的专业了。
唯一的小问题就是他有点太啰嗦了,一直在旁边说个不停,稍微有点吵到我了。
但他也确实非常牛逼,是个剧情党,然后剧情也看的非常仔细,很多细节都知道。而且他还把曲目的顺序都背了下来,确实非常牛逼。
所以综合来讲,虽然他有点啰嗦,但这位大哥确实还是增加了一点观看体验。
这次的曲目,他也是按照时间顺序来的,从开场的天理维系者,到蒙德、璃月,然后再到稻妻、须弥,一路走过来,最后还增加了枫丹的内容!可以说是意外之喜!
最后是安可了三首曲子,其中两首是枫丹的曲子,还一首是《我们终将重复》,非常满意!
最令我惊讶的还是唱《神女劈观》的时候,真的请到了杨扬老师本尊过来!太好听了!太美丽了!
另外的话,就是在开场待机的时候,不知道为什么,一直有各个方向的旅行者在那喊“原神,启动!”,笑死个人了;还有,中场黑屏的时候,也有人在那喊“我是 XX 的狗!”。好像第一个就是“神里绫华的狗”……
好了, 快乐的时光总是短暂的,现在结束了。
我祝各位旅行者们逐月节快乐!祝各位观众姥爷中秋国庆快乐!
陌生人,祝你幸福安康!
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/e09e35b2.html
版权声明:转载请注明出处!
参考文章:
TinyLetter:https://app.tinyletter.com/
Zapier:https://zapier.com/
博客新增邮件订阅:TinyLetter:https://lillianwho.com/posts/thanks-tinyletter/
静态博客添加 Newsletter 的几种推荐方案:https://irithys.com/p/blog-newsletter/
注意:目前已不推荐使用 Tinyletter !具体原因可见:Reminder: We are closing TinyLetter
Tinyletter 在 2024 年 2 月 29 日后将被关闭,故推荐用户尽快迁移到其他 Newsletter 方案!
最近想给博客设置邮件订阅,这样的话可以通过邮件来通知读者博客有更新,经过一番研究之后,发现可以通过 Tinyletter 来实现博客邮件订阅,特此记录。
先介绍一下,TinyLetter 是什么?
Tinyletter 是 Mailchimp 邮件提供商提供的一项完全免费的个人 Newsletter 服务,有用量限制,但对于小博主而言一般来讲是够用的。
首先,需要注册一个 TinyLetter 账号:https://app.tinyletter.com/#!/login
只需要一个邮箱即可,建议使用 gmail 等外国邮箱,以免被误认为垃圾邮箱。
在完成注册后,需要前往 Profile 页面填写地址,这个是出于当地法律的要求。
可以填写一个美国的地址,但是我试了下,填中国的地址也没有把我给禁了,所以也可以填中国的地址,只要不是假的就行了。
【我估计还是看有没有滥用,比如有没有发垃圾邮件之类的来风控的,所以只要合理使用应该没什么问题】
机翻参考:您可以包括一个物理地址或邮政信箱。它将出现在您的时事通讯的页脚中,但不会出现在公共档案中。这是发送批量电子邮件的法律要求。
然后继续把页面往下拉,看到 send directly 一栏,复制秘密邮箱地址。
注意:这个秘密邮箱地址一定要保护好,不能公开,一旦公开的话,别人就可以向你的邮箱发送邮件了。
秘密邮箱地址的作用是,当你向该邮箱发送任何带有主题的邮件的时候,都会进入你 TinyLetter 的草稿箱,然后 TinyLetter 就会向你的注册邮箱发送一封通知邮件。
在邮件到了草稿箱之后,你就可以向你的订阅者发送邮件了。
当然,也可以点 Send Preview 发送预览邮件,看看邮件在订阅者视角是怎么样的。
到这一步,我们就完成了向订阅者推送邮件的功能
关于 TinyLetter 订阅页面的美化,可参考:https://lillianwho.com/posts/thanks-tinyletter/
效果如图所示,可在博客下方查看效果
此时还有另一个问题,如何自动获取博客更新呢?
可以通过 RSS 来实现这一点。
以 hexo 为例,可以使用 hexo-generator-feed 这个插件来生成 RSS
例如:https://blog.cmyr.ltd/atom.xml 或 https://blog.cmyr.ltd/RSS.xml
atom 和 RSS2.0 的格式略有区别,但都是常见的 RSS 格式,可以被主流的 RSS 解析器解析。
此时还需要另一个工具:Zapier
Zapier 是一个无代码集成平台,其主要功能是帮助使用者在不用写代码的情况下,能连接多种互联网服务
以订阅 RSS 的需求为例,需要先订阅 RSS,然后再推送到邮件
Trigger
这边选择 RSS by Zapier
然后选择 New ltem in Feed
,点击 Continue
然后就是比较关键的 Feed URL
了,这个是必填的,剩下的默认就好。
最后再测试一下你的 RSS 地址,一切正常的话就会看到博客的内容,确认无误之后点击 Continue with selected record
Action
这边选择 Email by Zapier
Event
选择 Send Outbound Email
To
这里填之前 TinyLetter 中获取的秘密邮箱地址,Subject
和Body
就看自己的需要填写即可。
最后就可以点击Test step
来测试一下了,如果一切顺利的话就可以在 TinyLetter 的草稿箱中看到邮件了。
最后别忘了启用这个Zap
至此,我们就完成了基于 RSS 的邮件订阅功能。
通过 Tinyletter 订阅 RSS 可以方便地向订阅者发送邮件通知博客更新。
首先,注册一个 TinyLetter 账号并填写地址。
然后,获取秘密邮箱地址,该地址用于将邮件发送到 TinyLetter 的草稿箱。
最后,向订阅者推送邮件。
【总结由 New Bing 生成】
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/971f76c0.html
版权声明:转载请注明出处!
参考链接:
谷歌广告联盟(Google AdSense):https://adsense.google.com/start/
最近(几个月前)研究了下如何接入谷歌广告联盟,现在来记录一下。
原因很简单,那就是——赚钱!
如果没有收入,那么运营网站所需要的服务器费用就是一笔沉重的负担,所以,当站长辛辛苦苦运营起网站之后,自然就需要有收入,这样才能可持续运营。
谷歌广告联盟(Google AdSense)是谷歌提供的一项网站变现方案,可以帮助站长获得广告收益。
该部分可参考官网介绍:让网站成功变现、针对移动设备优化广告、节省时间。
AdSense 代码段
或Ads.txt 代码段
。个人推荐使用Ads.txt 代码段
的方案,因为只需要将Ads.txt
文件提交到项目根目录即可
5. 完成关联之后,会进入审核阶段。只要你的网站是有些内容的,一般是会通过的,如果审核失败请根据反馈自行修改
在完成以上步骤之后,再等待一段时间,等到广告代码生效即可
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/38c2d695.html
版权声明:转载请注明出处!
参考链接:
https://uniapp.dcloud.net.cn/api/system/getappauthorizesetting.html
https://uniapp.dcloud.net.cn/api/system/openappauthorizesetting.html
废话不多说,先上结论
1 | // #ifdef APP-PLUS || MP-WEIXIN |
是的,就是这么简单,uni-app 官方已经帮我们封装好了。
值得注意的是,该 API 仅支持在 App 和微信小程序端使用,需要做好条件编译
如果没有得到授权的话,一般需要引导用户进行授权,此时需要跳转到系统授权的管理页。
参考代码如下:
1 | // #ifdef APP-PLUS || MP-WEIXIN |
和上一个 API 一样,都需要做好条件编译的兼容。
最后再补充一下非官方的实现方式
1 | /** |
1 | // Android 跳转到应用的权限页面 |
iOS 版的实现由于没有设备进行试验,所以代码就不放出来了,可参考官方插件的实现。
但是由于官方插件年久失修,目前的可用性不高,请下载源码后自行调试一遍!!!
本文介绍了 uni-app 官方提供的两个 API:uni.getAppAuthorizeSetting()
和 uni.openAppAuthorizeSetting()
,它们可以分别用于检测和跳转到 APP 端的通知权限设置页面。
还提供了非官方的实现方式,主要针对 Android 平台,使用了 plus.android 模块和 Java 类库来实现相同的功能。
注意代码需要做好条件编译,因为这两个 API 只支持在 APP 和微信小程序端使用。
【总结由 New Bing 生成】
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/545e0e03.html
版权声明:转载请注明出处!
参考链接:
uni-push2 统一推送:https://uniapp.dcloud.net.cn/unipush-v2.html
最近研究了下 uni-push2.0,发现可以实现 App、Web、小程序等多个平台的推送,特此记录。
uni-push
是 DCloud 推出的、全端的、云端一体的统一推送服务。
- 客户端方面,
uni-push2
支持 App、web、小程序。
- App 端,内置了苹果、华为、小米、OPPO、VIVO、魅族、谷歌 FCM 等手机厂商的系统推送和个推第三方推送
- 小程序端,内置了 socket 在线推送。如需模板消息/订阅消息,另见uni-subscribemsg
- web 端,内置了 socket 在线推送 (uni-push1 仅支持 app,且 app 必须包含个推原生 sdk。uni-push2 在 app 端如不需要厂商推送,只需在线推送,无需集成个推原生 sdk)
- 服务端方面,
uni-push2
支持 uniCloud 云端一体,无需再编写复杂代码轻松完成 push。 (uni-push1.0 仅支持使用传统服务器开发语言如 php,未和客户端有效协同,流程比 uni-push2.0 繁琐)- uni-push 还自带一个 web 控制台。不写代码也可以在 web 页面发推送。uni-push1.0 的 web 控制台在dev.dcloud.net.cn。uni-push2.0 的 web 控制台是开源的,属于 uni-admin 插件详见
在开始使用 uni-push2.0 前,需要先开通 uni-push2.0。
开通流程详见:uni-push2.0 快速上手
此处请注意,如果还需要开通 Android 或 iOS 端的推送,则还需要填写 Android 包名、签名(SHA1 指纹)或 iOS Bundle ID。
这里以获取 Android 签名为例:
切换到签名证书所在的文件夹
keytool -list -v -keystore test.keystoreEnter keystore password: # 输入密码,回车1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
- 这里的 `test.keystore` 就是你证书 keystore 的名字
- 然后就能看到类似的内容,在网页上填写即可
- ![image-20230805190027146](https://cmyr-picgo.cmyr.ltd/images/202308051900231.png?x-oss-process=style/compressed-picture)
### 2.客户端启用 uniPush2.0
在开通完成后,还需要在客户端启用 uni-push2.0。
APP 端的启用如图所示
![image-20230805190834894](https://cmyr-picgo.cmyr.ltd/images/202308051908967.png?x-oss-process=style/compressed-picture)
> 注意:需要离线推送的话还需要引入对应的 SDK
Web 端的启用如图所示
![image-20230805190939577](https://cmyr-picgo.cmyr.ltd/images/202308051909661.png?x-oss-process=style/compressed-picture)
微信小程序端的启用如图所示
![image-20230805191012079](https://cmyr-picgo.cmyr.ltd/images/202308051910161.png?x-oss-process=style/compressed-picture)
> 注意:在小程序端使用还需要将个推的域名加入白名单,否则无法联网
>
> 个推的域名参考[小程序中使用 uni-push2.0 的白名单配置](https://uniapp.dcloud.net.cn/unipush-v2.html#useinmp)
>
> 个推自有域名:wshz.getui.net、wshz.gepush.com、wshzn.gepush.com、wshzn.getui.net
### 3.1 客户端监听推送消息
由于监听推送消息的代码,需要在收到推送消息之前被执行,所以建议监听逻辑写在应用一启动就会触发的[应用生命周期](https://uniapp.dcloud.io/collocation/App.html#applifecycle)`onLaunch`中
参考代码如下:
```js
//文件路径:项目根目录/App.vue
export default {
onLaunch: function() {
console.log('App Launch')
uni.onPushMessage((res) => {
console.log("收到推送消息:",res) //监听推送消息
})
},
onShow: function() {
console.log('App Show')
},
onHide: function() {
console.log('App Hide')
}
}
注意:接收到的消息有两种类型,分别是:
- “click”-从系统推送服务点击消息启动应用事件
- “receive”-应用从推送服务器接收到推送消息事件
如果你在接收到
receive
消息的时候,本地通过uni.createPushMessage
的方式手动创建通知栏消息的,那么,此时如果再通过通知栏点击进入,就会再触发一次click
消息。因此,需要在监听消息的时候区分两种消息类型,比如说只监听
receive
类型的消息。
示例代码如下:
1 | // uni-app客户端获取push客户端标记 |
拿到 push_clientid
后,就可以在服务端发起推送了。
推送消息就要到服务端进行了。
首先在创建云函数的时候需要选择uni-cloud-push
扩展库,否则无法调用推送功能。
云函数的示例代码如下:
1 | ; |
之后就可以调试运行一下云函数,如果一切顺利的话,此时你的客户端就应该会接收到推送消息了。
在 Web 端,无需特别的配置即可在开发模式下接收到推送消息。
但如果是小程序端,则还需要配置域名白名单,同时,无法在微信小程序模拟器里接受到推送消息,请真机运行之后再试(即将小程序运行到微信客户端里)。
特别注意!如果是 APP 端,无论是 Android 还是 iOS 端,都无法在官方的基座应用里接收到推送消息!需要自行打包一个自定义调试基座
应用才行!
【如下图所示】
本文介绍了如何基于 uni-push2.0 实现 App、Web、小程序等多个平台的推送,包括开通、启用和调用的流程和代码示例。
本文参考 uni-push2.0 官方教程和笔者的踩坑记录总结而成,希望对于各位读者朋友能有所帮助,谢谢观看。
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/1ecf6190.html
版权声明:转载请注明出处!
参考视频:
我到底是做错了什么才想要来 BW?【草梅】:https://www.bilibili.com/video/BV1qj411R7iT
是什么让社恐在 BW 拍 100 个 coser?【草梅/BW 集邮】:https://www.bilibili.com/video/BV12V4y1t7BX
哈喽,大家好啊,我是草梅友仁。
今天的话要给大家吐槽加分享一下我前几天参加 BW 的感受。
首先,是要吐槽一下前一天赶往上海的悲惨经历。
时间来到 7 月 21 日下午,本人乘坐高铁,从杭州东站前往上海虹桥站。路上并不顺利,首先是从杭州东站出发的时候被没收(保管)了充电宝。这个确实是我的锅,因为忘记检查充电宝容量了。然后又在坐上高铁的时候想起忘记带自拍杆了(埋下伏笔 1)。
但很幸运的是,我看到了位出卡芙卡的 coser 坐在我前面,虽然拿出勇气上去想拍照,但被“没有化妆”为理由拒绝了(埋下伏笔 2)。从某种意义上讲,因为这事,我第二天开始疯狂的拍摄 coser,可能是某种报复性心理。
然后呢,十分正常的出站换乘地铁,此时的我还不知道外面发生了什么。直到要出站换乘公交的时候,我走上到了出站口,看见外面狂风暴雨,我就知道,就算打伞也会变成落汤鸡!因此被困地铁大半小时。期间还看到了个绝区零的妮可,和明日香、绫波丽,还有个雷电将军的 coser,总之大伙都被困住了。
在雨稍微变小了点之后,终于出去坐上了公交。此时的路面已经积水严重,马路上的水已经可以没过脚了,鞋子自然也是湿透了。但对我而言,考验,才刚刚开始!
公交一共一站路远,也就三、四公里多,正常情况下只需要不到十分钟就能到达,但这段路开了有快两小时!因为路上都是积水,堵车十分严重,估计还有不少车抛锚在路上了吧。
好不容易到了下车的地点,然而,更大的考验来了。
由于路面积水严重,路上有个超大面积,超深的积水潭,让我没法走到路边。如果我要绕过去,就得走上机动车道。由于夜色已晚,考虑到走机动车道被创的概率不低,因此被迫蹚水过去,鞋子彻底报废,同时,行李箱也进水了(埋下伏笔 3)。
最终,历经千辛万苦才抵达宾馆,但却是个民宿,质量很低。但怎么说呢,考虑到这个价格,能住就行了,还要啥自行车啊!
最后,终于想换身衣服的时候发现,行李箱也湿透了,而我里面的衣服没有用袋子包装好,也进水了,用来换洗的衣服也彻底湿透,彻底寄了!
唯一的好消息是带去的食物还是用袋子装着的,没有进水!
晚餐最终去一个泡了水的小店里买了桶泡面来解决。
本来到此就该好好休息了。
但是,不知道为什么,已经睡着的我,突然又醒了过来,并在之后翻来覆去睡不着,一直到 3 点才睡着!(来自手环的数据),睡眠也是彻底爆炸。
心态崩溃的我开始反思自己是不是做错了什么,为什么要选择一个下暴雨的时间来上海参加 BW。
出发前我已经准备好风扇了,以为排队时的大太阳才是问题;但万万没想到的是,最大的问题居然是大暴雨!要带上拖鞋或雨靴才行!太惨了啊!相信 21 号那天去了 BW,或者说当天在上海的人都应该能感同身受的吧?
如果你以为这个视频就是吐槽下我的悲惨经历的话,那就还是错了,我真正想说的是,不要因为眼前的困难就放弃希望,明天会更加美好的!
才怪咧!入场的时候就因为没看地图,导致多走了大半圈的路!还被自动售货机吞了钱,没有出货!(虽然退回来了)
好吧,吐槽到此为止,接下来就是我在 7 月 22 日当天逛展的收获。
虽说确实去看了原神、崩铁和绝区零展台,但由于米家游戏的人实在是太多了,我也去的比较迟,所以周边什么的连排队的资格都没有,故直接放弃。
然后就在场内随便逛了。
回想 17 年参加第一届 BW 的时候,那时候的我第一次逛漫展,也不知道该干什么,于是在完成官方的打卡活动之后就很无聊了
但这一次不一样了!
我选择了拍 coser!
有观众姥爷可能发现了,为什么都是我拍别人而不是合影?
原因是我的自拍杆忘在家里了!
所以我就选择了拍别人,而不是自拍合影。
又有观众姥爷要问了,没有自拍杆也可以合影啊?
你说的很对,但当时的我脑子没转过弯来。
对于这次逛展,我定了一个小目标,那就是要拍摄 100 个我认识的角色的 coser。也就是说,我不仅要认识所 cos 的角色,还要找 coser 拍照!并且还要尽可能不重复!
这对于一个万年宅家的社恐而言实在是太困难了!
不过结果比我想的要好,虽然没能达成目标,但也实现了大半。
【具体图片请前往 b 站相关视频查看】
以上,不计模型和痛车,累计拍摄原神相关 coser 共 26 位,不重复的角色为 21 位;崩坏:星穹铁道相关 coser 共 14 位,不重复的角色为 11 位;绝区零相关 coser 共 4 位;崩坏三相关 coser 共 2 位;明日方舟相关 coser 共 3 位;塞尔达相关的 coser 共 2 位;动画相关的 coser 共 7 位,不重复的角色为 6 位;VOCALOID 相关的 coser 共 1 位。总计 59 位 coser,不重复的角色为 50 位。
以上就是草梅这次逛 BW 的全部收获了,对于一个社恐而言,敢于在一天之内找 40 多个陌生人搭话(我主动搭话请求拍摄的),属实已经尽力了!
在此,向所有接受拍摄的 coser 表达由衷的感谢,是你们让一位社恐变得勇敢!在此要特别感受第一位接受拍摄的 coser,如果没有你的话,我可能就无法实现今天拍摄那么多 coser 的壮举了,再次表达感谢!谢谢您!
在此,我也要向各位观众姥爷们说一句心里话:喜欢二次元才没什么错!世界上和我们有相同喜好的人还多了去了呢!请对自己热爱的事物更加有勇气一点!我们才是对的!
虽然腿都要走断了,但当二次元真 TM 开心啊!下辈子还当二次元!
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/f2c308dd.html
版权声明:转载请注明出处!
参考链接:
轻松搞定 RAR、Zip 压缩包密码!Hashcat +john the ripper 亲测好用!:https://www.freedidi.com/2655.html
John the Ripper:https://www.openwall.com/john/
hashcat:https://hashcat.net/hashcat/
免责声明:本文所讲内容仅供学习使用,请勿用于违法用途!如用于违法用途,请自行承担后果,与本文、本人无关!
最近在网上找资源的时候下载到一份加密的 RAR 压缩包,看到无良搬运工加个密就开始捞钱,作为一个程序猿,这怎么能忍?
既然不想掏钱,那当然要用程序猿的办法——暴力破解了。
而本文要讲述的 hashcat ,就是这样一个密码破解工具。
首先,从 hashcat 官网下载安装包,解压缩后放在合适的文件夹下。
这里直接下载二进制版就可以了。
这里以 D 盘为例。
调起命令行控制台,切换到该目录,运行
1 | hashcat --version |
能正确输出版本即为安装成功。
接下来从官网找个例子,测试一下是否能正确运行。
这里以 MD5 为例。
在控制台中输入
1 | hashcat -m 0 -w 4 -a 3 8743b52063cd84097a65d1633f5c74f5 |
如果一切正常,你将在控制台看到
冒号后面的就是破解结果,是hashcat
,和官网给出的答案一致。
注意:
INFO: All hashes found as potfile and/or empty entries! Use --show to display them.
此时将命令改为:
1 | hashcat -m 0 -w 4 -a 3 8743b52063cd84097a65d1633f5c74f5 --show |
就能看到曾经破解过的 hash 了。
$
的转义,在默认情况下,$符号被用于引用环境变量,可能会造成执行结果错误,如图所示:此时只需要用单引号''
将 hash 括起来即可。
1 | hashcat.exe -m 13000 -w 4 -a 3 '$rar5$16$b88c1d7d2c96dc9d1b1a5ccdc5c25d50$15$8f0b287c982535c868bbff486ee9acd2$8$43907bfa03430471' |
可以看到,执行成功了。
看完上面的例子,读者朋友肯定会有个问题,那就是用来破解的 hash 是从哪来的?
如果是类似 MD5、SHA1 这类纯文本,那么算法的结果直接就是用来破解的 hash,而如果是 RAR、ZIP 等压缩包,就需要借助 John the Ripper
这个工具来获取 hash 了。
同样是通过官网获取到安装压缩包:https://www.openwall.com/john/
解压到合适目录,这里同样以 D 盘为例
注意,可执行文件在 run
目录下。可考虑将该目录加入环境变量,方便后续操作。
然后,将需要破解的 RAR 压缩包放在没有空格的路径下(包括文件名),经过实际测试,John the Ripper
是支持路径中有中文字符的,但不支持有空格,所以可以把要破解的压缩包改个名字,然后再破解。
这里以 E 盘下面的TEST.rar
文件为例,我设置了密码为1234
,稍后来演示如何破解。
首先执行如下命令来获取到 hash 值
1 | rar2john 'E:\Downloads\TEST.rar' |
如果你的John the Ripper
没有加到环境变量中,请cd
到对应的目录再执行。
获取到如下结果:
冒号后面的$rar5$16$34a40031e247afdee2660ff23e1c0d64$15$5dce796f02396b7f612b19962aa09b01$8$b86700a53c877894
就是我们需要的 hash 值。
接下来执行
1 | hashcat -m 13000 -w 4 -a 3 '$rar5$16$34a40031e247afdee2660ff23e1c0d64$15$5dce796f02396b7f612b19962aa09b01$8$b86700a53c877894' |
这里逐一为大家解释参数的作用。
-o password.txt
就会输出到password.txt
文件中。稍微等待一段时间后,可以看到破解结果,是1234
,与前文设置的一致。
破解的时间与密码的复杂程度成正比,简单的密码还是破解的非常快的,如果很长时间没有破解成功,那么就说明这个密码非常复杂,还是直接放弃暴力破解的方法吧。
仅仅是破解四位数字的密码以本人RTX 3060 Laptop
的 GPU 也需要跑一分钟,所以更长的密码需要的时间也可想而知,故能不暴力破解就还是不暴力破解了,节约点 GPU 寿命。
以后再遇到加密了的 RAR、ZIP 压缩包,可就不能再忍着它了,直接用 Hashcat 和 John the Ripper 这两个工具破解,给它来点教训!
当然了,最后还是要提醒一句,本工具仅供个人学习使用,如用于违法用途,请自行承担后果,与本文、本人无关。
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/5865a866.html
版权声明:转载请注明出处!
哈喽,大家好,我是草梅友仁。
今天的话我去把《刀剑神域进击篇》的两部电影给看了。《无星之夜》的话是在 B 站看的,然后《暮色黄昏》的话是买了票去电影院看的,反正就连着看了一下。
《刀剑神域进击篇》,一言概之的话,就是把刀剑神域第一季的 SAO 的部分给重置了一下,也可以说是写了个 IF 线。虽然整体是和第一季保持一致的,但这个剧场版也还是加了一些新的内容的,也可以说是一个新的世界线了。比较也是原作者参与的,反正就当个 IF 线看就行了,是以亚丝娜的视角的 IF 线。
由于是 IF 线,所以不管看没看过原作和第一季的观众都是不影响理解的,反正都会再讲一遍,不影响理解剧情的,因为它是一个独立的篇章。
然后呢,就今天这两部电影看下来呢,就怎么说呢,刀剑神域的电影,主要看的是啥呢?我觉得就主要看三个东西吧。一个是看桐姥爷拉刀光,当然也包括亚丝娜拉刀光,以及夫妻混合双打;另一个就是听战斗时候的 BGM,不得不说梶浦由记的 BGM 还是好听的;还一个就是看亚丝娜以各种各样的形式泡澡,反正就是固定给观众朋友们卖福利了。
再然后是看《进击篇》的原创角色,米特,我只能说谢天谢地,作者没有把这个角色刀掉。当然也有可能是目前还在前期阶段,也许是后期才刀掉也有可能。
也正因为是加了新角色在里面,所以这个剧情就和第一季略有不同了,世界线出现了分歧。不过也正因为加了新角色米特,有一个大佬带,这也就解释了原本很少打游戏的亚丝娜是如何一步一步成长为大佬的。毕竟亚丝娜是用她哥的号和设备来玩的,新手时期还是得有个大佬带的,不然可能当场去世了,也不太可能加入攻略组了,可能连桐姥爷都遇不到了。
相比《无星之夜》中前期的引导作用,米特在《暮色黄昏》中到了中后期才出场,最后在打 BOSS 的时候起到关键作用,没有她的话可能大伙都要寄了。就怎么讲呢,米特这个人物虽然确实有为了桐姥爷泡妹而服务的嫌疑,但多少还是塑造出了一点人物形象,也算是解释了为什么后期没有加入攻略组。
看刀剑神域的话,最热血部分还是看小伙伴们一起团结合作打 BOSS 嘛。不过讲真,看了《无星之夜》,又看了《暮色黄昏》,我是觉得刀剑神域的这个 BOSS 难度设计的实在是不合理啊,难度巨大,每一层都是机制怪,难度杠杠的。
就第一层的这个狗头人,这个难度真的合理吗?然后第四层的这个人马,可能是开局出场的,这个表现力上反而没有第一层的狗头人高。不过作为《暮色黄昏》这个剧场版的压轴 BOSS,这个以整层楼为身体的石头人 BOSS,弱点还会到处跑的机制,确实是真的恶心人啊!让人怎么玩啊!当然这也说明了桐姥爷是真的牛逼啊,九个人(最后是十个人)就把 BOSS 攻略下来了。
我一开始还在想打下来的旗帜给谁,结果发现是要么再获得一面旗帜,要么合并公会。不过讲道理,到了后期反正都是由团长(茅场)带领的攻略组打的,这些前期的公会、攻略组到后期估计也是要重组的。
最后打完 BOSS,亚丝娜说要给桐姥爷奖励的时候,我实在是有些绷不住了,亚丝娜直接一个洗面奶可还行,确实是奖励啊!此处可本……
两部剧场版下来,才攻略到第五层,按照这个进度,感觉还可以再出十部剧场版,可以一层一层打上去,甚至到七十五层还不结束,把七十五层之后的也攻略一下也不是没有可能。反正就可以续很长的内容吧。
因为刀剑神域最开始写的时候,就只有第一卷的内容,后面的二到八卷全都是以回忆录的形式补上去的,所以会发现有些内容可能前后对不上。SAO 的部分在动画第一季也只占了一半的内容,后半段是 ALO 的内容。因为作者一开始没有规划那么长的剧情嘛,只有一卷的内容也不能续太多。所以本次进击篇就干脆重写了……
怎么说呢,就刀剑神域而言,还是 SAO 部分的内容更吸引我,就这一段的内容比较有意思嘛。当然并不是我对角色有什么意见,我只是觉得 SAO 明明还有很多可以展开的内容,但却草草结束了,有些不太满意。所以我个人对进击篇还是比较感兴趣的,期待后续内容吧。
至于进击篇的两部电影值不值得看,我只能说刀剑神域的老观众还是值得去看的,保证找回当年的热血。就算不看剧情,看拉刀光,听歌,反正爽还是爽的。
当然了,两部电影也不是没有问题的,共同的问题就是前期节奏比较拖沓,就后期的打 BOSS 那一段的内容才比较高能。不过这也算刀剑的经典桥段了,一半日常一半打 BOSS,就这样了。
如果要打个分的话,《无星之夜》可以给七分(满分十分),《暮色黄昏》可以给八分,毕竟战斗的内容稍微多一些,也可能是电影院看的,更加带感一些。
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/652a5a31.html
版权声明:转载请注明出处!
最近在考虑为博客接入广告联盟,简单来讲就是打点广告,赚些收益。
目前主流的广告联盟很多,比如百度广告联盟、谷歌广告联盟等。
虽说谷歌广告联盟的收益更高(赚的都是美元),但由于谷歌广告联盟在国外,主要面向国外的用户,因此仅推荐面向国外用户的网站接入。
故这里以百度广告联盟为例,讲述如何为个人博客接入广告联盟。
在国内开网站,首先需要 ICP 备案和公安备案,没有这俩,网站都无法正常访问。
完成备案后,注册一个百度联盟的账号:https://union.baidu.com/bqt
然后进入网站合作页面
进入合作管理,然后点击新建网站
这里要注意的是,申请的时候要用主域名(不带前缀的域名),审核也是针对主域名的,因此这里有个小问题需要注意:当你想要申请的博客为子域名(例如 blog.cmyr.ltd),此时需要将主域名(例如 cmyr.ltd)临时解析到子域名下,这样就能通过审核,通过之后改回来就行了。
等待审核通过后,就可以在百青藤-网盟推广-代码位管理
下面新建代码位了。
根据自己的需要调整代码位的样式。
然后点击获取代码就可以看到要接入的广告代码了。
可以看到广告代码如下:
这里比较关键的是 id 和 container,id 决定了这是哪个代码位,千万不能填成别人的了,不然拿不到收益;container 决定了广告填充在哪个 div 容器中,这里可以自由调整。
后面的事情对程序员来讲就比较容易了,在博客中找个合适的位置放上广告就行了。
以本人为例,我在侧边栏和底栏放上了广告,这样不影响读者阅读还能打广告。毕竟我本人还是比较讨厌广告的,所以将心比心,还是不想太打扰到读者。
这篇文章讲述了如何为博客接入百度广告联盟。文章中提到,首先需要进行 ICP 备案和公安备案,然后注册一个百度联盟的账号,进入网站合作页面,新建网站并等待审核通过后,就可以在百青藤-网盟推广-代码位管理
下面新建代码位了。根据自己的需要调整代码位的样式,然后点击获取代码就可以看到要接入的广告代码了。最后,在博客中找个合适的位置放上广告就行了。
【总结由 New Bing 生成】
本文作者:草梅友仁
本文地址: https://blog.cmyr.ltd/archives/e941bc42.html
版权声明:转载请注明出处!