
今天整理简书文章的时候,发现我的默认文集已经有一千多篇文章了,管理起来很不方便,于是决定按照年份重新归档。但是,一篇一篇手动将文章移动位置实在是太麻烦了。有没有一种方法能够方便快速地把指定的简书文章移动到同一个文集中呢?经过一番摸索,我用下面的代码成功实现了简书文章的快速搬家,在此与大家分享。
整个过程包括以下步骤:
编辑代码
首先将文末的代码复制到任意文本编辑器中,然后按照以下各步骤中的提示填入对应的内容。注意在修改代码时,只要替换对应的中文文字即可,不要改动其他符号。
获取个人的用户ID
打开简书网页版,进入个人主页,此时的域名https://www.jianshu.com/u/xxxxxxxxxx
(见浏览器地址栏)中最后一串字符就是你的用户ID。把这一ID填入代码中对应位置。
获取目标笔记本的ID
打开简书网页版,进入写文章界面,在你希望将文章移入的文集中随便打开一篇文章,此时的域名https://www.jianshu.com/writer#/notebooks/xxxxxxxxx/notes/yyyyyyyy
中xxxxxxxx
的部分就是你的笔记本ID。把这一ID填入代码中对应位置。
使用关键词
对于普通用户,可以直接将关键词输入到下面代码中的对应位置;对于有一定技术能力的用户,可以自行定制正则表达式,或修改代码实现更高级的过滤功能。
执行代码
打开简书网页版的任意页面(确保处于已登陆状态),然后打开浏览器的开发者工具页面(以Chrome为例,Windows和Linux下的快捷键为F12
或Ctrl+Shift+I
,Mac下的快捷键为Cmd+Option+I
),如下图所示:

选择“控制台”(英文则为"Console")标签,此时会有一个代码输入框。将刚才修改好的代码粘贴到这个框中,敲下回车即可。程序会首先获取你的文章列表,之后根据你设定的关键词过滤出所有标题含有这一关键词的文章,将它们统一移动到你指定的笔记本中。程序执行过程中会在控制台中输出日志信息,方便查看当前执行进度。注意在程序运行过程中不要关闭或刷新当前页面,否则将导致程序终止运行。
说明
- 文章搬家时,默认按照首次发表时间由早到晚排序,这样搬家后文集中的文章会是由新到旧的顺序。
- 有一定技术能力的用户,可以根据下面的代码进一步修改,实现定制化的搬家功能。
附:实现文章搬家所用到的代码
const USER_ID = "这里输入你的用户ID";
const TARGET_NOTEBOOK_ID = "这里输入目标笔记本的ID";
const MY_FILTER = /这里输入你的关键词/;
async function moveNote(note, targetNotebookId) {
console.log(`开始移动笔记《${note.data.title}》`);
try {
const resp = await fetch(`https://www.jianshu.com/author/notes/${note.data.id}/move`, {
"headers": {
"accept": "application/json",
"accept-language": "zh-CN,zh;q=0.9,en;q=0.8",
"content-type": "application/json; charset=UTF-8",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin"
},
"referrer": "https://www.jianshu.com/writer",
"referrerPolicy": "strict-origin-when-cross-origin",
"body": `{\"notebook_id\": ${targetNotebookId}}`,
"method": "POST",
"mode": "cors",
"credentials": "include"
});
if (resp.status == 204) {
console.log(`笔记《${note.data.title}》移动成功`);
} else {
console.error(`笔记《${note.data.title}》移动失败,请手动重试`);
}
} catch (e) {
console.error(`笔记《${note.data.title}》移动失败,请手动重试`);
}
}
async function queryNotes(userId) {
let page = 1;
const notes = [];
while (true) {
const body = await fetch(`https://www.jianshu.com/asimov/users/slug/${userId}/public_notes?page=${page}`);
const json = await body.json();
if (json.length == 0) {
break;
}
notes.push(...json.map(it => it.object));
console.log(`正在获取笔记列表,本次获取${json.length}条,累计获取${notes.length}条`);
page++;
}
return notes;
}
async function moveNotesByFilter(notes, filter, targetNotebookId) {
for (let note of notes) {
if (note.data.title.match(filter) != null) {
await moveNote(note, targetNotebookId);
}
}
}
const notes = await queryNotes(USER_ID);
notes.sort((a, b) => a.data.first_shared_at < b.data.first_shared_at ? -1 : 1);
await moveNotesByFilter(notes, MY_FILTER, TARGET_NOTEBOOK_ID);
网友评论