Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions src/app/api/douban/categories/route.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { NextResponse } from 'next/server';

import { getCacheTime } from '@/lib/config';
import { fetchDoubanData } from '@/lib/douban';
import { fetchDoubanData, resolveDoubanUrl } from '@/lib/douban';
import { DoubanItem, DoubanResult } from '@/lib/types';

interface DoubanCategoryApiResponse {
Expand Down Expand Up @@ -61,7 +61,9 @@ export async function GET(request: Request) {
);
}

const target = `https://m.douban.com/rexxar/api/v2/subject/recent_hot/${kind}?start=${pageStart}&limit=${pageLimit}&category=${category}&type=${type}`;
const target = resolveDoubanUrl(
`https://m.douban.com/rexxar/api/v2/subject/recent_hot/${kind}?start=${pageStart}&limit=${pageLimit}&category=${category}&type=${type}`
);

try {
// 调用豆瓣 API
Expand Down
7 changes: 4 additions & 3 deletions src/app/api/douban/recommends/route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import { NextRequest, NextResponse } from 'next/server';

import { getCacheTime } from '@/lib/config';
import { fetchDoubanData } from '@/lib/douban';
import { fetchDoubanData, resolveDoubanUrl } from '@/lib/douban';
import { DoubanResult } from '@/lib/types';

interface DoubanRecommendApiResponse {
Expand Down Expand Up @@ -78,7 +78,9 @@ export async function GET(request: NextRequest) {
tags.push(platform);
}

const baseUrl = `https://m.douban.com/rexxar/api/v2/${kind}/recommend`;
const baseUrl = resolveDoubanUrl(
`https://m.douban.com/rexxar/api/v2/${kind}/recommend`
);
const params = new URLSearchParams();
params.append('refresh', '0');
params.append('start', pageStart.toString());
Expand All @@ -92,7 +94,6 @@ export async function GET(request: NextRequest) {
}

const target = `${baseUrl}?${params.toString()}`;
console.log(target);
try {
const doubanData = await fetchDoubanData<DoubanRecommendApiResponse>(
target
Expand Down
10 changes: 7 additions & 3 deletions src/app/api/douban/route.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { NextResponse } from 'next/server';

import { getCacheTime } from '@/lib/config';
import { fetchDoubanData } from '@/lib/douban';
import { fetchDoubanData, resolveDoubanUrl } from '@/lib/douban';
import { DoubanItem, DoubanResult } from '@/lib/types';

interface DoubanApiResponse {
Expand Down Expand Up @@ -57,7 +57,9 @@ export async function GET(request: Request) {
return handleTop250(pageStart);
}

const target = `https://movie.douban.com/j/search_subjects?type=${type}&tag=${tag}&sort=recommend&page_limit=${pageSize}&page_start=${pageStart}`;
const target = resolveDoubanUrl(
`https://movie.douban.com/j/search_subjects?type=${type}&tag=${tag}&sort=recommend&page_limit=${pageSize}&page_start=${pageStart}`
);

try {
// 调用豆瓣 API
Expand Down Expand Up @@ -96,7 +98,9 @@ export async function GET(request: Request) {
}

function handleTop250(pageStart: number) {
const target = `https://movie.douban.com/top250?start=${pageStart}&filter=`;
const target = resolveDoubanUrl(
`https://movie.douban.com/top250?start=${pageStart}&filter=`
);

// 直接使用 fetch 获取 HTML 页面
const controller = new AbortController();
Expand Down
47 changes: 47 additions & 0 deletions src/lib/douban.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,53 @@
* @param url 请求的URL
* @returns Promise<T> 返回指定类型的数据
*/

export type DoubanProxyType =
| 'direct'
| 'cors-proxy-zwei'
| 'cmliussss-cdn-tencent'
| 'cmliussss-cdn-ali'
| 'cors-anywhere'
| 'custom';

export function getDoubanProxyConfig(): {
proxyType: DoubanProxyType;
proxyUrl: string;
} {
const proxyType =
(process.env.NEXT_PUBLIC_DOUBAN_PROXY_TYPE || 'cmliussss-cdn-tencent') as DoubanProxyType;
const proxyUrl = process.env.NEXT_PUBLIC_DOUBAN_PROXY || '';

return {
proxyType,
proxyUrl,
};
}

export function resolveDoubanUrl(url: string): string {
const { proxyType, proxyUrl } = getDoubanProxyConfig();

switch (proxyType) {
case 'cors-proxy-zwei':
return `https://ciao-cors.is-an.org/${encodeURIComponent(url)}`;
case 'cmliussss-cdn-tencent':
return url
.replace('https://m.douban.com', 'https://m.douban.cmliussss.net')
.replace('https://movie.douban.com', 'https://movie.douban.cmliussss.net');
case 'cmliussss-cdn-ali':
return url
.replace('https://m.douban.com', 'https://m.douban.cmliussss.com')
.replace('https://movie.douban.com', 'https://movie.douban.cmliussss.com');
case 'cors-anywhere':
return `https://cors-anywhere.com/${url}`;
case 'custom':
return proxyUrl ? `${proxyUrl}${encodeURIComponent(url)}` : url;
case 'direct':
default:
return url;
}
}

export async function fetchDoubanData<T>(url: string): Promise<T> {
// 添加超时控制
const controller = new AbortController();
Expand Down