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

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

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

WechatIMG16379.jpeg

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

正文

  • 首先准备好我们准备发的文章
+ `必填选项`都必须填了,保存到草稿
![image.png](https://gitee.com/songjianzaina/juejin_p14/raw/master/img/a7cfaacf3c4964c6bffbfd777563c88458ba8ec26feea24ac320c7c56e8ac660)
  • 发布文章,然后抓包
+ 如图,我们会看到重要的一个接口
+ 红色框的就是,发布文章 (`重点`)
+ 红色框下面的是 跳到 发布成功页面 (`啥用都没`)

image.png

  • 下一步,看看这个接口都干嘛了
+ 先看下 Headers,重点看`Cookie` 里的 sessionid ,其他都没啥用
![image.png](https://gitee.com/songjianzaina/juejin_p14/raw/master/img/6385bed96708d86fd38d9f848d929866b562c958d90f2c4f516e3518cec04e0d)
+ 如何获取sessionid (这个页面咋进去,不用我多说了吧)
![image.png](https://gitee.com/songjianzaina/juejin_p14/raw/master/img/bcd4b4c908479620350a44e92d1a75bb4307abe1e8b54f54136a820ff7a7ff91)
+ 接下来看 参数
![image.png](https://gitee.com/songjianzaina/juejin_p14/raw/master/img/e328a0152d9e256c95e0788229ccfe26727103cb2ec39c82bf5a69b65f048276)
+ 解释一下参数:


    - draft\_id 这个是文章Id(`如何拿到看下图`)
    ![image.png](https://gitee.com/songjianzaina/juejin_p14/raw/master/img/5de2dc6f9786304928e114eb948cc8745866d4c48fca777258979df36b1137ad)
    - 其他参数目前来说`没啥用`
  • 那怎么知道发送成功没有
+ 只有响应结果中包含 `"err_no": 0` 就说明成功了

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

🍀🍀 写代码时刻到了

  • 思路
+ 搞个定时任务
+ 调接口
+ 完事
  • 脚本方式 (缺点很大)
+ 编写一个shell脚本,保存到linux上,然后添加计划任务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
shell复制代码#!/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 "----------------------------------------------------------------------------"
+ 添加计划任务
1
2
3
4
5
6
7
8
9
10
11
12
shell复制代码// 编辑计划任务
vim /etc/crontab

//添加一行
* * * * * user-name command to be executed

// * * * * * 就是core表达式
// user-name 执行的用户
// command to be executed 脚本路径

// 例如:每天3点执行一次
// 0 3 * * * root /xxxx上面的脚本.sh
  • 代码方式(java为例)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%