使用Telegram订阅Pixiv新图的便捷方法

作为一名艺术爱好者,时刻关注Pixiv上画师的最新作品是非常重要的。然而,每天手动检查新图既费时又费力。有没有一种更便捷的方式,能够自动推送这些喜欢的图片,让每一幅作品都能展现其光彩呢?

RSS订阅与Telegram推送的结合

联想到常用的资讯订阅方式RSS,我正好在RSSHub的文档中发现了Pixiv关注画师新图的订阅接口。然而,仅仅使用RSS订阅并不方便,还需要一个单独的阅读器。于是,我决定将这些资讯直接推送至通讯工具Telegram上。

之前,我使用基于IFTTT的解决方案,将RSSHub生成的内容推送至Telegram频道。但随着IFTTT的使用策略更改,非付费用户只能创建三个小程序(Applet),我不得不放弃了这个方案。作为一名开发者,被商业平台束缚了手脚并不理想,于是决定自己编写一个功能类似的处理工具。这不仅能锻炼代码能力,还能拥有更高的自定义能力。

开发与部署

第一步:RSS采集

首先进行RSS的采集工作。为了避免手动分析XML文件的繁琐,我直接使用了一个现成的组件:rss-parser。这个组件能获取RSS资讯,并将其转化为一个对象,方便后续处理。

bash
npm i rss-parser –save

使用完成后的传参调用方式也非常简洁明快。测试时可以将获取的feed信息输出,以RSSHub生成的数据为例,我们发现其内部是一个对象数组,因而可以直接使用相关的字段进行内容处理。

第二步:数据处理

由于RSSHub设计的初衷是为了方便阅读,生成的内容格式以方便阅读为主,并使用了pixiv.cat的图片传递接口。不过,获取的内容中包含我们需要的所有信息,因而可以使用一个正则表达式来提取。

javascript
const picIdReg = /https:\/\/pixiv.cat\/(\d+)-?(\d+)?.(jpg|png|gif)/gi;

可以配合这条正则表达式,直接生成内容数组:

javascript
const artworks = […item.content.matchAll(picIdReg)];

对于单图的输入,我们能得到形如这样的输出:

javascript

Array [“”, “ArtworkID“, “1”, “jpg”]
Array [“”, “ArtworkID“, “2”, “jpg”]
Array [“”, “ArtworkID“, “3”, “jpg”]

考虑到Telegram对图片大小的限制,选择使用预览图发送,使用完整图下载的方案。通过查看Pixiv前端页面的源码,不难发现预览图的地址是由前缀、发布时间(UTC+9)、作品ID和一些固定组合搭配而成。发布时间可以由RSS item中的isoDate来手动计算获取,我们可以写一个整合表达式来完成预览图地址的装配工作。

第三步:消息发送

之前使用IFTTT时,直接推送订阅内容让Telegram自动获取,导致大图片(≥5MB)无法有效获取、图片缓存请求限制等问题。此次我们加入请求缓冲队列和预览图片,尝试解决以上问题。

本来打算使用Telegraf作为推送框架,但发现只需要一个请求信息,所以直接使用got进行POST请求的发送。根据Telegram的Bot API文档,可以整理出如下的请求样式:

javascript
const apiBaseUrl = https://api.telegram.org/bot${confData.bot.token};

got(‘sendPhoto’, {
method: ‘POST’,
prefixUrl: apiBaseUrl,
json: {
chat_id: confData.bot.chat,
photo: picItem.preview,
caption: picItem.text,
reply_markup: {
inline_keyboard: [
[{
text: ‘🌏’,
url: picItem.url
}, {
text: ‘⤵’,
url: picItem.pic
}]
]
}
}
});

直接调用Telegram的sendPhoto发送图片接口来发送请求数据,其中加入了消息下的内联小键盘inline_keyboard,为提供图片的原始链接按钮和直接下载按钮,以方便用户的操作。Bot API Token可以向@BotFather申请,Chat ID可以使用@频道名,而不必纠结于一长串的频道ID。

为了避免每次启动会将所有的图片加入队列等待发送,同时考虑到这个项目提供的所有数据都是按照时间进行排序的,因而维护一个timestamp,初始化为当前时间,每次将待发送的图片时间中记录最晚值,之后查询时仅发送更新的内容并更新时间戳标记即可。

为了进一步为用户提供方便,加入了js-yaml组件来读取yml配置文件。并综合以上内容,最终整合的版本,已经发布到了Github上的PhanDream仓库中;您可以使用诸如pm2等方式进行运行:

bash
pm2 start bot.js –name phandream

当一切准备完成后,过一会就能发现频道中出现新的图片啦~

👉 野卡 | 一分钟注册,轻松订阅海外线上服务

上一篇 2025年3月22日
下一篇 2025年3月22日

热门推荐