在赛博空间主动分心——从RSS订阅到每日焕新的图片Widget
本篇Newsletter,我会分享如何定制自动更新图库的Widget插件,适用于iOS和macOS。本篇文章是创造过程的分享,以及结尾一点延伸思考,偏向实操。遇到枯燥或看不明白的部分,不妨跳过,不碍事。
缘起
我有关注一些Instagram的时尚博主,为了让内容消费更加自主,我订阅了RSS.APP的服务,将Instagram的关注,转换成了RSS订阅的URL,而且每天可以定时收到一封汇总的邮件。
随着时间推移,我发现主动打开邮件查看日报还是麻烦。为此,我打算定制一个可以自动更新的图片Widget。这样以来,可以把Widget放在iPhone或者Mac的桌面,我有空随时可以看两眼图片,岂不美哉?
准备
我们先总览需要用到的服务或者工具,我画了一张图供参考。
简单说,就是用RSS的订阅链接驱动,用Shortcuts(快捷指令)定期下载图片,这样,Photo Widget就可以持续展示最新的Instagram图片。
我会拆解成分四步,一步一步分享具体操作过程,感兴趣的朋友不妨一读。
步骤一:RSS.APP转换Instagram为RSS
鉴于我没有找到Instagram免费抓取图片的好方案,我选择了方便易用的RSS.APP,需要付费使用。它可以把很多难以抓取的网站,都转换成RSS订阅链接,比如X和Instagram。而且,RSS结果的图片链接,可以用于下载而不会出现权限问题。如果是RSSHub抓取Instagram,我遇到了图片权限问题。
如果所示,只需要把想订阅的Instagram的用户链接粘贴,然后点击Generate,就可以很快生成RSS链接。下图展示Louis Vuitton的Instagram转换之后的效果,只需要点击COPY按钮,就可以复制生成好的RSS链接。
步骤二:用Node解析RSS中的图片链接
为了提取RSS的链接,我特地写了一个简单的Node接口,解析RSS返回结果并把图片保存到数组返回。或许你会问,为什么要这么复杂呢?快捷指令是否可以直接处理?
快捷指令的确可以直接实现,我列出来供大家参考。问题在于,用快捷方式解析,不可控,偶尔会出现图片遗漏的情况。而自己写解析图片链接的代码,就不再是黑盒,也可以解析获取所有RSS中的图片。
解析的代码比较简单,我也顺便让GPT生成了代码注释:
const axios = require('axios');
const Parser = require('rss-parser');
const parser = new Parser();
/**
* 这个函数从给定的 RSS 源 URL 中提取所有图片的 URL。
*
* @param {string} url - RSS 源的 URL
* @returns {Promise<string[]>} - 包含所有提取到的图片 URL 的数组
*/
async function fetchRSSImages(url) {
try {
const response = await axios.get(url);
const feed = await parser.parseString(response.data);
const images = feed.items.map(item => {
// 解析图片URL,假设图片URL在item的content中以<img src="URL">的形式出现
const imgRegex = /<img[^>]+src="([^">]+)"/;
const match = item.content.match(imgRegex);
return match ? match[1] : null;
}).filter(url => url != null);
return images;
} catch (error) {
console.error('Error fetching or parsing RSS feed:', error);
return [];
}
}
module.exports = fetchRSSImages;
最后会暴露一个接口,写在项目的API
文件夹,用于实际调用:
const fetchRSSImages = require('../src/utils/parser');
module.exports = async (req, res) => {
// 检查请求中是否包含url参数,如果没有则返回400状态码和错误信息
if (!req.query.url) {
return res.status(400).json({ error: 'URL parameter is required' });
}
try {
// 调用fetchRSSImages函数获取图片列表
const images = await fetchRSSImages(req.query.url);
// 返回200状态码和图片列表
res.status(200).json(images);
} catch (error) {
// 捕获并记录错误信息,返回500状态码和错误信息
console.error('Error in API endpoint:', error);
res.status(500).json({ error: 'Internal Server Error' });
}
};
最后项目部署到Vercel平台,就可以通过在链接中带上需要解析的RSS链接,获得解析好的图片数组。不熟悉Vercel的朋友,简单理解其为部署代码项目的平台即可。
步骤三:快捷指令请求接口和下载图片
接下来,用快捷指令下载图片到相册就好。相册需要提前创建好,以便在快捷指令配置。
步骤四:下载Photo Widget应用展示图片
之所以没有用系统自带的Photos应用的Widget,是因为其配置不够,比如图片切换间隔时间无法配置。经过搜索,我发现Photo Widget这款应用,就刚好满足我的要求,iOS和M系列处理器的Mac都支持。Photo Widget完全免费。
我们简单看看Photo Widget软件的配置,还有其Widget的配置项:
看看Photo Widget的Mac桌面效果:
看看Photo Widget的iPhone桌面效果:
除了使用Widget之外,还有一种方法可以消费下载好的图片,是通过锁屏播放图片的方式。Mac可以在Screen Saver中配置,iPhone可以在Wallpaper中设置,均可设置随机播放某个相册的图片。
结尾
在信息世界,只要稍微放弃主动权,就容易被算法裹挟。我想,哪怕是分心,也值得重视。我们总可以找到办法,用自己更喜欢的方式消费信息,甚至把控信息源。用RSS管理信息源,再用Widget消费图片,让我的分心变得主动。这就是我的主动分心实践。
如果你喜欢这篇文章,请分享给你最喜欢的朋友。我们下篇见。
订阅我,可以激励你勇于分享。
我在持续分享不成熟的思考。
我写学习,思考,品味相关的文章。
如有更新,早八点发布。