Skip to content

Commit bdb4fb9

Browse files
author
Taois
committed
feat: 更新mcp
1 parent f5c0630 commit bdb4fb9

File tree

5 files changed

+398
-1
lines changed

5 files changed

+398
-1
lines changed

drpy-node-bundle/localDsCoreTest.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,7 @@ const f = await getEngine('央视大全[官]', {
3131
}, {requestHost: 'http://127.0.0.1:5757',proxyPath:'https://dh5wswx02.v.cntv.cn/asp/h5e/hls/2000/0303000a/3/default/b90af013c16e44de9e4f1f56dab91f63/1.ts'})
3232

3333
const [statuCode, contentType, buffer, headers] = f;
34-
console.log('resutl: header:', headers, 'buffer length:', buffer.length);
34+
console.log('resutl: header:', headers, 'buffer length:', buffer.length);
35+
36+
const g = await getEngine('360影视[官]', {do: 'ds', ac: 'list', t: '2'})
37+
console.log(g)
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
/*
2+
@header({
3+
searchable: 2,
4+
filterable: 1,
5+
quickSearch: 0,
6+
title: '360影视[官]',
7+
'类型': '影视',
8+
lang: 'ds'
9+
})
10+
*/
11+
12+
var rule = {
13+
title: '360影视[官]',
14+
host: 'https://www.360kan.com',
15+
homeUrl: 'https://api.web.360kan.com/v1/rank?cat=2&size=9',
16+
detailUrl: 'https://api.web.360kan.com/v1/detail?cat=fyclass&id=fyid',
17+
searchUrl: 'https://api.so.360kan.com/index?force_v=1&kw=**&from=&pageno=fypage&v_ap=1&tab=all',
18+
url: 'https://api.web.360kan.com/v1/fyfilter&size=35&pageno=fypage&callback=',
19+
filterable: 1,
20+
filter_url: 'filter/list?catid=fyclass&rank={{fl.排序}}&cat={{fl.类型}}&year={{fl.年代}}&area={{fl.地区}}',
21+
filter: "H4sIAAAAAAAAA+2YS08jRxCA/4vPHGbMvrK3/IJcor1Eq4gDUqIlbLQhkVYrJINt1jYPA8vLa2MgYJtlMdhAiD1e4z8z3TP+Fxm7Xu0oGs2BQBRx81fVXV3V3VNV7XcxO/b8u3exV5NvY89jXrOjyouxsdj0xE+TJv82MfXr5HDgdCBW6eN+8nggDiA2O4bSrZLK1lCKQDov09TJNOoQeF7u2O2WaB4A6fTcqk5soQ6BbdbWVLtDNgHYZrYm6yHwvNy51z2heQA8r/JebCKwL5kd18mSLwCsmz/1ttZIB2DE5210JL4B8Lyt937WoXkA7Kdzorqb5CcA6dwv+/5ZA3UIbLO+5GfKZBOAfckf+Ye8LwCsW1lQ+QvSAbDNZE7PfySbAOJL1VtdYF+GwDbT126Hzg9h9uVACxdOlRpqyZELxxzpwi2kg/Fk/KjWL8jCbquuit1+taBb5zgCYXSEyjd0+4Y3ZAgc9GUjGEFBA/Dh3KyIDoF0/b1PokNgm9sVXTolmwCy3qa53qY5z19sig6B9+HmT9EhsG65oZwq6QAiH077yu0cGodDHOVw4lb8EcqGPw35uMjHTXlc5HFTbovcNuWWyC1Dbn/F8uCnIX8m8mem/KnIn5ryJyJ/Ysofi/yxKZd4bTNeW+K1zXhtidc247UlLtuMy5K4LDMuS+KyzLgsicuSuHTxSm9/Qs3UzPdvJyfejJy6XllXTl5OnXn01HUp4ffWvGRd7+yjtTcT069+eD0jSw2HuK3c6JCpiZnJX0ZGqfy2qnT985Qx6ufXP07PDBx7ORaL31aJ8o8TUhYQopSM0BQXUvbCykI/2VWtecoSAGxz7lol82QTIFIKXyi6ziLpADj2elUtUdlDiJL6Va6pettcvobAWbBS9s93KQsC8HqN5aBI0noAHPvuut6pUOxDMLdNnV0rp05LDmFEHdYwJNO6QBkfQQpj1b2hm4gQqZm4uyIGcFdFLKwYhRWxsOIXVqj0VkPl9tXuATc8xA9l56Hs/OfKzvitlZ1UU+UPvVqCPgtm/qJKe67jyAhh9ne17J1yKQHgbzWRlakIkrw+q2VuAAHYr7Oe38iQUwBmIk3tGYk0APZ2Y09fcbIE4HmFj+4XfikASE65dNurnFOGwL7MLakSvYQQjHzTPyRfECSHXasGrwfAulZLZ6iMIvC+NNZUqkf7AsBZtfvBn6dyiGC+ys7odYVgFBG9WZAiMgD5AC6Mlx5AlBebf/W716EYEHhes+t36WwRWLde1zkqsQj/j1dZ2AvqtBZcD9IB3EuSGeaPR7eVPwJP/ANODQBRGpdBaQ5uduXSKNXA/EXWN2Q2As/u5FW6RVMBojSFYV+WWljvF6gMIETJcHrlWBpwBNbNLXqZJukAWHfR0SnKcAjsS7ujk7Q1CDxv/0AVqQNFMNpPL8sxAMi1cKTpReCr7VyoOmU/BLaZ6gXfPdkE4AzQWw1WoQwAEOWBoRMn4icC60L+y/KKOV2gTIUQ0rjLvM8V4zEAILqyzvENBojSzntHN1JNEOQhtGg82AD+Vk+zdPTCUsP+UN2mMYKZRnzz4mtRI5Du2xeigt9Gj+ttnoz85zcikjfOktf5MPrfoCm6k3wclkv/scl/aNPvvU2XeG0z3n+3fQ9A4rXMeC2J1zLjtSReS+IdeQYg3FeBnv0LfL9z7fwYAAA=",
22+
filter_def: {},
23+
headers: {
24+
'User-Agent': 'MOBILE_UA'
25+
},
26+
timeout: 5000,
27+
class_name: '电视剧&电影&综艺&动漫',
28+
class_url: '2&1&3&4',
29+
limit: 5,
30+
multi: 1,
31+
searchable: 2,
32+
play_parse: true,
33+
lazy: async function () {
34+
let {input} = this;
35+
if (input.includes('?') && !input.includes('video?vid=')) {
36+
input = input.split("?")[0];
37+
}
38+
return input
39+
},
40+
推荐: 'json:data;title;cover;comment;cat+ent_id;description',
41+
一级: 'json:data.movies;title;cover;pubdate;id;description',
42+
二级: async function () {
43+
let {input, fetch_params} = this;
44+
let html = JSON.parse(await request(input, fetch_params));
45+
let data = html.data;
46+
let title = data.title;
47+
let img = data.cdncover;
48+
let vod_type = data.moviecategory.join(",");
49+
let area = data.area.join(",");
50+
let director = data.director.join(",");
51+
let actor = data.actor.join(",");
52+
let content = data.description;
53+
let base_vod = {
54+
vod_id: input,
55+
vod_name: title,
56+
type_name: vod_type,
57+
vod_actor: actor,
58+
vod_director: director,
59+
vod_content: content,
60+
vod_remarks: area,
61+
vod_pic: urljoin(input, img)
62+
};
63+
let delta = 50;
64+
let vod_play = {};
65+
let sites = data.playlink_sites;
66+
for (const site of sites) {
67+
let playList = "";
68+
let vodItems = [];
69+
// print(data)
70+
if (data.allupinfo) {
71+
let total = parseInt(data.allupinfo[site]);
72+
// print(total)
73+
for (let j = 1; j < total; j += delta) {
74+
let end = Math.min(total, j + delta - 1);
75+
// print(end)
76+
let url2 = buildUrl(input, {start: j, end: end, site: site});
77+
let vod_data = JSON.parse(await request(url2), fetch_params).data;
78+
if (vod_data != null) {
79+
if (vod_data.allepidetail) {
80+
vod_data = vod_data.allepidetail[site];
81+
vod_data.forEach(function (item, index) {
82+
vodItems.push((item.playlink_num || "") + "$" + urlDeal(item.url || ""))
83+
})
84+
} else {
85+
vod_data = vod_data.defaultepisode;
86+
vod_data.forEach(function (item, index) {
87+
vodItems.push((item.period || "") + (item.name || "") + "$" + urlDeal(item.url) || "")
88+
})
89+
}
90+
}
91+
}
92+
} else {
93+
let item = data.playlinksdetail[site];
94+
vodItems.push((item.sort || "") + "$" + urlDeal(item.default_url || ""))
95+
}
96+
if (vodItems.length > 0) {
97+
playList = vodItems.join("#")
98+
}
99+
if (playList.length < 1) {
100+
continue;
101+
}
102+
vod_play[site] = playList
103+
}
104+
let tabs = Object.keys(vod_play);
105+
let playUrls = [];
106+
for (let id in tabs) {
107+
// print("id:" + id);
108+
playUrls.push(vod_play[tabs[id]])
109+
}
110+
if (tabs.length > 0) {
111+
let vod_play_from = tabs.join("$$$");
112+
let vod_play_url = playUrls.join("$$$");
113+
base_vod.vod_play_from = vod_play_from;
114+
base_vod.vod_play_url = vod_play_url
115+
}
116+
return base_vod;
117+
},
118+
搜索: 'json:data.longData.rows;titleTxt||titlealias;cover;cat_name;cat_id+en_id;description',
119+
}

drpy-node-mcp/index.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import * as fsTools from "./tools/fsTools.js";
1212
import * as spiderTools from "./tools/spiderTools.js";
1313
import * as dbTools from "./tools/dbTools.js";
1414
import * as systemTools from "./tools/systemTools.js";
15+
import * as apiTools from "./tools/apiTools.js";
1516

1617
const server = new Server(
1718
{
@@ -43,6 +44,9 @@ const toolHandlers = {
4344
validate_spider: spiderTools.validate_spider,
4445
check_syntax: spiderTools.check_syntax,
4546

47+
// API Tools
48+
get_drpy_api_list: apiTools.get_drpy_api_list,
49+
4650
// DB Tools
4751
sql_query: dbTools.sql_query,
4852

@@ -130,6 +134,14 @@ server.setRequestHandler(ListToolsRequestSchema, async () => {
130134
properties: {}
131135
},
132136
},
137+
{
138+
name: "get_drpy_api_list",
139+
description: "Get the full list of drpy-node API interfaces with parameters and return examples",
140+
inputSchema: {
141+
type: "object",
142+
properties: {}
143+
},
144+
},
133145
{
134146
name: "fetch_spider_url",
135147
description: "Fetch a URL using drpy-node's request library to debug connectivity and anti-crawling measures (UA/headers).",

0 commit comments

Comments
 (0)