普通视图

发现新文章,点击刷新页面。
昨天以前首页

WordPress 插件-NeoDB Integration 书影音展示页面

作者 Dayu
2024年12月20日 10:59

将 NeoDB 书影音记录整合到 WordPress 中 实现了将 NeoDB 观影记录添加到 WordPress 页面中,展示页面:NeoDB 书影音

但流程较为复杂,本文将 Cloudflare worker 和 functions.php 整合成了 WordPress 插件,进一步简化流程。

本人无相关代码经验,插件由 ChatGPT 协助生成,时代真的变了。

使用方法

NeoDB API Developer Console 中点击Test Access Token,并 Generate 一个 NeoDB Bearer Token,示例:Th2121_qs-8agMAlSrkE_tzBbcvjsdkjtlCtr9QHX321312312Ytzo8_YmOxjxg

在终端(Terminal)或命令提示符(Command Prompt)中输入以下代码,将 YOUR_TOKEN 替换为 NeoDB Bearer Token。

curl -H "Authorization: Bearer YOUR_TOKEN" https://neodb.social/api/me

下载 NeoDB Integration 插件: https://github.com/DayuGuo/NeoDB-wordpress-Integration/releases/tag/gotest

在 WordPress 中安装并激活该插件。

在 Settings-NeoDB Settings 中输入 NeoDB Bearer Token。

在 WordPress 页面或文章中,使用以下短代码来显示数据:{neodb_page},使用时请将{}符号,换成[]。

Settings-NeoDB Settings 中可调整显示的内容、手动更新和清理数据库。

效果示例

https://anotherdayu.com/neodb/

另,附上我的 NeoDB主页:https://neodb.social/users/anotherdayu/,和 mastodon 账号:https://mastodon.social/@anotherdayu

参考资料

将 NeoDB 书影音记录整合到 WordPress 中

作者 Dayu
2024年12月20日 00:08

朋友们,已将该功能整合成一个WordPress插件,可直接看这篇 WordPress 插件-NeoDB Integration 书影音展示页面,更简单易用。

这两篇文章合在一起,是我第一次使用 ChatGPT 协助制作 WordPress 插件的心路历程。

NeoDB 是一个开源免费的书影音收藏社区平台,详情见:NeoDB | 书影音标记 – 豆瓣、GoodReads 和 Google Book 的替代品

本文参考 hcplantern 的 将 NeoDB 记录整合到 Hugo 中 ,实现了将 NeoDB 观影记录添加到 WordPress 页面中,展示页面:NeoDB 书影音

获取 NeoDB Bearer Token

NeoDB API Developer Console 中点击Test Access Token,并 Generate 一个 NeoDB Bearer Token,示例:Th2121_qs-8agMAlSrkE_tzBbcvjsdkjtlCtr9QHX321312312Ytzo8_YmOxjxg

在终端(Terminal)或命令提示符(Command Prompt)中输入以下代码,将 YOUR_TOKEN 替换为 NeoDB Bearer Token。

curl -H "Authorization: Bearer YOUR_TOKEN" https://neodb.social/api/me

设置 Cloudflare worker

注册 Cloudflare worker,点击 Create,创建一个 worker。

最初会展示一个 Hello World 基础案例,点击 Continue to project – Settings – Variables and Secrets。

添加一个环境变量(Environment Variables):

  • Type:text
  • Variable name:NEODB_TOKEN
  • Value:NeoDB Bearer Token,示例:H13121_qs-8agMAlSrkE_tzBbcvjsdkjtlCtr9QHX321312312Ytzo8_YmOxjxg

点击右上角的 Edit code,删除 worker.js 中全部代码,并将 hcplantern 提供的代码(如下)复制黏贴进去。

const myBearer = NEODB_TOKEN; // Assuming 'NEODB_TOKEN' is set in your Cloudflare Worker's environment variables

addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
try {
console.log(myBearer)
const url = new URL(request.url);
const category = url.pathname.substring(1);

// Optionally, handle query parameters (e.g., page number)
const page = url.searchParams.get('page') || '1';
// Available values : wishlist, progress, complete
const type = url.searchParams.get('type') || 'complete';

let dbApiUrl = `https://neodb.social/api/me/shelf/${type}?category=${category}&page=${page}`;
const response = await fetch(dbApiUrl, {
method: 'get',
headers: {
'Accept': 'application/json',
'Authorization': `Bearer ${myBearer}`
}
});

// Check if the response from the API is OK (status code 200-299)
if (!response.ok) {
throw new Error(`API returned status ${response.status}`);
}

// Optionally, modify or just forward the API's response
const data = await response.json();
return new Response(JSON.stringify(data), {
headers: { 'Content-Type': 'application/json' },
status: response.status
});

} catch (error) {
// Handle any errors that occurred during the fetch
return new Response(error.message, { status: 500 });
}
}const myBearer = NEODB_TOKEN; // Assuming 'NEODB_TOKEN' is set in your Cloudflare Worker's environment variables

addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
try {
console.log(myBearer)
const url = new URL(request.url);
const category = url.pathname.substring(1);

// Optionally, handle query parameters (e.g., page number)
const page = url.searchParams.get('page') || '1';
// Available values : wishlist, progress, complete
const type = url.searchParams.get('type') || 'complete';

let dbApiUrl = `https://neodb.social/api/me/shelf/${type}?category=${category}&page=${page}`;
const response = await fetch(dbApiUrl, {
method: 'get',
headers: {
'Accept': 'application/json',
'Authorization': `Bearer ${myBearer}`
}
});

// Check if the response from the API is OK (status code 200-299)
if (!response.ok) {
throw new Error(`API returned status ${response.status}`);
}

// Optionally, modify or just forward the API's response
const data = await response.json();
return new Response(JSON.stringify(data), {
headers: { 'Content-Type': 'application/json' },
status: response.status
});

} catch (error) {
// Handle any errors that occurred during the fetch
return new Response(error.message, { status: 500 });
}
}

然后点击 Deploy 部署即可。

注意在这一步中,需要复制保留左侧 Preview 下方的网址,示例 https://xyz-hall-ohxu.user.workers.dev/

WordPress Shortcode

在 WordPress 管理后台,导航到“外观” -> “主题编辑器”。

找到并编辑当前主题的 functions.php 文件。

将以下代码添加到 functions.php 文件中。这段代码创建了一个名为 neodb 的短代码。

注意:将代码中的 https://your-worker-url/ 替换为 Cloudflare worker 中的 https://xyz-hall-ohxu.user.workers.dev/

function neodb_shortcode($atts) {
$atts = shortcode_atts(
array(
'category' => 'book',
'type' => 'complete',
),
$atts,
'neodb'
);

$category = $atts['category'];
$type = $atts['type'];

$url = sprintf('https://your-worker-url/%s?type=%s', $category, $type);

$response = wp_remote_get($url);
if (is_wp_error($response)) {
return '数据获取失败';
}

$body = wp_remote_retrieve_body($response);
$data = json_decode($body, true);

if (empty($data['data'])) {
return '没有找到相关数据';
}

ob_start();
?>
<div class="item-gallery">
<?php foreach (array_slice($data['data'], 0, 10) as $value): ?>
<?php $item = $value['item']; ?>
<div class="item-card">
<a class="item-card-upper" href="<?php echo esc_url($item['id']); ?>" target="_blank" rel="noreferrer">
<img class="item-cover" src="<?php echo esc_url($item['cover_image_url']); ?>" alt="<?php echo esc_attr($item['display_title']); ?>">
</a>
<div class="rate">
<?php if (!empty($item['rating'])): ?>
<span><b><?php echo esc_html($item['rating']); ?></b>🌟</span>
<br>
<span class="rating-count"><?php echo esc_html($item['rating_count']); ?>人评分</span>
<?php else: ?>
<span>暂无🌟</span>
<br>
<span class="rating-count"><?php echo esc_html($item['rating_count']); ?>人评分</span>
<?php endif; ?>
</div>
<h3 class="item-title"><?php echo esc_html($item['display_title']); ?></h3>
</div>
<?php endforeach; ?>
</div>
<style>
.item-gallery {
display: flex;
padding: 0 1rem;
overflow-x: scroll;
align-items: baseline;
}
.item-card {
display: flex;
flex-direction: column;
flex: 0 0 17%;
margin: 0 0.5rem 1rem;
border-radius: 5px;
transition: transform 0.2s;
width: 8rem;
}
.item-card:hover {
transform: translateY(-5px);
}
.rate {
text-align: center;
}
.rating-count {
font-size: 0.8rem;
color: grey;
}
.item-cover {
width: 100%;
min-height: 3rem;
border: 2px solid transparent;
}
.item-title {
font-size: 1rem;
text-align: center;
margin: 0;
}
</style>
<?php
return ob_get_clean();
}
add_shortcode('neodb', 'neodb_shortcode');

使用代码

在 WordPress 页面或文章中,使用以下短代码来显示数据:

CleanShot 2024-12-20 at 00.09.10@2x.png

book 可以替换为 movie, tv, podcast, music, game, performance,展示更多数据。

type 可选 wishlist 和 complete,展示想看和看过的内容。

效果示例:https://anotherdayu.com/neodb/

CleanShot 2024-12-19 at 23.56.56@2x.png

另,附上我的 NeoDB主页:https://neodb.social/users/anotherdayu/,和 mastodon 账号:https://mastodon.social/@anotherdayu

目前使用的自托管服务

作者 Dayu
2024年12月6日 09:52

趁着黑五,新购置了配置高些的 VPS。折腾一番后,整理了目前自托管的服务。

第一个 VPS (Bandwagon)托管了 2 个项目 wordpress(建站) 和 Umami(数据统计),保持全球稳定的线路,和博客的稳定性:

第二个 VPS(Racknerd) 托管了 11 个项目:

  • Freshrss,RSS 阅读器,目前还安装了两个扩展:TranslateTitlesCN(谷歌翻译标题) 和 Auto Refresh(自动刷新)。日常我会使用 Reeder 登录 freshrss 账号阅读。Freshrss 因是网页端的,所以也很适合配合 immersive translate 使用。
  • wewe-rss,生成微信公众号订阅源,实际使用还挺稳定的,最后订阅了 27 个微信公众号。
  • rsshub,为其他网站生成RSS源,自建的更稳定些。
  • RSS-Bridge,订阅部分 rsshub 无法订阅的内容。本想用来订阅 instagram,但不稳定。不过功能确实挺强,便留下观察。与rsshub有很多互补之处,比如 rsshub 如果要订阅 telegram channel 比较复杂,RSS-Bridge 目前则比较简单。经费充裕的话,可以尝试 thefeedreaderbot,使用 webshare 的动态代理 ip,能够躲过 Block.
  • AdGuardHome,DNS 去广告服务,配合浏览器插件uBlock Origin,效果很好。
  • n8n,工作流自动化平台。
  • calibre-web,在线电子书库管理系统。
  • laber,跨越付费墙。
  • FileCodeBox,文件分享。
  • qBittorrent Web UI,BT 下载客户端的 Web 界面,可以远程管理和控制BT下载任务。
  • NextChat,以前叫 ChatGPT-Next-Web,ChatGPT 网页端界面,专门部署给家人使用。

更多自部署软件可参考:awesome-selfhostedTop 3 BEST applications you’ve decided to self-host? 。想轻量级省心的可以试试 YunoHost

个人倾向于将关键的非隐私类文件托管于信誉较好的大平台,如 Dropbox 和 1Password,所以没有使用自托管云盘和密码软件。

Calibre-web 数据库路径和下载权限 500 Internal Server Error 问题

作者 Dayu
2024年11月25日 14:23

最近用 Docker 搭建了 Calibre-Web(书籍管理阅读平台),出现了一些问题,以下是解决方案。

Calibre 数据库路径

先是进入网页界面中,需要填写 Calibre 数据库路径,该路径需要进入 Docker 容器内部,创建数据库,并添加写入权限。

先查看容器内目录结构,并进入 bin。

docker exec -it calibre-web sh

ls /

cd bin

创建一个空的数据库。

calibredb add --empty --with-library /books

如果上面的命令成功,则设置正确的权限。

chmod -R 777 /books

初始化数据库。

calibredb add --empty --with-library /books

退出容器。

exit

OPDS

支持 OPDS 的阅读器,能更方便的下载和阅读 Calibre-web 中的书籍。

OPDS link 的正确格式是:http(s)://username:password@ip/hostname:port/opds

ip/hostname:port,也可以是网站域名。

iOS 中推荐 Cantook

CleanShot 2024-11-25 at 14.15.29@2x.png

下载权限问题

在绑定 OPDS 阅读器的时候,我发现无法正常下载书籍,网页版也有相同问题,但仍可以阅读。报错:500 Internal Server Error。

这部分报错是比较新的问题,在 Github issue 中找到了解决方案。与 PUID/PGID 相关,应使用运行 Docker 的用户的 ID,这样可以确保容器内外的权限一致。

重新回到 docker-compose.yml 中,将这两者都设为 1000,再重启 docker 即可解决。

services:  
  calibre-web:    
    environment:      
      - PUID=1000      
      - PGID=1000

2024年的付费墙

作者 Dayu
2024年11月25日 11:55

免责声明:本文仅用于教育目的。作者不认可或鼓励任何不道德或非法活动。使用此工具的风险由您自行承担。

12ft 是一个帮助用户绕过在线付费墙的插件,2023年被投诉下线之后,这些可以作为替代品:

考虑到工具的稳定性和长期性,我日常使用的是 Webpage archive 、自托管的 Ladder 和 Ublock origin(Firefox版)。

目前使用的 WordPress 插件

作者 Dayu
2024年11月24日 15:59

以下是我目前使用的WordPress插件,共 11 个:

  • UpdraftPlus,核心备份插件,免费版支持定期备份到 Google Drive。近期迁移了一次,安装好WordPress和该插件,再关联一下 Google 账号即可备份成功,体验很好。
  • Blocksy 主题 + 插件,目前在使用的主题,免费版够用,可自定义选项多,颜值高。
  • Polylang,多语言插件,免费版功能齐全,中英文界面可同时 SEO 索引,增强博客覆盖面。
  • Antispam Bee,屏蔽广告评论。
  • Post SMTP,邮件发送插件,更简单的配置 SMTP。
  • Wenprise Better Emails,提供邮件模板,美化邮件。
  • WP Super Cache,网站缓存插件,提升网站加载速度。
  • WPS Hide Login,安全插件,可以自定义WordPress登录页面URL。
  • Rank Math SEO,SEO 优化插件,增强搜索引擎可见度。
  • Meow Gallery,图片画廊插件。
  • Juicer,社交媒体聚合插件,能为国内用户展示 Twitter 时间线。

目前已有足够的舒适度,之后会偏重稳定性,于是关闭了插件和主题的自动更新。除了安全性更新,尽量不动。

除了 Blocksy,都用的免费版。但 Blocksy 其实也没用到几个付费功能,只是比较喜欢,且长期使用,支持一下。

在 Jack 的帮助下,最近管理面板换成了 1Panel,舒适度比 AMH 要高一些,操作也更简单。

截图留念!

CleanShot 2024-11-24 at 15.52.48@2x.png

多语言博客WordPress 插件 Polylang

作者 Dayu
2024年11月17日 22:48

我对多语言博客 WordPress 插件有以下几个需求:

  • 保持长期更新;
  • 免费或者不贵的买断制;
  • 中英文界面可同时 SEO 索引;
  • 操作简单易于多语言用户理解;
  • 中英文 RSS Feed 可以分开。

尝试多款插件之后,决定使用 Polylang,需求都能满足,且免费功能就够用。虽然内容需要自己翻译,但我也不是每篇都想翻译成英文,且借助 ChatGPT 并不费劲。

Pro 版(99欧元)可以和 DeepL 深度整合,并支持更多自定义功能。

基础设置跟着 Setup 流程即可。之后每翻译一篇,就会在英文界面展示一篇。

设置完成后的效果:https://anotherdayu.com/en/

戴尔显示屏(U2720QM)屏闪问题

作者 Dayu
2024年11月16日 16:21

目前我使用的显示屏是 Dell U2720QM,偶尔有屏闪问题(4 年间出现过 3 次)。

过去一直以为是电压不稳或接触不良,关机一段时间重启就好了,但昨晚反复重启多次也没有恢复。

于是查了些资料,发现屏闪似乎是 Apple M 系列芯片的通病,尤其是 M1 和 M2 芯片,且 BenQ 也会出现该问题。

解决方法千奇百怪,大家各有各的道理:

  • 弃用 Type-C,改用 HDMI;
  • 关闭 freesync;
  • 关闭 True Tone 和 Auto Adjust Brightness;
  • 使用 Colour LCD 色彩文件;
  • 下载 Dell Display and Peripheral Manager Application(可能是我的显示器太旧了,该软件不适配);
  • 将分辨率锁定为60;
  • 等等。

这些方法都不适用于我的情况。最终激活显示器硬件设置中的 LCD Conditioning 后,解决了屏闪问题。

另外,也有网友表示开源软件 aiaf/Stillcolor 可以通过禁用时间抖动(Temporal Dithering)永久解决该问题,我目前已安装,有备无患。

向国内用户展示Twitter X和Instagram-WordPress插件

作者 Dayu
2024年11月16日 15:07

Twitter 在 WordPress 上的常规展示方式是 嵌入时间轴,缺点是仍基于 Twitter 数据库,所以国内用户无法查看。

近期我使用的是 juicer.io,这个网站可以将 Twitter、instagram、RSS 等时间轴聚合,展示在一个网页中。

而且支持 WordPress 插件,将嵌入时间轴。优点是经过 juicer.io 的转存后,国内用户也能访问该页面:https://anotherdayu.com/timeline/

小遗憾是数据没有储存在本地,所以无法进行 SEO 索引。胜在轻量级,不折腾,

CleanShot 2024-11-16 at 09.44.35@2x.png

流程如下:


另外,昨天和评论尸交流了一下,他开发的插件可以通过 RSS 为 WordPress 载入即刻的时间轴,并且有可能为 twitter 实现类似的效果。因为是通过 RSS 实现的,数据会保存在服务器中,并可以被 SEO 索引。

目前还在测试阶段,感兴趣的朋友可以关注他的 Twitter :@JeffreyCalm ,跟踪项目进展。

公告:网站被攻击了

作者 Dayu
2024年11月5日 13:42

今早起床发现博客网站宕机了,最初以为是小 bug,就重启了服务器。

网站加载速度依旧很慢,艰难的进入了控制面板。记录显示从昨晚 11点 左右开始服务器 CPU 满载,且提示已开启 CSRF 攻击防护。CSRF(Cross-Site Request Forgery)的中文名为跨站请求伪造,是一种常见的 web 安全攻击方式。

在群友的建议下,开启了 Cloudflare 代理服务(橙色小云)。没立即见效。然后开启了 Cloudflare 五秒盾(Security—settings—Security Level —I’m Under Attack!),并再次重启服务器,能够勉强进入博客页面,但 CPU 依旧满载。

半小时后,安装了 fail2ban,依旧没有缓解问题。

有些头疼,就干了会其他工作,再回来看,网站已恢复正常。回顾之前的操作,已经搞不清楚是哪步起了作用,也可能是 DNS 服务生效比较慢,生效后就解决问题了。

又或是攻击者觉得累了,恰好暂停攻击,让我喘口气。

无论是哪种,都让我有些心有余悸。

我选用的服务器网络比较好,兼容外网和国内网络,所以溢价较高。如果一直使用 Cloudflare 代理,可以增加稳定性,但抹去了这些优势。

陷入了两难的境地。

听朋友说 1panel 自带了防火墙(ModSecurity),易用性高一些,之后考虑试一试。

最后,感谢群友们的帮助。

并求求别攻击我这个小博客了。

telegram-cloud-photo-size-5-6145471324785590530-y.jpg

记录一下:

11月05日,被攻击第1次。

11月11日,被攻击第2次。

11月12日,被攻击第3次。

11月13日,被攻击第4次。

朋友们,如果访问不了我的网站,记得提醒我一下。

Apple Watch Terminal 风格表盘

作者 Dayu
2024年5月13日 20:57

最近网上冲浪的时候关注到了 TermiWatch,这是一个 Terminal 风格 Apple watch 表盘的软件。看上去非常不错,但这个项目最后维护时间是 19 年,且配置较复杂,我尝试了一下,确实如 Github issue 中大家反馈的已经无法正常使用。

之后找到了 Drag0nV3n0m231 在 reddit 上分享的方案,该方法基于 Clockology(第三方表盘软件),流程简单,且可以自己添加和设计内容。

不过,在 Clockology 中使用 Weather 模块需要付费。

于是我基于他的风格,重新改了一个版本(如下图所示),删除了需要付费解锁的内容,添加了最大摄氧量信息(Vo2max)。

VO2 Max(最大摄氧量)是指人体在剧烈运动时单位时间内吸收利用氧气的最大值,反映心肺功能和耐力运动能力。25-30 岁健康男性应在 40-50 ml/kg/min 之间。我最近生活不规律,所以 VO2 Max 低于健康区间,平时可以加强有氧锻炼如慢跑、游泳等,提升心肺功能。

下图是我现在使用的界面。
IMG_8837.jpeg

安装设置

App store 中安装 Clockology 软件,并打开,第一次启动会加载一段时间。打开 iOS 上的 watch 软件,在 Apple watch 上安装 Clockology。

点击 Clockology 设置中的权限管理,允许健康权限。

Watch 软件 – General – Return to clock,在 Clockology 的设置中选择自定义(After 1 hour)。另外,通用设置中的后台 app 刷新要开启。

CleanShot 2024-05-13 at 20.21.52@2x.png

GIthub 中下载:DigitalTerminal.clock2_EnableBeta.clock,并将这两个文件发送到手机中。

_EnableBeta.clock 保存到 iOS 本地文件中的 Clockology 文件夹中,然后点击该文件,即可启动 Clockology 的 beta 版本。

回到 Clockology,点击 Workspace,选择 Import,在本地中找到刚刚下载的 DigitalTerminal.clock2

点击刚刚安装的表盘,Apple watch 上也打开 Clockology,点击下图中的 Sync 即同步。然后,手表上即可显示新表盘。

其中,VO2M 是 VO2 Max(最大摄氧量),BATT 是电池电量,RING 是 Apple Health 的 Fintness 圆环,STEP 是每日步数,HTRT 是心跳。
CleanShot 2024-05-13 at 20.39.00@2x.png

表盘上的每个内容都可以自定义,Layer Settings 中可以调整图层的位置。

这个表盘虽好,但不如官方表盘稳定,希望未来苹果可以对自定义表盘更开放。

我平时常用的以下三个表盘,最喜欢的是 Aritst,美术风格很简约。每点一下屏幕,表盘上就会换一张人脸,适合发呆走神的时候玩一会。

如果想使用天气信息,可以尝试 gianlishun 的 Terminal Watch Widget 项目。去年才维护过,应该能正常使用,但配置流程比较复杂。

IMG_8849.jpg

有朋友对 Infograph 这个表盘比较感兴趣,这里也简单介绍一下:

  • 先在 watch 软件的 Clock 选项中,将 Monogram 设置为 (这个苹果 Logo 需要复制过去);
  • 选择 Ingograph(图文)表盘,然后将所有的 Complications(复杂功能)设置为 Off;
  • 仅启用 Sub-dial Top,设置为 Monogram(这个选项只有在第一步设置完成后才会出现)。

❌
❌