fix: update Makerworld import logic

This commit is contained in:
Tautvydas Derzinskas committed 2026-09-20 18:43:14 +02:00
1 parent a5f355dde6
commit 3bc4f9c96d
2 files changed
+15 -14

No files matched your search

+11 -6
View File
@@ -1,5 +1,5 @@
import { IMPORT_BROWSER_USER_AGENT, IMPORT_TIMEOUT_SECONDS } from "../config";
import { fetchViaFlaresolverr, isFlaresolverrEnabled, looksLikeCloudflareBlock } from "./flaresolverr";
import { extractJsonFromBrowserBody, fetchViaFlaresolverr, isFlaresolverrEnabled, looksLikeCloudflareBlock } from "./flaresolverr";
import { decodeHtmlEntities, htmlToPlainText, type ImportedAuthorInfo, type ImportedPageMetadata } from "./importResolvers";
import { maybeSleep, sleep } from "../utils/concurrency";
import {
@@ -123,6 +123,15 @@ export async function verifyMakerworldCookie(rawCookieOrToken: string): Promise<
redirect: "follow",
signal: controller.signal,
});
if (res.status === 403 && isFlaresolverrEnabled() && looksLikeCloudflareBlock(res.headers)) {
// This endpoint answers 200 with an empty body through FlareSolverr's browser when the
// session isn't actually logged in, so a bare status check would accept any string here.
// Assert on the parsed body instead -- only a genuinely authenticated session has a `uid`.
const solved = await fetchViaFlaresolverr(SELF_PREFERENCE_URL, `token=${bearerToken}`);
if (!solved) return false;
const data = extractJsonFromBrowserBody(solved.body);
return isRecord(data) && data.uid != null;
}
return res.ok;
} catch {
return false;
@@ -179,11 +188,7 @@ async function fetchAuthorProfileJson(uid: string, paceMs?: number): Promise<unk
if (res.status === 403 && isFlaresolverrEnabled() && looksLikeCloudflareBlock(res.headers)) {
const solved = await fetchViaFlaresolverr(url, null);
if (!solved) return null;
try {
return JSON.parse(solved.body);
} catch {
return null;
}
return extractJsonFromBrowserBody(solved.body);
}
if (!res.ok) return null;
const text = await res.text();
@@ -1,5 +1,5 @@
import { IMPORT_BROWSER_USER_AGENT, IMPORT_TIMEOUT_SECONDS } from "../config";
import { fetchViaFlaresolverr, isFlaresolverrEnabled, looksLikeCloudflareBlock } from "./flaresolverr";
import { extractJsonFromBrowserBody, fetchViaFlaresolverr, isFlaresolverrEnabled, looksLikeCloudflareBlock } from "./flaresolverr";
import { maybeSleep } from "../utils/concurrency";
import {
isCaptchaChallenge,
@@ -60,14 +60,10 @@ async function fetchCollectionJson(url: string, bearerToken: string | null, pace
try {
const res = await fetch(url, { headers: collectionHeaders(bearerToken), redirect: "follow", signal: controller.signal });
if (res.status === 403 && isFlaresolverrEnabled() && looksLikeCloudflareBlock(res.headers)) {
const solved = await fetchViaFlaresolverr(url, null);
const solved = await fetchViaFlaresolverr(url, bearerToken ? `token=${bearerToken}` : null);
if (!solved) return null;
let data: unknown;
try {
data = JSON.parse(solved.body);
} catch {
return null;
}
const data = extractJsonFromBrowserBody(solved.body);
if (data === null) return null;
if (isCaptchaChallenge(data)) {
noteCaptchaChallenge();
throw new MakerworldCaptchaError();