This commit is contained in:
eric
2026-03-18 00:53:28 -05:00
parent 4d4ca04167
commit 742c293e14
4 changed files with 153 additions and 20 deletions

View File

@@ -37,7 +37,7 @@ export async function POST(request: NextRequest) {
const xiaohongshuUrl = String(formData.xiaohongshu_url || "").trim();
const xiaohongshuAvatarUrl = String(formData.xiaohongshu_avatar_url || formData.media || "").trim();
const gender = String(formData.gender || "").trim() || "\u65e0";
let intro = String(formData.intro || "").trim();
let intro = String(formData.intro || formData.reason || "").trim();
const firstTime = String(formData.first_time || "").trim();
const agreeRules = !!formData.agree_rules;
const status = String(formData.status || "").trim();
@@ -61,6 +61,24 @@ export async function POST(request: NextRequest) {
{ status: 400 }
);
}
if (!xiaohongshuUrl) {
return NextResponse.json(
{ ok: false, error: "请填写小红书主页链接或笔记链接" },
{ status: 400 }
);
}
if (!intro) {
return NextResponse.json(
{ ok: false, error: "请填写自我介绍" },
{ status: 400 }
);
}
if (intro.length < 20) {
return NextResponse.json(
{ ok: false, error: "自我介绍不少于20字" },
{ status: 400 }
);
}
const userId = getUserIdFromCookie(request) || generateAnonId();
@@ -68,6 +86,7 @@ export async function POST(request: NextRequest) {
/** occupation: 职业/城市,reason: 仅自我介绍 */
const occupationValue = profession || city;
const userInfo = String(formData.userInfo || "").trim();
const record: Record<string, unknown> = {
user_id: userId,
nickname,
@@ -87,6 +106,7 @@ export async function POST(request: NextRequest) {
first_time: firstTime,
is_volunteer: isVolunteer,
qualify,
userInfo: userInfo || "",
};
if (phone.trim()) {
record.phone = phone.trim();
@@ -177,6 +197,7 @@ async function tryPocketBaseDirect(
is_approved: qualify,
age_range: record.age_range ?? "",
first_time: record.first_time ?? "",
userInfo: record.userInfo ?? "",
};
if (record.phone != null && String(record.phone).trim()) {
body.phone = record.phone;

View File

@@ -13,16 +13,15 @@ function getSalonApiBase(): string {
return resolvePaymentApiUrl();
}
/** 代理到 salonapi 获取小红书用户资料 */
/** 代理到 salonapi 获取小红书用户资料,支持主页链接、笔记链接 xhslink.com/o/ */
export async function POST(request: NextRequest) {
try {
const body = await request.json();
const url = String(body?.url || "").trim();
const url = String(body?.url || body?.id || "").trim();
if (!url) {
return NextResponse.json({ ok: false, error: "请输入小红书链接" }, { status: 400 });
}
const apiBase = getSalonApiBase();
const res = await fetch(`${apiBase}/api/salon/xiaohongshu/profile`, {
method: "POST",

View File

@@ -1,28 +1,31 @@
import { NextRequest, NextResponse } from "next/server";
/** 支持:xiaohongshu.com/user/profile/xxx、xhslink.com/user/profile/xxx、xhslink.com/m/xxx 短链 */
/** 支持:主页 xiaohongshu.com/user/profile/xxx、xhslink.com/m/xxx;笔记 xhslink.com/o/xxx、xiaohongshu.com/explore/xxx */
const XH_PROFILE_PATTERN = /^https?:\/\/(www\.)?(xiaohongshu\.com|xhslink\.com)\/user\/profile\/[a-zA-Z0-9_-]+/i;
const XH_SHORT_PATTERN = /^https?:\/\/xhslink\.com\/m\/[a-zA-Z0-9_-]+/i;
const XH_NOTE_PATTERN = /^https?:\/\/(xhslink\.com\/o\/|(www\.)?xiaohongshu\.com\/explore\/)[a-zA-Z0-9_-]+/i;
function isValidUrl(url: string): boolean {
return XH_PROFILE_PATTERN.test(url) || XH_SHORT_PATTERN.test(url);
const s = url.trim();
if (!s) return false;
if (XH_PROFILE_PATTERN.test(s) || XH_SHORT_PATTERN.test(s) || XH_NOTE_PATTERN.test(s)) return true;
return false;
}
export async function POST(request: NextRequest) {
try {
const body = await request.json();
const url = String(body?.url || "").trim();
const url = String(body?.url || body?.id || "").trim();
if (!url) {
return NextResponse.json({ valid: false, error: "请输入小红书链接" }, { status: 400 });
}
const valid = isValidUrl(url);
if (!valid) {
return NextResponse.json({ valid: false, error: "小红书link异常" }, { status: 200 });
if (!isValidUrl(url)) {
return NextResponse.json({ valid: false, error: "请输入有效的主页链接或笔记链接(xhslink.com/m/xxx 或 xhslink.com/o/xxx)" }, { status: 200 });
}
return NextResponse.json({ valid: true });
return NextResponse.json({ valid: true, url });
} catch {
return NextResponse.json({ valid: false, error: "校验失败" }, { status: 500 });
}