Эх, не успел я это осознать, как я всю ночь постил 1890 дней.В эту мучительную ночь я страдал от бессонницы.Я даже мечтал о том, когда будет функция регулярно постить, чтобы я мог хорошо провести ночь спать😰😰
Как реализовать эту функцию, есть идеи
- Это официальная поддержка 🥺
- Просто подумайте сами
- Написать скрипт (слишком расточительно, держать машину включенной весь день, не стоит)
- Наблюдайте и наблюдайте за тем, что вы делаете, когда публикуете статью, и думайте, как привлечь его (мы можем настроить интерфейс, в конце концов, мы все инженеры вызовов API)
текст
- Сначала подготовьте статью, которую мы собираемся отправить
-
必填选项Все должно быть заполнено, сохранить в черновик
-
- Опубликуйте статью, затем захватите пакет
- Как показано на рисунке, мы увидим важный интерфейс
- Красное поле есть, опубликуйте статью (
重点) - Под красным полем находится Перейти на страницу успешной публикации (
啥用都没)
-
Далее давайте посмотрим, что делает этот интерфейс
- Сначала посмотрите на заголовки, сосредоточьтесь на
Cookiesessionid внутри, больше ничего полезного
- Как получить sessionid (как зайти на эту страницу, больше рассказывать не надо)
- Далее смотрим параметры
- Объясните параметры:
- draft_id Это идентификатор статьи (
如何拿到看下图)
- Другие параметры в настоящее время
没啥用
- draft_id Это идентификатор статьи (
- Сначала посмотрите на заголовки, сосредоточьтесь на
-
Итак, как узнать, успешно ли оно было отправлено или нет?
- Только результат ответа содержит
"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"));
}
}
- лень что-либо делать
那就用现成的- 👉🏻 Портал 👈🏻
- Не забудьте поставить лайк после использования! ! ! ! ! ! ! !
Чтобы не быть заброшенным временем, я тоже выкладываю фото девушки