Смотрите, как копают друзья, помогайте богине, и регулярно публикуйте статьи🥱

задняя часть
Смотрите, как копают друзья, помогайте богине, и регулярно публикуйте статьи🥱

Эх, не успел я это осознать, как я всю ночь постил 1890 дней.В эту мучительную ночь я страдал от бессонницы.Я даже мечтал о том, когда будет функция регулярно постить, чтобы я мог хорошо провести ночь спать😰😰

Как реализовать эту функцию, есть идеи

WechatIMG16379.jpeg

  1. Это официальная поддержка 🥺
  2. Просто подумайте сами
    1. Написать скрипт (слишком расточительно, держать машину включенной весь день, не стоит)
    2. Наблюдайте и наблюдайте за тем, что вы делаете, когда публикуете статью, и думайте, как привлечь его (мы можем настроить интерфейс, в конце концов, мы все инженеры вызовов API)

текст

  • Сначала подготовьте статью, которую мы собираемся отправить
    • 必填选项Все должно быть заполнено, сохранить в черновик

image.png

  • Опубликуйте статью, затем захватите пакет
    • Как показано на рисунке, мы увидим важный интерфейс
    • Красное поле есть, опубликуйте статью (重点)
    • Под красным полем находится Перейти на страницу успешной публикации (啥用都没)

image.png

  • Далее давайте посмотрим, что делает этот интерфейс

    • Сначала посмотрите на заголовки, сосредоточьтесь наCookiesessionid внутри, больше ничего полезного

    image.png

    • Как получить sessionid (как зайти на эту страницу, больше рассказывать не надо)

    image.png

    • Далее смотрим параметры

    image.png

    • Объясните параметры:
      • draft_id Это идентификатор статьи (如何拿到看下图)
      image.png
      • Другие параметры в настоящее время没啥用
  • Итак, как узнать, успешно ли оно было отправлено или нет?

    • Только результат ответа содержит"err_no": 0это означает успех

Ключевые моменты были сказаны, как добиться регулярного выпуска, каждый должен иметь в виду свои идеи.

🍀🍀 Пришло время писать код

  • идеи

    • выполнить запланированное задание
    • интерфейс
    • Сделанный
  • Метод сценария (缺点很大)

    • Напишите сценарий оболочки, сохраните его в 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