额,不知不觉我已经通宵发文1890天了,在这煎熬的夜晚,我频频失眠,连做梦都想着啥时候有个定时发文章功能,好让我睡个好觉😰😰
一 如何实现这个功能,有啥思路
- 那就是官方支持了🥺
- 只能自己想想办法
- 写个脚本 (太废了,成天开着机,不划算)
- 观察观察发文章时都干嘛了,想想办法搞他一下 (我们可以调接口啊,毕竟我们都是API调用工程师)
正文
-
首先准备好我们准备发的文章
必填选项
都必须填了,保存到草稿
-
发布文章,然后抓包
- 如图,我们会看到重要的一个接口
- 红色框的就是,发布文章 (
重点
) - 红色框下面的是 跳到 发布成功页面 (
啥用都没
)
-
下一步,看看这个接口都干嘛了
-
先看下 Headers,重点看
Cookie
里的 sessionid ,其他都没啥用 -
如何获取sessionid (这个页面咋进去,不用我多说了吧)
-
接下来看 参数
-
解释一下参数:
- draft_id 这个是文章Id(
如何拿到看下图
) - 其他参数目前来说
没啥用
- draft_id 这个是文章Id(
-
-
那怎么知道发送成功没有
- 只有响应结果中包含
"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"));
}
}
- 啥都懒得干
那就用现成的
- 👉🏻传送门👈🏻
- 用完记得点赞!!!!!!!!
为了不被时代抛弃,我也发张妹子图