看看掘友如何帮女神,定时发文章的🥱

8,010 阅读2分钟

额,不知不觉我已经通宵发文1890天了,在这煎熬的夜晚,我频频失眠,连做梦都想着啥时候有个定时发文章功能,好让我睡个好觉😰😰

一 如何实现这个功能,有啥思路

WechatIMG16379.jpeg

  1. 那就是官方支持了🥺
  2. 只能自己想想办法
    1. 写个脚本 (太废了,成天开着机,不划算)
    2. 观察观察发文章时都干嘛了,想想办法搞他一下 (我们可以调接口啊,毕竟我们都是API调用工程师)

正文

  • 首先准备好我们准备发的文章

    • 必填选项都必须填了,保存到草稿 image.png
  • 发布文章,然后抓包

    • 如图,我们会看到重要的一个接口
    • 红色框的就是,发布文章 (重点
    • 红色框下面的是 跳到 发布成功页面 (啥用都没

image.png

  • 下一步,看看这个接口都干嘛了

    • 先看下 Headers,重点看Cookie 里的 sessionid ,其他都没啥用 image.png

    • 如何获取sessionid (这个页面咋进去,不用我多说了吧) image.png

    • 接下来看 参数 image.png

    • 解释一下参数:

      • draft_id 这个是文章Id(如何拿到看下图image.png
      • 其他参数目前来说没啥用
  • 那怎么知道发送成功没有

    • 只有响应结果中包含 "err_no": 0 就说明成功了

重点已经讲完,咋实现定时发布,各位大佬心里应该有自己想法了

🍀🍀 写代码时刻到了

  • 思路

    • 搞个定时任务
    • 调接口
    • 完事
  • 脚本方式 (缺点很大)

    • 编写一个shell脚本,保存到linux上,然后添加计划任务
    #!/bin/bash
    
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    curl --location --request POST 'https://api.juejin.cn/content_api/v1/article/publish' \
    --header 'Content-Type: application/json' \
    --header 'Cookie: sessionid=你的sessionid;' \
    --data-raw '{
      "draft_id": "你的文章ID",
      "sync_to_org": false,
      "column_ids": []
    }'
    echo "----------------------------------------------------------------------------"
    endDate=`date +"%Y-%m-%d %H:%M:%S"`
    echo "★[$endDate] Successful"
    echo "----------------------------------------------------------------------------"
    
    • 添加计划任务
    // 编辑计划任务
    vim /etc/crontab
    
    //添加一行
    * * * * * user-name command to be executed
    
    // * * * * * 就是core表达式
    // user-name 执行的用户
    // command to be executed 脚本路径
    
    // 例如:每天3点执行一次
    // 0 3 * * * root /xxxx上面的脚本.sh
    
  • 代码方式(java为例)

/**
 * 用到了hutool
 * <dependency>
 *  <groupId>cn.hutool</groupId>
 *  <artifactId>hutool-all</artifactId>
 *  <version>4.6.10</version>
 * </dependency>
 */

public class Publish {

    static DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");

    static ScheduledThreadPoolExecutor executor;

    public static void main(String[] args) {
        if (args.length < 1) {
            System.out.println("参数示例:java -cp xxxx.jar com.yeting.juejin.Publish sessionid 文章ID->发布时间 文章ID->发布时间");
            System.out.println("sessionid:是掘金sessionid");
            System.out.println("文章ID->发布时间:->是分隔符");
            return;
        }

        String sessionId = args[0];

        executor = new ScheduledThreadPoolExecutor(
                args.length - 1,
                ThreadFactoryBuilder.create().setNamePrefix("publish-").build()
        );
        //遍历所有任务
        for (int i = 1; i < args.length; i++) {
            String line = args[i];
            //截取文章ID和发布时间
            String[] split = line.split("->");
            String draftId = split[0];
            LocalDateTime publishTime = LocalDateTime.parse(split[1], dateFormat);
            LocalDateTime now = LocalDateTime.now();
            //计算出剩下多少分钟发布
            Duration duration = Duration.between(now, publishTime);
            long delay = duration.toMinutes();
            //交给线程池,定时执行
            executor.schedule(() -> {
                Boolean publish = publish(draftId, sessionId);
                if (publish) {
                    System.out.println("文章ID:" + draftId + " 发布成功");
                } else {
                    System.err.println("文章ID:" + draftId + " 发布失败");
                }
            }, delay, TimeUnit.MINUTES);
            System.out.println("解析成功,文章ID:" + draftId + " 将在:" + publishTime.format(dateFormat) + " 发布");
        }
    }

    public static Boolean publish(String draftId, String sessionId) {
        Map<String, String> headers = new HashMap<>(20);
        headers.put("Host", "api.juejin.cn");
        headers.put("Connection", "keep-alive");
        headers.put("sec-ch-ua", "\" Not;A Brand\";v=\"99\", \"Google Chrome\";v=\"91\", \"Chromium\";v=\"91\"");
        headers.put("sec-ch-ua-mobile", "?0");
        headers.put("Accept", "*/*");
        headers.put("Origin", "https://juejin.cn");
        headers.put("Sec-Fetch-Site", "same-site");
        headers.put("Sec-Fetch-Mode", "cors");
        headers.put("Sec-Fetch-Dest", "empty");
        headers.put("Referer", "https://juejin.cn/");
        headers.put("Accept-Language", "zh-CN,zh;q=0.9");
        headers.put("Cookie", "sessionid=" + sessionId + "; ");

        Map<String, Object> body = new HashMap<>(6);
        body.put("draft_id", draftId);
        body.put("sync_to_org", false);
        body.put("column_ids", Collections.emptyList());

        String res = HttpUtil.createPost("https://api.juejin.cn/content_api/v1/article/publish")
                .headerMap(headers, true)
                .body(JSONUtil.toJsonStr(body))
                .execute()
                .body();
        return "0".equals(JSONUtil.parseObj(res).getStr("err_no"));
    }
    
}





     为了不被时代抛弃,我也发张妹子图 image.png