liushen-api.js
· 2.9 KiB · JavaScript
Raw
import HOME_HTML from './home.html';
import SCREENSHOT_HTML from './screenshot.html';
export default {
async fetch(request, env, ctx) {
// 获取请求的 URL 和路径
const url = new URL(request.url);
const path = url.pathname;
// 路由不同的 API 接口
if (path.startsWith('/api/screenshot')) {
return handleScreenshotRequest(url);
}
// 处理主页的请求
if (path === '/') {
return new Response(HOME_HTML, {
status: 200,
headers: {
"content-type": "text/html"
}
});
}
if (path === '/screenshot') {
return new Response(SCREENSHOT_HTML, {
status: 200,
headers: {
"content-type": "text/html"
}
});
}
return new Response('Invalid API endpoint', { status: 404 });
}
}
// 处理 /api/screenshot 请求
async function handleScreenshotRequest(url) {
const targetUrl = url.searchParams.get('url') || 'https://www.liushen.fun/';
const width = url.searchParams.get('width') || 400;
const height = url.searchParams.get('height') || 250;
const method = url.searchParams.get('method') || '1'; // 默认为 mshot 方法
console.log(targetUrl, width, height, method);
// 构造第一个截图 API 请求地址 (mshots)
const screenshotUrl1 = `https://s0.wp.com/mshots/v1/${encodeURIComponent(targetUrl)}?w=${width}&h=${height}`;
// 构造第二个截图 API 请求地址 (urlscan)
const screenshotUrl2 = `https://urlscan.io/liveshot/?width=${width}&height=${height}&url=${encodeURIComponent(targetUrl)}`;
try {
let response;
// 根据 method 参数选择首选的截图方式
if (method === '1') {
// 请求 mshot
response = await fetchWithUA(screenshotUrl1);
if (!response.ok) {
console.log("mshots failed, trying urlscan");
response = await fetchWithUA(screenshotUrl2); // 如果 mshots 失败,尝试 urlscan
}
} else {
// 请求 urlscan
response = await fetchWithUA(screenshotUrl2);
if (!response.ok) {
console.log("urlscan failed, trying mshots");
response = await fetchWithUA(screenshotUrl1); // 如果 urlscan 失败,尝试 mshots
}
}
// 如果两个 API 都失败,返回 403 错误
if (!response.ok) {
console.log("Both APIs failed, returning 403");
return new Response("Both screenshot APIs failed.", { status: 403 });
}
return new Response(response.body, response);
} catch (error) {
// 捕获异常并返回 403 错误
console.log("Error occurred:", error);
return new Response("Error occurred while processing the request.", { status: 403 });
}
}
// 添加带有 User-Agent 的 fetch 方法
async function fetchWithUA(url) {
return await fetch(url, {
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'
}
});
}
1 | import HOME_HTML from './home.html'; |
2 | |
3 | import SCREENSHOT_HTML from './screenshot.html'; |
4 | |
5 | export default { |
6 | async fetch(request, env, ctx) { |
7 | // 获取请求的 URL 和路径 |
8 | const url = new URL(request.url); |
9 | const path = url.pathname; |
10 | |
11 | // 路由不同的 API 接口 |
12 | if (path.startsWith('/api/screenshot')) { |
13 | return handleScreenshotRequest(url); |
14 | } |
15 | |
16 | // 处理主页的请求 |
17 | if (path === '/') { |
18 | return new Response(HOME_HTML, { |
19 | status: 200, |
20 | headers: { |
21 | "content-type": "text/html" |
22 | } |
23 | }); |
24 | } |
25 | |
26 | if (path === '/screenshot') { |
27 | return new Response(SCREENSHOT_HTML, { |
28 | status: 200, |
29 | headers: { |
30 | "content-type": "text/html" |
31 | } |
32 | }); |
33 | } |
34 | |
35 | return new Response('Invalid API endpoint', { status: 404 }); |
36 | } |
37 | } |
38 | |
39 | // 处理 /api/screenshot 请求 |
40 | async function handleScreenshotRequest(url) { |
41 | const targetUrl = url.searchParams.get('url') || 'https://www.liushen.fun/'; |
42 | const width = url.searchParams.get('width') || 400; |
43 | const height = url.searchParams.get('height') || 250; |
44 | const method = url.searchParams.get('method') || '1'; // 默认为 mshot 方法 |
45 | |
46 | console.log(targetUrl, width, height, method); |
47 | |
48 | // 构造第一个截图 API 请求地址 (mshots) |
49 | const screenshotUrl1 = `https://s0.wp.com/mshots/v1/${encodeURIComponent(targetUrl)}?w=${width}&h=${height}`; |
50 | // 构造第二个截图 API 请求地址 (urlscan) |
51 | const screenshotUrl2 = `https://urlscan.io/liveshot/?width=${width}&height=${height}&url=${encodeURIComponent(targetUrl)}`; |
52 | |
53 | try { |
54 | let response; |
55 | |
56 | // 根据 method 参数选择首选的截图方式 |
57 | if (method === '1') { |
58 | // 请求 mshot |
59 | response = await fetchWithUA(screenshotUrl1); |
60 | if (!response.ok) { |
61 | console.log("mshots failed, trying urlscan"); |
62 | response = await fetchWithUA(screenshotUrl2); // 如果 mshots 失败,尝试 urlscan |
63 | } |
64 | } else { |
65 | // 请求 urlscan |
66 | response = await fetchWithUA(screenshotUrl2); |
67 | if (!response.ok) { |
68 | console.log("urlscan failed, trying mshots"); |
69 | response = await fetchWithUA(screenshotUrl1); // 如果 urlscan 失败,尝试 mshots |
70 | } |
71 | } |
72 | |
73 | // 如果两个 API 都失败,返回 403 错误 |
74 | if (!response.ok) { |
75 | console.log("Both APIs failed, returning 403"); |
76 | return new Response("Both screenshot APIs failed.", { status: 403 }); |
77 | } |
78 | |
79 | return new Response(response.body, response); |
80 | } catch (error) { |
81 | // 捕获异常并返回 403 错误 |
82 | console.log("Error occurred:", error); |
83 | return new Response("Error occurred while processing the request.", { status: 403 }); |
84 | } |
85 | } |
86 | |
87 | // 添加带有 User-Agent 的 fetch 方法 |
88 | async function fetchWithUA(url) { |
89 | return await fetch(url, { |
90 | headers: { |
91 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36' |
92 | } |
93 | }); |
94 | } |
95 |