rsshub
Version:
Make RSS Great Again!
103 lines (97 loc) • 3.73 kB
text/typescript
import { Route } from '@/types';
import ofetch from '@/utils/ofetch';
import { getTagList, parseList, ProcessFeed } from './utils';
import { Tag } from './types';
export const route: Route = {
path: '/aicoding/:tag?/:sort?',
categories: ['programming'],
example: '/juejin/aicoding',
parameters: {
tag: {
description: '标签,留空为全部',
options: [
{ value: 'AI编程', label: 'AI编程' },
{ value: 'Claude', label: 'Claude' },
{ value: 'Trae', label: 'Trae' },
{ value: 'MCP', label: 'MCP' },
{ value: 'Cursor', label: 'Cursor' },
{ value: 'Cline', label: 'Cline' },
{ value: 'Github Copilot', label: 'Github Copilot' },
{ value: 'bolt', label: 'bolt' },
{ value: 'V0', label: 'V0' },
{ value: 'replit', label: 'replit' },
{ value: 'Warp', label: 'Warp' },
{ value: 'Visual Studio IntelliCode', label: 'Visual Studio IntelliCode' },
{ value: 'WindSurf', label: 'WindSurf' },
{ value: '豆包MarsCode', label: '豆包MarsCode' },
{ value: '通义灵码', label: '通义灵码' },
{ value: 'Devin', label: 'Devin' },
{ value: '文心快码', label: '文心快码' },
{ value: 'imgcook', label: 'imgcook' },
{ value: 'CodeWhisperer', label: 'CodeWhisperer' },
{ value: 'Lovable', label: 'Lovable' },
{ value: 'FittenCode', label: 'FittenCode' },
{ value: 'Solo', label: 'Solo' },
{ value: 'CodeFuse', label: 'CodeFuse' },
{ value: 'Tabnine', label: 'Tabnine' },
],
},
sort: {
description: '排序方式,默认为最新发布',
default: 'hot',
options: [
{ value: 'hot', label: '热门' },
{ value: 'latest', label: '最新' },
],
},
},
features: {
requireConfig: false,
requirePuppeteer: false,
antiCrawler: false,
supportBT: false,
supportPodcast: false,
supportScihub: false,
},
radar: [
{
source: ['juejin.cn/books'],
},
],
name: 'AI 编程',
maintainers: ['TonyRL'],
handler,
url: 'aicoding.juejin.cn',
};
async function handler(ctx) {
const { tag, sort } = ctx.req.param();
const sortType = sort === 'hot' ? 1 : 2;
let tagList: {
tag_id: string;
tag: Tag;
}[],
currentTag: Tag | undefined,
tagId: string | undefined;
if (tag) {
tagList = await getTagList();
currentTag = tagList.find((item) => item.tag.tag_name === tag)?.tag;
tagId = currentTag?.tag_id;
}
const response = await ofetch('https://api.juejin.cn/content_api/v1/aicoding/content', {
method: 'POST',
body: {
sort_type: sortType,
cursor: '',
limit: 10,
tag_ids: tagId ? [tagId] : undefined,
},
});
const list = parseList(response.data.map((item) => item.article_pack || item.short_msg_pack));
const items = await ProcessFeed(list);
return {
title: `${currentTag ? `${currentTag.tag_name} - ` : ''}AI 编程`,
link: `https://aicoding.juejin.cn/?contentType=${sortType}${tagId ? `&tagId=${tagId}` : ''}`,
image: currentTag ? currentTag.icon : 'https://lf-web-assets.juejin.cn/obj/juejin-web/goofy_deploy_edenx/toutiao-fe/xitu_juejin_aicoding/favicon.ico',
item: items,
};
}