增加upstash redis的支持,并修复一些bug (#45)
* 韩剧tv增加分类类型 * claw部署修改为不稳定不推荐 * 修复vod中集标题可能重复的问题,将后面出现的相同集标题的episode过滤,只对match自动匹配接口有效 * 修复360综艺集标题命名规范与vod不一致的问题 * 360综艺集可能存在乱序的情况,获取集后尝试进行排序 * 修改vod默认源为https://gctf.tfdh.top * 增加upstash redis支持,用于持久化存储,不会因为冷启动而丢失过去的查询信息(在cf/eo/claw上配置后应该能更稳定点,但会稍微影响请求速度) * 修复vod和vod2如果url重复导致vod2中episodes不全的问题 * 支持记住之前搜索title时手动选择的anime,并在后续的match自动匹配时优选该anime【实验性】 修复home页面json中episodeTitleFilter实际存在值但没有打印的问题 * commentId增加lastSelectMap上传redis * 过滤favicon.ico请求的redis请求
This commit is contained in:
1 parent
7f1bd8b6bb
commit
bc320de259
3 files changed
+477
-154
No files matched your search
@@ -37,6 +37,7 @@ LogVar 弹幕 API 服务器
|
||||
- `GET /api/logs`:获取最近的日志(最多 500 行,格式为 `[时间戳] 级别: 消息`)。
|
||||
- **日志记录**:捕获 `console.log`(info 级别)和 `console.error`(error 级别),JSON 内容格式化输出。
|
||||
- **部署支持**:支持本地运行、Docker 容器化、Vercel 一键部署、Cloudflare 一键部署和 Docker 一键启动。
|
||||
- **手动选择记忆**:支持记住之前搜索title时手动选择的anime,并在后续的match自动匹配时优选该anime【实验性】。
|
||||
|
||||
## 前置条件
|
||||
- Node.js(v18.0.0 或更高版本;理论兼容更低版本,请自行测试)
|
||||
@@ -172,7 +173,9 @@ LogVar 弹幕 API 服务器
|
||||
>
|
||||
<img src="https://i.mji.rip/2025/09/17/3a675876dabb92e4ce45c10d543ce66b.png" style="width:400px" />
|
||||
|
||||
> 如果访问遇到404等问题,可能是edgeone pages修改了访问策略,每次接口请求都转发到了新的环境,没有缓存,导致获取不到对应的弹幕,推荐用vercel部署。
|
||||
> 如果每次访问都遇到404等问题,可能是edgeone pages修改了访问策略,每次接口请求都转发到了新的环境,没有缓存,导致获取不到对应的弹幕,推荐用vercel部署。
|
||||
>
|
||||
> 解决方法:请配置环境变量`UPSTASH_REDIS_REST_URL`和`UPSTASH_REDIS_REST_TOKEN`,开启upstash redis存储
|
||||
|
||||
## 部署到 Cloudflare
|
||||
|
||||
@@ -221,20 +224,22 @@ LogVar 弹幕 API 服务器
|
||||
| ----------- | ----------- |
|
||||
| TOKEN | 【可选】自定义用户token,不填默认为`87654321` |
|
||||
| OTHER_SERVER | 【可选】兜底第三方弹幕服务器,不填默认为`https://api.danmu.icu` |
|
||||
| VOD_SERVER | 【可选】vod查询站点,不填默认为`https://www.caiji.cyou` |
|
||||
| VOD_SERVER2 | 【可选】vod2查询站点,如果想开启vod2源,请先填写VOD_SERVER2源地址,如`https://zy.xmm.hk`,并在SOURCE_ORDER环境变量中增加`vod2` |
|
||||
| VOD_SERVER | 【可选】vod查询站点,不填默认为`https://gctf.tfdh.top` |
|
||||
| VOD_SERVER2 | 【可选】vod2查询站点,如果想开启vod2源,请先填写VOD_SERVER2源地址,如`https://www.caiji.cyou`、`https://zy.xmm.hk`,并在SOURCE_ORDER环境变量中增加`vod2` |
|
||||
| BILIBILI_COOKIE | 【可选】b站cookie(填入后能抓取完整弹幕),如 `buvid3=E2BCA ... eao6; theme-avatar-tip-show=SHOWED`,请自行通过浏览器或抓包工具抓取,热心网友测试后,实际最少只需取 `SESSDATA=xxxx` 字段 |
|
||||
| YOUKU_CONCURRENCY | 【可选】youku弹幕请求并发数,用于加快youku弹幕请求速度,不填默认为`8`,最高`16` |
|
||||
| SOURCE_ORDER | 【可选】源排序,用于按源对返回资源的排序(注意:先后顺序会影响自动匹配最终的返回),默认是`vod,360,renren,hanjutv`,表示vod数据排在最前,hanjutv数据排在最后,示例:`360,renren`:只返回360数据和renren数据,且360数据靠前;当前可选择的源字段有 `vod,vod2,360,renren,hanjutv,bahamut` |
|
||||
| PLATFORM_ORDER | 【可选】自动匹配优选平台,按顺序优先返回指定平台弹幕,默认为空,即返回第一个满足条件的平台,示例:`bilibili1,qq`,表示如果有b站的播放源,则优先返回b站的弹幕,否则就返回腾讯的弹幕,两者都没有,则返回第一个满足条件的平台;当前可选择的平台字段有 `qiyi, bilibili1, imgo, youku, qq, renren, hanjutv, bahamut` |
|
||||
| EPISODE_TITLE_FILTER | 【可选】剧集标题正则过滤,按正则关键字对剧集或综艺的集标题进行过滤,适用于过滤一些预告或综艺非正式集,默认值如下 |
|
||||
| EPISODE_TITLE_FILTER | 【可选】剧集标题正则过滤,按正则关键字对剧集或综艺的集标题进行过滤,适用于过滤一些预告或综艺非正式集,只支持match自动匹配,默认值如下 |
|
||||
| BLOCKED_WORDS | 【可选】弹幕屏蔽词列表,默认为空,示例如下 |
|
||||
| GROUP_MINUTE | 【可选】合并去重分钟数,表示按n分钟分组后对弹幕合并去重,默认为1,最大值为30,0表示不去重 |
|
||||
| PROXY_URL | 【可选】代理地址,示例: `http://127.0.0.1:7897` ,目前只对巴哈姆特生效(注意:如果巴哈姆特请求不通,会拖慢搜索返回速度,所以除vercel/cloudflare之外默认不开启bahamut源,开启请先在SOURCE_ORDER环境变量中添加`bahamut`)如果你使用docker部署并且访问不了bahamut源,请配置代理地址;vercel/cf中理应都自然能联通,不用填写 |
|
||||
| UPSTASH_REDIS_REST_URL | 【可选】update redis url,需配合UPSTASH_REDIS_REST_TOKEN使用,用于持久化存储,不会因为冷启动而丢失过去的查询信息(在cf/eo/claw上配置后应该能更稳定点,但会稍微影响请求速度),获取方法请参考:`https://cloud.tencent.cn/developer/article/2424508` |
|
||||
| UPSTASH_REDIS_REST_TOKEN | 【可选】update redis token,需配合UPSTASH_REDIS_REST_URL使用,用于持久化存储,不会因为冷启动而丢失过去的查询信息(在cf/eo/claw上配置后应该能更稳定点,但会稍微影响请求速度),获取方法请参考:`https://cloud.tencent.cn/developer/article/2424508` |
|
||||
|
||||
```regex
|
||||
# EPISODE_TITLE_FILTER 默认值
|
||||
(特别|惊喜|纳凉)?企划|合伙人手记|超前|速览|vlog|reaction|纯享|加更|抢先|抢鲜|预告|花絮|特辑|彩蛋|专访|幕后|直播|未播|衍生|番外|会员|片花|精华|看点|速看|解读|影评|解说|吐槽|盘点|拍摄花絮|制作花絮|幕后花絮|未播花絮|独家花絮|花絮特辑|先导预告|终极预告|正式预告|官方预告|彩蛋片段|删减片段|未播片段|番外彩蛋|精彩片段|精彩看点|精彩回顾|精彩集锦|看点解析|看点预告|NG镜头|NG花絮|番外篇|番外特辑|制作特辑|拍摄特辑|幕后特辑|导演特辑|演员特辑|片尾曲|插曲|主题曲|背景音乐|OST|音乐MV|歌曲MV|前季回顾|剧情回顾|往期回顾|内容总结|剧情盘点|精选合集|剪辑合集|混剪视频|独家专访|演员访谈|导演访谈|主创访谈|媒体采访|发布会采访|抢先看|抢先版|试看版|短剧|精编|会员版|Plus|独家版|特别版|短片|合唱|陪看|MV|高清正片|发布会|.{2,}篇|观察室|上班那点事儿|周top|赛段|直拍|REACTION|VLOG|全纪录|开播|先导|总宣|展演
|
||||
(特别|惊喜|纳凉)?企划|合伙人手记|超前|速览|vlog|reaction|纯享|加更|抢先|抢鲜|预告|花絮|特辑|彩蛋|专访|幕后|直播|未播|衍生|番外|会员|片花|精华|看点|速看|解读|影评|解说|吐槽|盘点|拍摄花絮|制作花絮|幕后花絮|未播花絮|独家花絮|花絮特辑|先导预告|终极预告|正式预告|官方预告|彩蛋片段|删减片段|未播片段|番外彩蛋|精彩片段|精彩看点|精彩回顾|精彩集锦|看点解析|看点预告|NG镜头|NG镜头|NG花絮|番外篇|番外特辑|制作特辑|拍摄特辑|幕后特辑|导演特辑|演员特辑|片尾曲|插曲|高光回顾|背景音乐|OST|音乐MV|歌曲MV|前季回顾|剧情回顾|往期回顾|内容总结|剧情盘点|精选合集|剪辑合集|混剪视频|独家专访|演员访谈|导演访谈|主创访谈|媒体采访|发布会采访|抢先看|抢先版|试看版|短剧|精编|会员版|Plus|独家版|特别版|短片|陪看|高清正片|发布会|.{2,}篇|(?!.*(入局|破冰局|做局)).{2,}局|观察室|上班那点事儿|周top|赛段|直拍|REACTION|VLOG|全纪录|开播|先导|总宣|展演|集锦|旅行日记
|
||||
|
||||
# 如果你想新增过滤词,请自定义EPISODE_TITLE_FILTER,示例如下,每个词用'|'隔开,增加的词都会追加到默认值后面
|
||||
测试|test
|
||||
@@ -297,7 +302,7 @@ danmu_api/
|
||||
- cloudflare貌似被哔风控了。
|
||||
- 如果想更换兜底第三方弹幕服务器,请添加环境变量`OTHER_SERVER`,示例`https://api.danmu.icu`。
|
||||
- 如果想更换vod站点,请添加环境变量`VOD_SERVER`,示例`https://www.caiji.cyou`。
|
||||
- 推荐vercel和claw部署,cloudflare/edgeone不稳定,当然最稳定还是自己本地docker部署最佳。
|
||||
- 推荐vercel部署,cloudflare/edgeone/claw不稳定,当然最稳定还是自己本地docker部署最佳。
|
||||
- /api/v2/comment接口1分钟内同一IP只能请求三次。
|
||||
|
||||
### 关联项目
|
||||
|
||||
+443
-147
File diff suppressed because it is too large.
Load diff
@@ -3,7 +3,8 @@ const assert = require('node:assert').strict;
|
||||
const { handleRequest, searchAnime, matchAnime, searchEpisode, getBangumi, getComment, fetchTencentVideo, fetchIqiyi,
|
||||
fetchMangoTV, fetchBilibili, fetchYouku, fetchOtherServer, httpGet, httpPost,
|
||||
hanjutvSearch, getHanjutvEpisodes, getHanjutvComments, getHanjutvDetail,
|
||||
bahamutSearch, getBahamutEpisodes, getBahamutComments} = require('./worker');
|
||||
bahamutSearch, getBahamutEpisodes, getBahamutComments, pingRedis, getRedisKey,
|
||||
setRedisKey, setRedisKeyWithExpiry} = require('./worker');
|
||||
|
||||
// Mock Request class for testing
|
||||
class MockRequest {
|
||||
@@ -189,4 +190,25 @@ test('worker.js API endpoints', async (t) => {
|
||||
// assert.equal(res.status, 200);
|
||||
// assert.deepEqual(responseBody.success, true);
|
||||
// });
|
||||
|
||||
// 测试upstash redis
|
||||
// await t.test('GET redis pingRedis', async () => {
|
||||
// const res = await pingRedis();
|
||||
// assert(res.result === "PONG", `Expected res.result === "PONG", but got ${res.result}`);
|
||||
// });
|
||||
|
||||
// await t.test('SET redis setRedisKey', async () => {
|
||||
// const res = await setRedisKey('mykey', 'Hello World');
|
||||
// assert(res.result === "OK", `Expected res.result === "OK", but got ${res.result}`);
|
||||
// });
|
||||
|
||||
// await t.test('GET redis getRedisKey', async () => {
|
||||
// const res = await getRedisKey('mykey');
|
||||
// assert(res.result.toString() === "\"Hello World\"", `Expected res.result === "\"Hello World\"", but got ${res.result}`);
|
||||
// });
|
||||
|
||||
// await t.test('SET redis setRedisKeyWithExpiry', async () => {
|
||||
// const res = await setRedisKeyWithExpiry('expkey', 'Temporary Value', 10);
|
||||
// assert(res.result === "OK", `Expected res.result === "OK", but got ${res.result}`);
|
||||
// });
|
||||
});
|
||||
Reference in new issue
Block a user