mirror of
https://github.com/DIYgod/RSSHub.git
synced 2026-09-24 23:12:34 +08:00
fix: juejin api (#5432)
This commit is contained in:
+17
-15
@@ -2,26 +2,28 @@ const got = require('@/utils/got');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: 'https://xiaoce-timeline-api-ms.juejin.im/v1/getListByLastTime?uid=&client_id=&token=&src=web&alias=&pageNum=1',
|
||||
method: 'post',
|
||||
url: 'https://apinew.juejin.im/booklet_api/v1/booklet/listbycategory',
|
||||
json: { category_id: '0', cursor: '0', limit: 20 },
|
||||
});
|
||||
|
||||
const data = response.data.d;
|
||||
const { data } = response.data;
|
||||
const items = data.map(({ base_info }) => ({
|
||||
title: base_info.title,
|
||||
link: `https://juejin.im/book/${base_info.booklet_id}`,
|
||||
description: `
|
||||
<img src="${base_info.cover_img}"><br>
|
||||
<strong>${base_info.title}</strong><br><br>
|
||||
${base_info.summary}<br>
|
||||
<strong>价格:</strong> ${base_info.price / 100}元
|
||||
`,
|
||||
pubDate: new Date(base_info.ctime * 1000).toUTCString(),
|
||||
guid: base_info.booklet_id,
|
||||
}));
|
||||
|
||||
ctx.state.data = {
|
||||
title: '掘金小册',
|
||||
link: 'https://juejin.im/books',
|
||||
item: data.map(({ title, id, img, desc, createdAt, price }) => ({
|
||||
title,
|
||||
link: `https://juejin.im/book/${id}`,
|
||||
description: `
|
||||
<img src="${img}"><br>
|
||||
<strong>${title}</strong><br><br>
|
||||
${desc}<br>
|
||||
<strong>价格:</strong> ${price}元
|
||||
`,
|
||||
pubDate: new Date(createdAt).toUTCString(),
|
||||
guid: id,
|
||||
})),
|
||||
item: items,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -2,41 +2,38 @@ const got = require('@/utils/got');
|
||||
const util = require('./utils');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const category = ctx.params.category;
|
||||
const { category } = ctx.params;
|
||||
|
||||
const idResponse = await got({
|
||||
method: 'get',
|
||||
url: 'https://gold-tag-ms.juejin.im/v1/categories',
|
||||
headers: {
|
||||
Referer: `https://juejin.im/welcome/${category}`,
|
||||
'X-Juejin-Client': '',
|
||||
'X-Juejin-Src': 'web',
|
||||
'X-Juejin-Token': '',
|
||||
'X-Juejin-Uid': '',
|
||||
},
|
||||
url: 'https://apinew.juejin.im/tag_api/v1/query_category_briefs?show_type=0',
|
||||
});
|
||||
|
||||
const cat = idResponse.data.d.categoryList.find((item) => item.title === category);
|
||||
const id = cat.id;
|
||||
const cat = idResponse.data.data.find((item) => item.category_url === category);
|
||||
const id = cat.category_id;
|
||||
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: `https://timeline-merger-ms.juejin.im/v1/get_entry_by_timeline?src=web&limit=20&category=${id}`,
|
||||
headers: {
|
||||
Referer: `https://juejin.im/welcome/${category}`,
|
||||
method: 'post',
|
||||
url: 'https://apinew.juejin.im/recommend_api/v1/article/recommend_cate_feed',
|
||||
json: {
|
||||
id_type: 2,
|
||||
sort_type: 300,
|
||||
cate_id: id,
|
||||
cursor: '0',
|
||||
limit: 20,
|
||||
},
|
||||
});
|
||||
|
||||
let originalData = [];
|
||||
if (response.data.d && response.data.d.entrylist) {
|
||||
originalData = response.data.d.entrylist.slice(0, 5);
|
||||
if (response.data.data) {
|
||||
originalData = response.data.data.slice(0, 5);
|
||||
}
|
||||
const resultItems = await util.ProcessFeed(originalData, ctx.cache);
|
||||
|
||||
ctx.state.data = {
|
||||
title: `掘金${cat.name}`,
|
||||
link: `https://juejin.im/welcome/${category}`,
|
||||
description: `掘金${cat.name}`,
|
||||
title: `掘金${cat.category_name}`,
|
||||
link: `https://juejin.im/${category}`,
|
||||
description: `掘金${cat.category_name}`,
|
||||
item: resultItems,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -2,29 +2,16 @@ const got = require('@/utils/got');
|
||||
const util = require('./utils');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const collectionId = ctx.params.collectionId;
|
||||
const { collectionId } = ctx.params;
|
||||
|
||||
const collectPage = await got({
|
||||
method: 'get',
|
||||
url: `https://collection-set-ms.juejin.im/v1/getCollectionSetEntries?page=0&csId=${collectionId}&rankType=new&src=web`,
|
||||
headers: {
|
||||
Referer: `https://juejin.im/collection/${collectionId}`,
|
||||
},
|
||||
});
|
||||
|
||||
// 获取收藏夹文章内容
|
||||
const urlArg = collectPage.data.d.join('|');
|
||||
const posts = await got({
|
||||
method: 'get',
|
||||
url: `https://timeline-merger-ms.juejin.im/v1/get_entry_by_ids?src=web&page=0&pageSize=10&entryIds=${encodeURI(urlArg)}`,
|
||||
headers: {
|
||||
Referer: `https://juejin.im/collection/${collectionId}`,
|
||||
},
|
||||
url: `https://apinew.juejin.im/interact_api/v1/collectionSet/get?tag_id=${collectionId}&cursor=0`,
|
||||
});
|
||||
|
||||
let items = [];
|
||||
if (posts.data.d && posts.data.d.entrylist) {
|
||||
items = posts.data.d.entrylist.slice(0, 10);
|
||||
if (collectPage.data.data && collectPage.data.data.article_list) {
|
||||
items = collectPage.data.data.article_list.slice(0, 10);
|
||||
}
|
||||
|
||||
const result = await util.ProcessFeed(items, ctx.cache);
|
||||
|
||||
@@ -2,36 +2,23 @@ const got = require('@/utils/got');
|
||||
const util = require('./utils');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const userId = ctx.params.userId;
|
||||
const response = await new got({
|
||||
const { userId } = ctx.params;
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: `https://collection-set-ms.juejin.im/v1/getUserCollectionSet?src=web&page=0&pageSize=30&targetUserId=${userId}`,
|
||||
headers: {
|
||||
Referer: `https://juejin.im/user/${userId}/collections`,
|
||||
},
|
||||
url: `https://apinew.juejin.im/interact_api/v1/collectionSet/list?user_id=${userId}&cursor=0&limit=20`,
|
||||
});
|
||||
|
||||
// 获取用户所有收藏夹id
|
||||
const collectionId = response.data.d.collectionSets.map((item) => item.csId);
|
||||
const collectionId = response.data.data.map((item) => item.tag_id);
|
||||
|
||||
// 获取所有收藏夹文章内容
|
||||
async function getPostId(item) {
|
||||
const collectPage = await got({
|
||||
method: 'get',
|
||||
url: `https://collection-set-ms.juejin.im/v1/getCollectionSetEntries?page=0&csId=${item}&rankType=new&src=web`,
|
||||
headers: {
|
||||
Referer: `https://juejin.im/collection/${item}`,
|
||||
},
|
||||
url: `https://apinew.juejin.im/interact_api/v1/collectionSet/get?tag_id=${item}&cursor=0`,
|
||||
});
|
||||
const urlArg = collectPage.data.d.join('|');
|
||||
const posts = await got({
|
||||
method: 'get',
|
||||
url: `https://timeline-merger-ms.juejin.im/v1/get_entry_by_ids?src=web&page=0&pageSize=10&entryIds=${encodeURI(urlArg)}`,
|
||||
headers: {
|
||||
Referer: `https://juejin.im/collection/${item}`,
|
||||
},
|
||||
});
|
||||
return (posts.data.d && posts.data.d.entrylist.slice(0, 10)) || [];
|
||||
|
||||
return (collectPage.data.data && collectPage.data.data.article_list.slice(0, 10)) || [];
|
||||
}
|
||||
|
||||
const temp = await Promise.all(collectionId.map(getPostId));
|
||||
|
||||
@@ -2,19 +2,18 @@ const got = require('@/utils/got');
|
||||
const util = require('./utils');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const id = ctx.params.id;
|
||||
const { id } = ctx.params;
|
||||
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: `https://timeline-merger-ms.juejin.im/v1/get_entry_by_self?src=web&targetUid=${id}&type=post&order=createdAt`,
|
||||
headers: {
|
||||
Host: 'timeline-merger-ms.juejin.im',
|
||||
Origin: 'https://juejin.im',
|
||||
Referer: `https://juejin.im/user/${id}/posts`,
|
||||
method: 'post',
|
||||
url: 'https://apinew.juejin.im/content_api/v1/article/query_list',
|
||||
json: {
|
||||
user_id: id,
|
||||
sort_type: 2,
|
||||
},
|
||||
});
|
||||
const data = response.data.d.entrylist;
|
||||
const username = data && data[0] && data[0].user && data[0].user.username;
|
||||
const { data } = response.data;
|
||||
const username = data && data[0] && data[0].author_user_info && data[0].author_user_info.user_name;
|
||||
const resultItems = await util.ProcessFeed(data, ctx.cache);
|
||||
|
||||
ctx.state.data = {
|
||||
|
||||
+18
-20
@@ -2,41 +2,39 @@ const got = require('@/utils/got');
|
||||
const util = require('./utils');
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const tag = ctx.params.tag;
|
||||
const { tag } = ctx.params;
|
||||
|
||||
const idResponse = await got({
|
||||
method: 'get',
|
||||
url: 'https://gold-tag-ms.juejin.im/v1/tags',
|
||||
headers: {
|
||||
Referer: `https://juejin.im/tag/${encodeURI(tag)}`,
|
||||
'X-Juejin-Client': '',
|
||||
'X-Juejin-Src': 'web',
|
||||
'X-Juejin-Token': '',
|
||||
'X-Juejin-Uid': '',
|
||||
method: 'post',
|
||||
url: 'https://apinew.juejin.im/tag_api/v1/query_tag_detail',
|
||||
json: {
|
||||
key_word: tag,
|
||||
},
|
||||
});
|
||||
|
||||
const cat = idResponse.data.d.tags.filter((item) => item.title === tag)[0];
|
||||
const id = cat.id;
|
||||
const id = idResponse.data.data.tag_id;
|
||||
|
||||
const response = await got({
|
||||
method: 'get',
|
||||
url: `https://timeline-merger-ms.juejin.im/v1/get_tag_entry?src=web&tagId=${id}&page=0&pageSize=10&sort=rankIndex`,
|
||||
headers: {
|
||||
Referer: `https://juejin.im/tag/${encodeURI(tag)}`,
|
||||
method: 'post',
|
||||
url: 'https://apinew.juejin.im/recommend_api/v1/article/recommend_tag_feed',
|
||||
json: {
|
||||
id_type: 2,
|
||||
cursor: '0',
|
||||
tag_ids: [id],
|
||||
sort_type: 200,
|
||||
},
|
||||
});
|
||||
|
||||
let originalData = [];
|
||||
if (response.data.d && response.data.d.entrylist) {
|
||||
originalData = response.data.d.entrylist.slice(0, 10);
|
||||
if (response.data.data) {
|
||||
originalData = response.data.data.slice(0, 10);
|
||||
}
|
||||
const resultItems = await util.ProcessFeed(originalData, ctx.cache);
|
||||
|
||||
ctx.state.data = {
|
||||
title: `掘金${cat.title}`,
|
||||
link: `https://juejin.im/tag/${encodeURI(tag)}`,
|
||||
description: `掘金${cat.title}`,
|
||||
title: `掘金${tag}`,
|
||||
link: `https://juejin.im/tag/${encodeURIComponent(tag)}`,
|
||||
description: `掘金${tag}`,
|
||||
item: resultItems,
|
||||
};
|
||||
};
|
||||
|
||||
@@ -7,8 +7,7 @@ const got_ins = got.extend({
|
||||
});
|
||||
|
||||
module.exports = async (ctx) => {
|
||||
const category = ctx.params.category;
|
||||
const type = ctx.params.type;
|
||||
const { category, type } = ctx.params;
|
||||
|
||||
let id = 'all';
|
||||
let name = '';
|
||||
|
||||
+10
-15
@@ -31,27 +31,22 @@ const ProcessFeed = async (list, caches) =>
|
||||
await Promise.all(
|
||||
list.map(async (item) => {
|
||||
// 解析时间,补偿时区offset
|
||||
const pubdate = new Date();
|
||||
pubdate.setTime(Date.parse(item.createdAt) - 8 * 60 * 60 * 1000);
|
||||
const pubdate = new Date(parseInt(item.article_info.ctime) * 1000 - 8 * 60 * 60 * 1000);
|
||||
const link = `https://juejin.im/post/${item.article_id}`;
|
||||
// 列表上提取到的信息
|
||||
const single = {
|
||||
title: item.title,
|
||||
title: item.article_info.title,
|
||||
description: `${(item.content || item.summaryInfo || '无描述').replace(/[\x00-\x08\x0b-\x0c\x0e-\x1f\x7f]/g, '')}`,
|
||||
pubDate: pubdate.toUTCString(),
|
||||
author: item.user.username,
|
||||
link: item.originalUrl,
|
||||
guid: item.originalUrl,
|
||||
author: item.author_user_info.user_name,
|
||||
link,
|
||||
};
|
||||
|
||||
if (item.type === 'post') {
|
||||
// 使用tryGet方法从缓存获取内容。
|
||||
// 当缓存中无法获取到链接内容的时候,则使用load方法加载文章内容。
|
||||
const other = await caches.tryGet(item.originalUrl, async () => await load(item.originalUrl));
|
||||
// 合并解析后的结果集作为该篇文章最终的输出结果
|
||||
return Promise.resolve(Object.assign({}, single, other));
|
||||
} else {
|
||||
return Promise.resolve(single);
|
||||
}
|
||||
// 使用tryGet方法从缓存获取内容。
|
||||
// 当缓存中无法获取到链接内容的时候,则使用load方法加载文章内容。
|
||||
const other = await caches.tryGet(link, async () => await load(link));
|
||||
// 合并解析后的结果集作为该篇文章最终的输出结果
|
||||
return Promise.resolve(Object.assign({}, single, other));
|
||||
})
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user