From 39d7b001f9b3f6b23d4aa4a28a7973171cc653de Mon Sep 17 00:00:00 2001 From: terwer Date: Fri, 8 Sep 2023 10:55:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=8E=98=E9=87=91=E5=B9=B3=E5=8F=B0?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=88=86=E7=B1=BB=E4=B8=8E=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 21 +++++- README_zh_CN.md | 22 +++++- package.json | 4 +- pnpm-lock.yaml | 74 ++++++++++--------- src/adaptors/web/juejin/juejinConfig.ts | 2 +- src/adaptors/web/juejin/juejinWebAdaptor.ts | 22 +++++- src/adaptors/web/juejin/useJuejinWeb.ts | 2 +- .../publish/SinglePublishDoPublish.vue | 23 ++++-- 8 files changed, 119 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index b517d576..32d7cf82 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,12 @@ Publish articles from siyuan-note to platforms such as Yuque, Notion, Cnblogs, W Support features such as fast publishing, image bed management, platform expansion, smart labels, etc. -> 🎉 The first version `1.13.0` of Publish Tool that supports WeChat Official Accounts released! +> 🎉 The first version `1.14.0` of Publish Tool that support Jianshu, Juejin and Hugo, Jekyll, Vuepress, Vuepress2, Vitepress is released! > Platform Limitations: - **WeChat Official Accounts**: Publishing Tool now supports posting articles to the WeChat Official Accounts draft box in version `1.13.0` and beyond. However, due to limitations on the WeChat platform in Electron, normal login operations are not possible. Therefore, you will need to visit `https://mp.weixin.qq.com/` yourself, complete the login, copy the cookie, and then paste it into the configuration options. - **Notion**: Since Notion is block-based, not a whole document, it is constrained by technology and does not support updates. To update, you can only delete and then repost it. + - **Juejin**: Due to the mandatory requirements of the Jujin platform, tags and classifications must be filled in, if you do not select publishing, a backend classification and programmer label will be added by default, otherwise you will not be able to publish. > [Click here](https://blog.terwer.space/s/20230810132040-nn4q7vs) to view the latest help documentation. @@ -28,8 +29,18 @@ Names not listed in order - [X] Notion - [X] Github - [X] Hexo + - [X] Hugo + - [X] Jekyll + - [X] Vuepress + - [X] Vuepress2 + - [X] Vitepress - [X] Gitlab - [X] Gitlabhexo + - [X] Gitlabhugo + - [X] Gitlabjekyll + - [X] Gitlabvuepress + - [X] Gitlabvuepress2 + - [X] Gitlabvitepress - [X] Metaweblog - [X] Cnblogs - [X] Typecho @@ -37,6 +48,8 @@ Names not listed in order - [X] Zhihu - [X] CSDN - [X] Wechat +- [X] Jianshu +- [X] Juejin ## Core Features @@ -72,6 +85,12 @@ This plugin is fully compatible with `siyuan-note PC Client` , due to limited pe - [X] Single-choice knowledge space - [X] Tree-shaped radio knowledge space +- [X] tag + - [X] Multi-select tab + +- [X] Label alias + - [X] Radio label alias + ## Platform Adaptation Plan If you have a platform you want to use, but this tool has not yet been implemented, you can submit diff --git a/README_zh_CN.md b/README_zh_CN.md index e27ae761..eae98aac 100644 --- a/README_zh_CN.md +++ b/README_zh_CN.md @@ -6,14 +6,14 @@ 将思源笔记的文章发布到语雀、Notion、Cnblogs、WordPress、Typecho、Hexo、知乎 等平台,支持极速发布、图床管理、平台扩展、智能标签等特色功能。 -> 🎉 发布工具首个支持微信公众号的版本 `1.13.0` 发布! +> 🎉 发布工具首个支持简书、掘金以及 Hugo、Jekyll、Vuepress、Vuepress2、Vitepress 的版本 `1.14.0` 发布! > 平台限制说明 - 所有平台:发布工具每次都会获取思源笔记最新编辑的正文进行覆盖发布。每次发布都会覆盖正文,每次发布都会覆盖正文,每次发布都会覆盖正文。因此,请勿在平台自行修改正文。 - **微信公众号**:目前,发布工具在 `1.13.0+` 已经支持发布文章到微信公众号草稿箱。但是由于微信平台在 Electron 上有限制,无法正常进行登录操作。因此,只能自己访问 `https://mp.weixin.qq.com/` ,登录完成之后,复制cookie然后粘贴到配置选项。 - **Notion**: 由于Notion是基于块的,不是整篇文档,受限于技术,notion不支持更新。如需更新,目前只能删除后重新发布。 - + - **掘金**:由于掘金平台强制要求,必须填写标签和分类,如果发布不选择默认会加上一个后端分类、程序员标签,否则将无法发布。 **遇到问题或者需求建议?请加QQ群 `895063267` 讨论。或者查看下面的在线文档:** @@ -31,8 +31,18 @@ - [X] Notion - [X] Github - [X] Hexo + - [X] Hugo + - [X] Jekyll + - [X] Vuepress + - [X] Vuepress2 + - [X] Vitepress - [X] Gitlab - [X] Gitlabhexo + - [X] Gitlabhugo + - [X] Gitlabjekyll + - [X] Gitlabvuepress + - [X] Gitlabvuepress2 + - [X] Gitlabvitepress - [X] Metaweblog - [X] 博客园 - [X] Typecho @@ -40,6 +50,8 @@ - [X] 知乎 - [X] CSDN - [X] 微信公众号 +- [X] 简书 +- [X] 掘金 ## 核心特色 @@ -75,6 +87,12 @@ - [X] 单选知识空间 - [X] 树形单选知识空间 +- [X] 标签 + - [X] 多选标签 + +- [X] 标签别名 + - [X] 单选标签别名 + ## 平台适配计划 如果你有想使用的平台,但是此工具目前还没实现,可在这里提交 [思源笔记发布工具插件平台适配跟踪表](https://terwergreen.feishu.cn/share/base/form/shrcnGRdThUiqnhBg15xgclMM0c) diff --git a/package.json b/package.json index 883e8e0f..5bdafa9c 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,7 @@ "vue-i18n": "^9.3.0", "vue-router": "^4.2.4", "xmlbuilder2": "^3.1.1", - "zhi-blog-api": "^1.36.3", + "zhi-blog-api": "^1.37.1", "zhi-common": "^1.23.7", "zhi-device": "^2.3.1", "zhi-fetch-middleware": "^0.6.4", @@ -80,7 +80,7 @@ "zhi-gitlab-middleware": "^0.6.4", "zhi-lib-base": "^0.5.0", "zhi-notion-markdown": "^0.1.4", - "zhi-siyuan-api": "^2.9.0", + "zhi-siyuan-api": "^2.9.2", "zhi-xmlrpc-middleware": "^0.5.11" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 26b936ec..7db29524 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,9 +1,5 @@ lockfileVersion: '6.0' -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - dependencies: '@element-plus/icons-vue': specifier: ^2.1.0 @@ -69,8 +65,8 @@ dependencies: specifier: ^3.1.1 version: 3.1.1 zhi-blog-api: - specifier: ^1.36.3 - version: 1.36.3 + specifier: ^1.37.1 + version: 1.37.1 zhi-common: specifier: ^1.23.7 version: 1.23.7 @@ -93,8 +89,8 @@ dependencies: specifier: ^0.1.4 version: 0.1.4 zhi-siyuan-api: - specifier: ^2.9.0 - version: 2.9.0 + specifier: ^2.9.2 + version: 2.9.2 zhi-xmlrpc-middleware: specifier: ^0.5.11 version: 0.5.11 @@ -218,8 +214,8 @@ packages: js-tokens: 4.0.0 dev: false - /@babel/parser@7.22.15: - resolution: {integrity: sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA==} + /@babel/parser@7.22.16: + resolution: {integrity: sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==} engines: {node: '>=6.0.0'} hasBin: true dependencies: @@ -1798,7 +1794,7 @@ packages: /@vue/compiler-core@3.3.4: resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} dependencies: - '@babel/parser': 7.22.15 + '@babel/parser': 7.22.16 '@vue/shared': 3.3.4 estree-walker: 2.0.2 source-map-js: 1.0.2 @@ -1812,7 +1808,7 @@ packages: /@vue/compiler-sfc@3.3.4: resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} dependencies: - '@babel/parser': 7.22.15 + '@babel/parser': 7.22.16 '@vue/compiler-core': 3.3.4 '@vue/compiler-dom': 3.3.4 '@vue/compiler-ssr': 3.3.4 @@ -1855,7 +1851,7 @@ packages: /@vue/reactivity-transform@3.3.4: resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} dependencies: - '@babel/parser': 7.22.15 + '@babel/parser': 7.22.16 '@vue/compiler-core': 3.3.4 '@vue/shared': 3.3.4 estree-walker: 2.0.2 @@ -2131,12 +2127,13 @@ packages: safer-buffer: 2.1.2 dev: true - /assert@2.0.0: - resolution: {integrity: sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==} + /assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} dependencies: - es6-object-assign: 1.1.0 + call-bind: 1.0.2 is-nan: 1.3.2 object-is: 1.1.5 + object.assign: 4.1.4 util: 0.12.5 dev: true @@ -3128,10 +3125,6 @@ packages: is-arrayish: 0.2.1 dev: false - /es6-object-assign@1.1.0: - resolution: {integrity: sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==} - dev: true - /esbuild-android-64@0.14.47: resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} engines: {node: '>=12'} @@ -4751,7 +4744,7 @@ packages: whatwg-encoding: 2.0.0 whatwg-mimetype: 3.0.0 whatwg-url: 12.0.1 - ws: 8.13.0 + ws: 8.14.0 xml-name-validator: 4.0.0 transitivePeerDependencies: - bufferutil @@ -4955,7 +4948,7 @@ packages: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: - semver: 6.3.1 + semver: 6.1.1 dev: true /make-dir@4.0.0: @@ -5348,7 +5341,7 @@ packages: resolution: {integrity: sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==} engines: {node: '>=10'} dependencies: - assert: 2.0.0 + assert: 2.1.0 browser-resolve: 2.0.0 browserify-zlib: 0.2.0 buffer: 5.7.1 @@ -5473,6 +5466,16 @@ packages: engines: {node: '>= 0.4'} dev: true + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -6186,11 +6189,6 @@ packages: hasBin: true dev: true - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - dev: true - /semver@7.3.8: resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} engines: {node: '>=10'} @@ -6291,7 +6289,7 @@ packages: zhi-device: 2.3.1 zhi-fetch-middleware: 0.2.29 zhi-lib-base: 0.4.4 - zhi-siyuan-api: 2.9.0 + zhi-siyuan-api: 2.9.2 transitivePeerDependencies: - '@vue/composition-api' - typescript @@ -7450,8 +7448,8 @@ packages: optional: true dev: true - /ws@8.13.0: - resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + /ws@8.14.0: + resolution: {integrity: sha512-WR0RJE9Ehsio6U4TuM+LmunEsjQ5ncHlw4sn9ihD6RoJKZrVyH9FWV3dmnwu8B2aNib1OvG2X6adUCyFpQyWcg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -7531,8 +7529,8 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} - /zhi-blog-api@1.36.3: - resolution: {integrity: sha512-SNo+UFO940hT7ijZWfmHu23JYBjm7mw4dQDGeDIu5QgFOG/f/5waB/oV0TabhcSShU9H7sNadM/662XtKYVcoQ==} + /zhi-blog-api@1.37.1: + resolution: {integrity: sha512-DSreoiF3e8tlm3mbMZAnGr3GHc8PSHqsiOkN78Kvxmsk98C2UOPPr++80n8zAeThIyCvmWO42qz8wt/uXv1ovg==} dependencies: zhi-common: 1.23.7 zhi-lib-base: 0.5.0 @@ -7612,10 +7610,10 @@ packages: - supports-color dev: false - /zhi-siyuan-api@2.9.0: - resolution: {integrity: sha512-E69pUyBnf8p+IZItObFV16sBxbwKzVPeIMiBH5C61ncmipgCU02LCW2Fg4MM5peH2a5rjcuWUB0J5FQKFlSFGA==} + /zhi-siyuan-api@2.9.2: + resolution: {integrity: sha512-mqbXq3Iijg3dJbnefUudKJrECD1Bdh5eTZrWy+CZOR4DkcaNLOFA97q23Y3X2pvurox7f2SK5lPx1mxb+kX6Ag==} dependencies: - zhi-blog-api: 1.36.3 + zhi-blog-api: 1.37.1 zhi-common: 1.23.7 zhi-lib-base: 0.5.0 dev: false @@ -7631,3 +7629,7 @@ packages: /zwitch@1.0.5: resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} dev: false + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false diff --git a/src/adaptors/web/juejin/juejinConfig.ts b/src/adaptors/web/juejin/juejinConfig.ts index ab313b37..68dcf839 100644 --- a/src/adaptors/web/juejin/juejinConfig.ts +++ b/src/adaptors/web/juejin/juejinConfig.ts @@ -38,7 +38,7 @@ export class JuejinConfig extends CommonWebConfig { this.passwordType = PasswordType.PasswordType_Cookie this.usernameEnabled = false this.tagEnabled = false - this.slugTagEnabled = true + this.tagSlugEnabled = true this.cateEnabled = false this.categoryType = CategoryTypeEnum.CategoryType_Single this.knowledgeSpaceEnabled = true diff --git a/src/adaptors/web/juejin/juejinWebAdaptor.ts b/src/adaptors/web/juejin/juejinWebAdaptor.ts index b006bb19..0c464085 100644 --- a/src/adaptors/web/juejin/juejinWebAdaptor.ts +++ b/src/adaptors/web/juejin/juejinWebAdaptor.ts @@ -80,16 +80,27 @@ class JuejinWebAdaptor extends BaseWebApi { } public async addPost(post: Post) { - const cate_slug = post.cate_slugs?.[0] ?? this.cfg.blogid + let cate_slug = post.cate_slugs?.[0] ?? this.cfg.blogid if (StrUtil.isEmptyString(cate_slug)) { + // 默认分类:后端 + cate_slug = "6809637769959178254" + this.logger.error("掘金平台未选择分类,将使用默认分类:后端") throw new Error("掘金平台必须选择一个分类") } + let tag_slug = post.tags_slugs ?? "" + if (StrUtil.isEmptyString(tag_slug)) { + // 默认贴标签:程序员 + tag_slug = "6809640482725954000" + this.logger.error("掘金平台未选择标签,将使用默认标签:程序员") + throw new Error("掘金平台必须选择一个标签") + } + // 保存草稿 const draftUrl = "https://api.juejin.cn/content_api/v1/article_draft/create" const draftParams = { category_id: cate_slug, - tag_ids: [], + tag_ids: tag_slug.split(","), link_url: "", cover_image: "", title: post.title, @@ -121,6 +132,11 @@ class JuejinWebAdaptor extends BaseWebApi { throw new Error("掘金平台必须选择一个分类") } + const tag_slug = post.tags_slugs ?? "" + if (StrUtil.isEmptyString(tag_slug)) { + throw new Error("掘金平台必须选择一个标签") + } + const juejinPostKey = this.getJuejinPostidKey(postid) // const pageId = juejinPostKey.pageId const draftId = juejinPostKey.draftId @@ -130,7 +146,7 @@ class JuejinWebAdaptor extends BaseWebApi { const draftParams = { id: draftId, category_id: cate_slug, - tag_ids: [], + tag_ids: tag_slug.split(","), link_url: "", cover_image: "", title: post.title, diff --git a/src/adaptors/web/juejin/useJuejinWeb.ts b/src/adaptors/web/juejin/useJuejinWeb.ts index abab87c9..f68b4a56 100644 --- a/src/adaptors/web/juejin/useJuejinWeb.ts +++ b/src/adaptors/web/juejin/useJuejinWeb.ts @@ -89,7 +89,7 @@ const useJuejinWeb = async (key?: string, newCfg?: JuejinConfig) => { // // 掘金使用单选分类、别名标签 cfg.tagEnabled = false - cfg.slugTagEnabled = true + cfg.tagSlugEnabled = true cfg.cateEnabled = false cfg.knowledgeSpaceEnabled = true cfg.knowledgeSpaceTitle = "分类" diff --git a/src/components/publish/SinglePublishDoPublish.vue b/src/components/publish/SinglePublishDoPublish.vue index 3e4d087b..fcce016b 100644 --- a/src/components/publish/SinglePublishDoPublish.vue +++ b/src/components/publish/SinglePublishDoPublish.vue @@ -134,6 +134,7 @@ const handlePublish = async () => { ElMessage.success("文章更新成功!") } } else { + formData.actionEnable = true ElMessage.error(processResult.errMsg) logger.error(processResult.errMsg) } @@ -309,6 +310,11 @@ const syncTags = (val: string[]) => { logger.debug("syncTags in single publish") } +const syncTagSlugs = (val: string[]) => { + formData.mergedPost.tags_slugs = val?.join(",") + logger.debug("syncTagSlugs in single publish") +} + const syncCates = (cates: string[]) => { formData.mergedPost.categories = cates logger.debug("syncCates in single publish") @@ -473,11 +479,18 @@ onMounted(async () => { + + +