受够了重复工作,一怒之下手写一个多平台文章同步工具

背景

作为喜欢分享技术博客的程序员,我经常需要在知乎、CSDN、今日头条、掘金四个平台同步内容。步骤如下:

  1. 打开平台
  2. 找到创作中心
  3. 复制文章
  4. 调整格式(有的平台支持md格式,有的只支持html格式)
  5. 设置分类,标签,摘要等等参数
  6. 发布文章...

肉眼可见的繁琐, 然后想去找找看看有没有开源的工具,有是有,要么年久失修,没人维护,例如wechatSync工具; 要么就是没有我想要的同步的平台,例如:mdnicep平台; 该平台,经常失败,而且不能同步掘金,于是一怒之下,就自己开发了一个工具。

实现过程

实现这个工具不难, 就是繁琐, 需要去各个平台抓包,查看文章发布流程,耗时两个小时,终于弄清楚了各个平台的发布流程。大体都如下:

  1. 创建草稿
  2. 更新草稿
  3. 发布文章
  4. 抓到调用接口需要的header,和 cookie
  5. 程序发起调用

但是也有不一样的,我把每个平台的接口和具体步骤都整理出来,供大家参考。

掘金

掘金发表文章需要用到两个接口

  1. 创建草稿:api.juejin.cn/content_api...
  2. 发布文章: api.juejin.cn/content_api...

接口鉴权

  • 鉴权只需要cookie即可

代码

java 复制代码
 @Override
    public RestResult doSyncArticle(Article article, ThirdPartyPlatformWithAuthInfo thirdPartyPlatform) {
        try {
            // 1. 创建草稿
            JuejinArticleDTO.CreateDraftRequest createRequest = new JuejinArticleDTO.CreateDraftRequest();
            createRequest.setTitle(article.getTitle());
            createRequest.setMark_content(article.getContent());
            createRequest.setBrief_content(article.getSummary());
            log.info("创建草稿请求参数: {}", JSON.toJSONString(createRequest));

            String createDraftJson = JSON.toJSONString(createRequest);
            RestResult<String> createDraftResponseString = httpClient.doPostJson(thirdPartyPlatform.getCreateDraftUrl(), createDraftJson, buildRequestHeader(thirdPartyPlatform.getHeader()), transferCookieToArray(thirdPartyPlatform.getCookie()));
            log.info("创建草稿相应: {}", createDraftResponseString);

            JuejinArticleDTO.CreateDraftResponse createDraftResponse = JSON.parseObject(createDraftResponseString.getData(), JuejinArticleDTO.CreateDraftResponse.class);
            if (createDraftResponse.getErr_no() != 0){
                log.error("创建草稿失败: {}", createDraftResponseString);
                return RestResult.error("创建草稿失败");
            }

            String draftId = createDraftResponse.getData().getId();
            JuejinArticleDTO.PublishRequest request = new JuejinArticleDTO.PublishRequest();
            request.setDraft_id(draftId);

            RestResult publishResponseString = httpClient.doPostJson(thirdPartyPlatform.getPublishArticleUrl(), JSON.toJSONString(request), buildRequestHeader(thirdPartyPlatform.getHeader()), transferCookieToArray(thirdPartyPlatform.getCookie()));
            log.info("发布文章结果:{}", publishResponseString);
            JuejinArticleDTO.CreateDraftResponse publishResutl =JSON.parseObject(publishResponseString.getData().toString(), JuejinArticleDTO.CreateDraftResponse.class);
            if (publishResutl.getErr_no() != 0){
                return RestResult.fail(publishResutl.getErr_msg());

            }
            return publishResponseString;

        } catch (Exception e) {
            log.error("Error syncing article to Juejin: {}", e.getMessage(), e);
            return RestResult.error("同步到掘金失败"+e.getMessage());
        }
    }

知乎

知乎发布文章流程

  1. 创建草稿:zhuanlan.zhihu.com/api/article...
  2. 对草稿设置主题:zhuanlan.zhihu.com/api/article...
  3. 发表文章:www.zhihu.com/api/v4/cont...

鉴权

  • 需要cookie
  • 需要header

头条

流程

  1. 创建草稿:mp.toutiao.com/mp/agw/arti...
  2. 发布文章: mp.toutiao.com/mp/agw/arti...

草稿和文章的接口相同,通过参数控制草稿还是正式发布

鉴权

  • 需要cookie
  • 需要header

CSDN

csdn 最简单,一个接口就能搞定

bizapi.csdn.net/blog-consol...

鉴权

  • 需要cookie
  • 需要header

效果

同步结果

工具设置 如果cookie信息过期了, 通过同步记录可以看到原因, 此时可以重新上传cookie,然后再同步

小结

目前发布文章的时候分类标签 等参数,都是写死的, 后期可以完善做动态获取。待完善功能:

  1. 分类,标签动态处理
  2. 上传图片到平台 (目前可以用图床解决)

最后

如果文章对你有帮助,点个免费的赞鼓励一下吧!关注gzh:加瓦点灯, 每天推送干货知识!关注后提供工具源码哦!

相关推荐
特立独行的猫a几秒前
我用 Rust + Tauri 2 复刻了 N_m3u8DL-CLI:一个 m3u8 多线程下载器
开发语言·后端·rust·m3u8·视频下载器·m3u8dl-cli
月光有害1 分钟前
理解 Spring 依赖注入:从构造器注入到集合与条件 Bean
java·后端·spring
对象存储与RustFS3 分钟前
大文件传到 48 GiB 就断:S3 分片上传的参数怎么算,以及那些没人清的残片
后端·rust·开源
foggyprojects5 分钟前
客户说“销售额”,系统怎样落到订单含税金额或开票含税销售额?
后端
念何架构之路25 分钟前
路由注册:RouterGroup(routergroup.go)
开发语言·后端·golang
小当家.10529 分钟前
LLM服务缓存与连接池管理:三层缓存架构与ChatClient池化
java·后端·spring·缓存·llm·agent
人间凡尔赛1 小时前
当 AI Agent 攻陷网关:Istio agentgateway 与 Gateway API Inference Extension 实战解析
后端·云原生·架构
wwwzhouzy1 小时前
SpringBoot 响应式编程
java·spring boot·后端·响应式编程
Python私教1 小时前
请求超时不等于失败:把写操作恢复设计成事实回读
后端·python
goldbin_zhang_xu1 小时前
我用 Go 重写了一个 OpenClaw 框架:这就是 GoClaw
开发语言·后端·golang·agent框架·goclaw·双循环机制