diff --git a/.github/workflows/docker-release.yml b/.github/workflows/docker-release.yml index 7f1def4..9f11ea9 100644 --- a/.github/workflows/docker-release.yml +++ b/.github/workflows/docker-release.yml @@ -6,7 +6,7 @@ on: # - "apps/**" # - "Dockerfile" tags: - - "v*.*.*" + - 'v*.*.*' concurrency: group: docker-release diff --git a/.markdownlint.yaml b/.markdownlint.yaml index 4a59f85..0a040ff 100644 --- a/.markdownlint.yaml +++ b/.markdownlint.yaml @@ -6,4 +6,4 @@ line-length: false # MD033/no-inline-html - Inline HTML MD033: # Allowed elements - allowed_elements: ["style"] + allowed_elements: ['style'] diff --git a/README.md b/README.md index ef5e4c2..82bb4df 100644 --- a/README.md +++ b/README.md @@ -11,18 +11,18 @@ ## 功能 -- [x] v2.x版本使用全新接口,更加稳定 -- [x] 支持微信公众号订阅(基于微信读书) -- [x] 后台自动定时更新内容 -- [x] 微信公众号RSS生成(支持`.atom`\.`rss`\.`json`格式) -- [x] 支持全文内容输出,让阅读无障碍 -- [x] 所有订阅源导出OPML -- [x] 支持通过/feeds/all.(json|rss|atom)接口和/feeds/:feed对标题进行过滤:使用title_include和title_exclude参数,支持使用`|`实现多个关键词的 或 逻辑 -> {{ORIGIN_URL}}/feeds/all.atom?title_include=张三 -> -> {{ORIGIN_URL}}/feeds/MP_WXS_123.json?limit=30&title_include=张三|李四|王五&title_exclude=张三丰|赵六 -- [x] 支持通过/feeds/:feed接口触发单个feedid更新:使用update=true参数(实时返回结果不包含更新后的articles,要获取更新后的articles需去掉update参数再请求一次) -> {{ORIGIN_URL}}/feeds/MP_WXS_123.rss?update=true +- [x] v2.x版本使用全新接口,更加稳定 +- [x] 支持微信公众号订阅(基于微信读书) +- [x] 后台自动定时更新内容 +- [x] 微信公众号RSS生成(支持`.atom`\.`rss`\.`json`格式) +- [x] 支持全文内容输出,让阅读无障碍 +- [x] 所有订阅源导出OPML +- [x] 支持通过/feeds/all.(json|rss|atom)接口和/feeds/:feed对标题进行过滤:使用title_include和title_exclude参数,支持使用`|`实现多个关键词的 或 逻辑 + > {{ORIGIN_URL}}/feeds/all.atom?title_include=张三 + > + > {{ORIGIN_URL}}/feeds/MP_WXS_123.json?limit=30&title_include=张三|李四|王五&title_exclude=张三丰|赵六 +- [x] 支持通过/feeds/:feed接口触发单个feedid更新:使用update=true参数(实时返回结果不包含更新后的articles,要获取更新后的articles需去掉update参数再请求一次) + > {{ORIGIN_URL}}/feeds/MP_WXS_123.rss?update=true ## 部署 @@ -30,7 +30,7 @@ 你可以通过以下平台一键部署,只需填写本项目的URL即可。 -[Zeabur](https://zeabur.com/) +[Zeabur](https://zeabur.com/) [![Deploy on Zeabur](https://zeabur.com/button.svg)](https://zeabur.com/templates/DI9BBD) @@ -97,6 +97,7 @@ docker run -d \ 如果你想本地部署,请使用 `pnpm install && pnpm run -r build && pnpm run start:server` 命令(可以配合 pm2 来守护进程,防止被杀死)。 详细的部署步骤如下,以sqlite为例: + ```shell # 需要提前声明环境变量,因为prisma会根据环境变量生成对应的数据库连接 export DATABASE_URL="file:../data/wewe-rss.db" @@ -105,10 +106,10 @@ export DATABASE_TYPE="sqlite" rm -rf apps/server/prisma mv apps/server/prisma-sqlite apps/server/prisma # 生成prisma client -npx prisma generate --schema apps/server/prisma/schema.prisma +npx prisma generate --schema apps/server/prisma/schema.prisma # 生成数据库表 npx prisma migrate deploy --schema apps/server/prisma/schema.prisma -# 构建并运行 +# 构建并运行 pnpm run -r build pnpm run start:server @@ -137,20 +138,21 @@ pnpm run start:server ## 使用方式 1. 进入账号管理,点击添加账号,微信扫码登录微信读书账号。 - + 1. 进入公众号源,点击添加,通过提交微信公众号分享链接,订阅微信公众号。 - **(添加频率过高容易被封控,等24小时解封)** - - + **(添加频率过高容易被封控,等24小时解封)** + ## 账号状态说明 -- 今日小黑屋 +- 今日小黑屋 + > 账号被封控,等一天恢复 > 如果账号正常,可以通过重启服务/容器清除小黑屋记录 - 禁用 + > 不使用该账号 - 失效 @@ -169,7 +171,6 @@ pnpm run start:server - ## 风险声明 为了确保本项目的持久运行,某些接口请求将通过`weread.111965.xyz`进行转发。请放心,该转发服务不会保存任何数据。 diff --git a/apps/server/src/app.controller.ts b/apps/server/src/app.controller.ts index adb03d8..4516357 100644 --- a/apps/server/src/app.controller.ts +++ b/apps/server/src/app.controller.ts @@ -22,10 +22,9 @@ export class AppController { } @Get('favicon.ico') - getFavicon( - @Response() res: Res, - ) { - const imgContent = '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' + getFavicon(@Response() res: Res) { + const imgContent = + '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'; const imgBuffer = Buffer.from(imgContent, 'base64'); res.setHeader('Content-Type', 'image/png'); res.send(imgBuffer); @@ -43,7 +42,7 @@ export class AppController { enabledAuthCode: !!code, iconUrl: weweRssServerOriginUrl ? `${weweRssServerOriginUrl}/favicon.ico` - : 'https://r2-assets.111965.xyz/wewe-rss.png' + : 'https://r2-assets.111965.xyz/wewe-rss.png', }; } } diff --git a/apps/server/src/feeds/feeds.controller.ts b/apps/server/src/feeds/feeds.controller.ts index 3387fd3..589edd1 100644 --- a/apps/server/src/feeds/feeds.controller.ts +++ b/apps/server/src/feeds/feeds.controller.ts @@ -60,7 +60,7 @@ export class FeedsController { const [id, type] = feed.split('.'); this.logger.log('getFeed: ', id); - if(update) { + if (update) { this.feedsService.updateFeed(id); } diff --git a/apps/server/src/feeds/feeds.service.ts b/apps/server/src/feeds/feeds.service.ts index 6073f43..fd3592f 100644 --- a/apps/server/src/feeds/feeds.service.ts +++ b/apps/server/src/feeds/feeds.service.ts @@ -274,13 +274,15 @@ export class FeedsService { if (title_include) { const includes = title_include.split('|'); - feed.items = feed.items.filter( - (i: Item) => includes.some((k) => i.title.includes(k))); + feed.items = feed.items.filter((i: Item) => + includes.some((k) => i.title.includes(k)), + ); } if (title_exclude) { const excludes = title_exclude.split('|'); feed.items = feed.items.filter( - (i: Item) => !excludes.some((k) => i.title.includes(k))); + (i: Item) => !excludes.some((k) => i.title.includes(k)), + ); } switch (type) { diff --git a/apps/web/README.md b/apps/web/README.md index 0d6babe..9d0b4bc 100644 --- a/apps/web/README.md +++ b/apps/web/README.md @@ -22,7 +22,7 @@ export default { project: ['./tsconfig.json', './tsconfig.node.json'], tsconfigRootDir: __dirname, }, -} +}; ``` - Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` diff --git a/apps/web/index.html b/apps/web/index.html index 51ed5bd..dc1d7b2 100644 --- a/apps/web/index.html +++ b/apps/web/index.html @@ -1,4 +1,4 @@ - + diff --git a/apps/web/postcss.config.js b/apps/web/postcss.config.js index 2e7af2b..2aa7205 100644 --- a/apps/web/postcss.config.js +++ b/apps/web/postcss.config.js @@ -3,4 +3,4 @@ export default { tailwindcss: {}, autoprefixer: {}, }, -} +}; diff --git a/apps/web/src/components/Nav.tsx b/apps/web/src/components/Nav.tsx index 6ed854d..8372e04 100644 --- a/apps/web/src/components/Nav.tsx +++ b/apps/web/src/components/Nav.tsx @@ -74,9 +74,10 @@ const Nav = () => { width={28} alt="WeWe RSS" className="mr-2" - src={ serverOriginUrl - ? `${serverOriginUrl}/favicon.ico` - : 'https://r2-assets.111965.xyz/wewe-rss.png' + src={ + serverOriginUrl + ? `${serverOriginUrl}/favicon.ico` + : 'https://r2-assets.111965.xyz/wewe-rss.png' } > diff --git a/apps/web/src/pages/feeds/index.tsx b/apps/web/src/pages/feeds/index.tsx index 734a89c..12f44cd 100644 --- a/apps/web/src/pages/feeds/index.tsx +++ b/apps/web/src/pages/feeds/index.tsx @@ -60,11 +60,11 @@ const Feeds = () => { const [currentMpId, setCurrentMpId] = useState(id || ''); const handleConfirm = async () => { - console.log("wxsLink", wxsLink) + console.log('wxsLink', wxsLink); // TODO show operation in progress - const wxsLinks = wxsLink.split('\n').filter(link=>link.trim()!==''); - for (const link of wxsLinks){ - console.log('add wxsLink',link) + const wxsLinks = wxsLink.split('\n').filter((link) => link.trim() !== ''); + for (const link of wxsLinks) { + console.log('add wxsLink', link); const res = await getMpInfo({ wxsLink: link }); if (res[0]) { const item = res[0]; @@ -90,8 +90,6 @@ const Feeds = () => { onClose(); }; - - const isActive = (key: string) => { return currentMpId === key; }; diff --git a/package.json b/package.json index d5359b9..2997e03 100644 --- a/package.json +++ b/package.json @@ -18,5 +18,8 @@ "start:web": "pnpm --filter web start", "fmt": "prettier --write .", "fmt.check": "prettier --check ." + }, + "devDependencies": { + "prettier": "^3.2.5" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 11e980f..f1cc44a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,7 +6,11 @@ settings: importers: - .: {} + .: + devDependencies: + prettier: + specifier: ^3.2.5 + version: 3.2.5 apps/server: dependencies: @@ -1491,6 +1495,7 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] requiresBuild: true dev: false optional: true @@ -1500,6 +1505,7 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] requiresBuild: true dev: false optional: true @@ -1509,6 +1515,7 @@ packages: engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] requiresBuild: true dev: false optional: true @@ -1518,6 +1525,7 @@ packages: engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] requiresBuild: true dev: false optional: true @@ -3870,6 +3878,7 @@ packages: resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} cpu: [arm64] os: [linux] + libc: [glibc] requiresBuild: true dev: true optional: true @@ -3878,6 +3887,7 @@ packages: resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} cpu: [arm64] os: [linux] + libc: [musl] requiresBuild: true dev: true optional: true @@ -3886,6 +3896,7 @@ packages: resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} cpu: [riscv64] os: [linux] + libc: [glibc] requiresBuild: true dev: true optional: true @@ -3894,6 +3905,7 @@ packages: resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} cpu: [x64] os: [linux] + libc: [glibc] requiresBuild: true dev: true optional: true @@ -3902,6 +3914,7 @@ packages: resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} cpu: [x64] os: [linux] + libc: [musl] requiresBuild: true dev: true optional: true diff --git a/wewe-rss-dingtalk/README.md b/wewe-rss-dingtalk/README.md index 7a8cf29..c48b1a2 100755 --- a/wewe-rss-dingtalk/README.md +++ b/wewe-rss-dingtalk/README.md @@ -1,19 +1,21 @@ - -### 修改main.py,输入dingtalk的access_token和secret - -``` - access_token = '' - secret = '' # 创建机器人时钉钉设置页面有提供 -``` - -### 修改根目录下的docker-compose.yaml文件,去掉以下字段的注释 -``` - # ports: - # - 13306:3306 -``` - -### python3 main.py就可以运行 -### 或者部署成docker,运行 -``` - sudo docker-compose up -d -``` \ No newline at end of file +### 修改main.py,输入dingtalk的access_token和secret + +``` + access_token = '' + secret = '' # 创建机器人时钉钉设置页面有提供 +``` + +### 修改根目录下的docker-compose.yaml文件,去掉以下字段的注释 + +``` + # ports: + # - 13306:3306 +``` + +### python3 main.py就可以运行 + +### 或者部署成docker,运行 + +``` + sudo docker-compose up -d +``` diff --git a/wewe-rss-dingtalk/docker-compose.yml b/wewe-rss-dingtalk/docker-compose.yml index f43f5eb..fe72fcb 100755 --- a/wewe-rss-dingtalk/docker-compose.yml +++ b/wewe-rss-dingtalk/docker-compose.yml @@ -3,4 +3,4 @@ version: '3.9' services: wewe-rss-dingtalk: build: . - container_name: wewe-rss-dingtalk \ No newline at end of file + container_name: wewe-rss-dingtalk