remake modifiers

This commit is contained in:
SNEK WAIFU
2026-05-14 04:28:10 +07:00
parent 11b1228c5d
commit 3cc0c3317f
3 changed files with 292 additions and 95 deletions

View File

@@ -1,93 +1,207 @@
import cors from "cors";
import { Router } from "express";
import { slow, limiter } from "../utils/limit-options";
// EPorner
import { getEporner } from "../controller/eporner/epornerGet";
import { searchEporner } from "../controller/eporner/epornerSearch";
import { relatedEporner } from "../controller/eporner/epornerGetRelated";
import { randomEporner } from "../controller/eporner/epornerRandom";
// TXXX
import { getTxxx } from "../controller/txxx/txxxGet";
import { searchTxxx } from "../controller/txxx/txxxSearch";
import { relatedTxxx } from "../controller/txxx/txxxGetRelated";
import { randomTxxx } from "../controller/txxx/txxxRandom";
// PornHub
import { getPornhub } from "../controller/pornhub/pornhubGet";
import { searchPornhub } from "../controller/pornhub/pornhubSearch";
import { randomPornhub } from "../controller/pornhub/pornhubRandom";
import { relatedPornhub } from "../controller/pornhub/pornhubGetRelated";
// XNXX
import { getXnxx } from "../controller/xnxx/xnxxGet";
import { searchXnxx } from "../controller/xnxx/xnxxSearch";
import { relatedXnxx } from "../controller/xnxx/xnxxGetRelated";
import { randomXnxx } from "../controller/xnxx/xnxxRandom";
// RedTube
import { getRedtube } from "../controller/redtube/redtubeGet";
import { searchRedtube } from "../controller/redtube/redtubeSearch";
import { relatedRedtube } from "../controller/redtube/redtubeGetRelated";
import { randomRedtube } from "../controller/redtube/redtubeRandom";
// Xvideos
import { getXvideos } from "../controller/xvideos/xvideosGet";
import { searchXvideos } from "../controller/xvideos/xvideosSearch";
import { randomXvideos } from "../controller/xvideos/xvideosRandom";
import { relatedXvideos } from "../controller/xvideos/xvideosGetRelated";
// Xhamster
import { getXhamster } from "../controller/xhamster/xhamsterGet";
import { searchXhamster } from "../controller/xhamster/xhamsterSearch";
import { randomXhamster } from "../controller/xhamster/xhamsterRandom";
import { relatedXhamster } from "../controller/xhamster/xhamsterGetRelated";
// YouPorn
import { getYouporn } from "../controller/youporn/youpornGet";
import { searchYouporn } from "../controller/youporn/youpornSearch";
import { relatedYouporn } from "../controller/youporn/youpornGetRelated";
import { randomYouporn } from "../controller/youporn/youpornRandom";
function scrapeRoutes() {
const router = Router();
router.get("/pornhub/get", cors(), slow, limiter, getPornhub);
router.get("/pornhub/search", cors(), slow, limiter, searchPornhub);
router.get("/pornhub/random", cors(), slow, limiter, randomPornhub);
router.get("/pornhub/related", cors(), slow, limiter, relatedPornhub);
router.get("/xnxx/get", cors(), slow, limiter, getXnxx);
router.get("/xnxx/search", cors(), slow, limiter, searchXnxx);
router.get("/xnxx/related", cors(), slow, limiter, relatedXnxx);
router.get("/xnxx/random", cors(), slow, limiter, randomXnxx);
router.get("/redtube/get", cors(), slow, limiter, getRedtube);
router.get("/redtube/search", cors(), slow, limiter, searchRedtube);
router.get("/redtube/related", cors(), slow, limiter, relatedRedtube);
router.get("/redtube/random", cors(), slow, limiter, randomRedtube);
router.get("/xvideos/get", cors(), slow, limiter, getXvideos);
router.get("/xvideos/search", cors(), slow, limiter, searchXvideos);
router.get("/xvideos/random", cors(), slow, limiter, randomXvideos);
router.get("/xvideos/related", cors(), slow, limiter, relatedXvideos);
router.get("/xhamster/get", cors(), slow, limiter, getXhamster);
router.get("/xhamster/search", cors(), slow, limiter, searchXhamster);
router.get("/xhamster/random", cors(), slow, limiter, randomXhamster);
router.get("/xhamster/related", cors(), slow, limiter, relatedXhamster);
router.get("/youporn/get", cors(), slow, limiter, getYouporn);
router.get("/youporn/search", cors(), slow, limiter, searchYouporn);
router.get("/youporn/related", cors(), slow, limiter, relatedYouporn);
router.get("/youporn/random", cors(), slow, limiter, randomYouporn);
router.get("/eporner/get", cors(), slow, limiter, getEporner);
router.get("/eporner/search", cors(), slow, limiter, searchEporner);
router.get("/eporner/related", cors(), slow, limiter, relatedEporner);
router.get("/eporner/random", cors(), slow, limiter, randomEporner);
router.get("/txxx/get", cors(), slow, limiter, getTxxx);
router.get("/txxx/search", cors(), slow, limiter, searchTxxx);
router.get("/txxx/related", cors(), slow, limiter, relatedTxxx);
router.get("/txxx/random", cors(), slow, limiter, randomTxxx);
return router;
}
export default scrapeRoutes;
import { Elysia, t } from "elysia";
// EPorner
import { getEporner } from "../controller/eporner/epornerGet";
import { searchEporner } from "../controller/eporner/epornerSearch";
import { relatedEporner } from "../controller/eporner/epornerGetRelated";
import { randomEporner } from "../controller/eporner/epornerRandom";
// TXXX
import { getTxxx } from "../controller/txxx/txxxGet";
import { searchTxxx } from "../controller/txxx/txxxSearch";
import { relatedTxxx } from "../controller/txxx/txxxGetRelated";
import { randomTxxx } from "../controller/txxx/txxxRandom";
// PornHub
import { getPornhub } from "../controller/pornhub/pornhubGet";
import { searchPornhub } from "../controller/pornhub/pornhubSearch";
import { randomPornhub } from "../controller/pornhub/pornhubRandom";
import { relatedPornhub } from "../controller/pornhub/pornhubGetRelated";
// XNXX
import { getXnxx } from "../controller/xnxx/xnxxGet";
import { searchXnxx } from "../controller/xnxx/xnxxSearch";
import { relatedXnxx } from "../controller/xnxx/xnxxGetRelated";
import { randomXnxx } from "../controller/xnxx/xnxxRandom";
// RedTube
import { getRedtube } from "../controller/redtube/redtubeGet";
import { searchRedtube } from "../controller/redtube/redtubeSearch";
import { relatedRedtube } from "../controller/redtube/redtubeGetRelated";
import { randomRedtube } from "../controller/redtube/redtubeRandom";
// Xvideos
import { getXvideos } from "../controller/xvideos/xvideosGet";
import { searchXvideos } from "../controller/xvideos/xvideosSearch";
import { randomXvideos } from "../controller/xvideos/xvideosRandom";
import { relatedXvideos } from "../controller/xvideos/xvideosGetRelated";
// Xhamster
import { getXhamster } from "../controller/xhamster/xhamsterGet";
import { searchXhamster } from "../controller/xhamster/xhamsterSearch";
import { randomXhamster } from "../controller/xhamster/xhamsterRandom";
import { relatedXhamster } from "../controller/xhamster/xhamsterGetRelated";
// YouPorn
import { getYouporn } from "../controller/youporn/youpornGet";
import { searchYouporn } from "../controller/youporn/youpornSearch";
import { relatedYouporn } from "../controller/youporn/youpornGetRelated";
import { randomYouporn } from "../controller/youporn/youpornRandom";
const queryId = {
query: t.Object({ id: t.String() }),
};
const querySearch = {
query: t.Object({
key: t.String(),
page: t.Optional(t.String()),
}),
};
export const scrapeRoutes = (app: Elysia) =>
app
.group("/pornhub", (app) =>
app
.get("/get", getPornhub, {
...queryId,
detail: { summary: "Get Pornhub video data", tags: ["Pornhub"] },
})
.get("/search", searchPornhub, {
...querySearch,
detail: { summary: "Search Pornhub videos", tags: ["Pornhub"] },
})
.get("/random", randomPornhub, {
detail: { summary: "Get random Pornhub videos", tags: ["Pornhub"] },
})
.get("/related", relatedPornhub, {
...queryId,
detail: { summary: "Get related Pornhub videos", tags: ["Pornhub"] },
})
)
.group("/xnxx", (app) =>
app
.get("/get", getXnxx, {
...queryId,
detail: { summary: "Get XNXX video data", tags: ["XNXX"] },
})
.get("/search", searchXnxx, {
...querySearch,
detail: { summary: "Search XNXX videos", tags: ["XNXX"] },
})
.get("/related", relatedXnxx, {
...queryId,
detail: { summary: "Get related XNXX videos", tags: ["XNXX"] },
})
.get("/random", randomXnxx, {
detail: { summary: "Get random XNXX videos", tags: ["XNXX"] },
})
)
.group("/redtube", (app) =>
app
.get("/get", getRedtube, {
...queryId,
detail: { summary: "Get RedTube video data", tags: ["RedTube"] },
})
.get("/search", searchRedtube, {
...querySearch,
detail: { summary: "Search RedTube videos", tags: ["RedTube"] },
})
.get("/related", relatedRedtube, {
...queryId,
detail: { summary: "Get related RedTube videos", tags: ["RedTube"] },
})
.get("/random", randomRedtube, {
detail: { summary: "Get random RedTube videos", tags: ["RedTube"] },
})
)
.group("/xvideos", (app) =>
app
.get("/get", getXvideos, {
...queryId,
detail: { summary: "Get Xvideos video data", tags: ["Xvideos"] },
})
.get("/search", searchXvideos, {
...querySearch,
detail: { summary: "Search Xvideos videos", tags: ["Xvideos"] },
})
.get("/random", randomXvideos, {
detail: { summary: "Get random Xvideos videos", tags: ["Xvideos"] },
})
.get("/related", relatedXvideos, {
...queryId,
detail: { summary: "Get related Xvideos videos", tags: ["Xvideos"] },
})
)
.group("/xhamster", (app) =>
app
.get("/get", getXhamster, {
...queryId,
detail: { summary: "Get Xhamster video data", tags: ["Xhamster"] },
})
.get("/search", searchXhamster, {
...querySearch,
detail: { summary: "Search Xhamster videos", tags: ["Xhamster"] },
})
.get("/random", randomXhamster, {
detail: { summary: "Get random Xhamster videos", tags: ["Xhamster"] },
})
.get("/related", relatedXhamster, {
...queryId,
detail: { summary: "Get related Xhamster videos", tags: ["Xhamster"] },
})
)
.group("/youporn", (app) =>
app
.get("/get", getYouporn, {
...queryId,
detail: { summary: "Get YouPorn video data", tags: ["YouPorn"] },
})
.get("/search", searchYouporn, {
...querySearch,
detail: { summary: "Search YouPorn videos", tags: ["YouPorn"] },
})
.get("/related", relatedYouporn, {
...queryId,
detail: { summary: "Get related YouPorn videos", tags: ["YouPorn"] },
})
.get("/random", randomYouporn, {
detail: { summary: "Get random YouPorn videos", tags: ["YouPorn"] },
})
)
.group("/eporner", (app) =>
app
.get("/get", getEporner, {
...queryId,
detail: { summary: "Get EPorner video data", tags: ["EPorner"] },
})
.get("/search", searchEporner, {
...querySearch,
detail: { summary: "Search EPorner videos", tags: ["EPorner"] },
})
.get("/related", relatedEporner, {
...queryId,
detail: { summary: "Get related EPorner videos", tags: ["EPorner"] },
})
.get("/random", randomEporner, {
detail: { summary: "Get random EPorner videos", tags: ["EPorner"] },
})
)
.group("/txxx", (app) =>
app
.get("/get", getTxxx, {
...queryId,
detail: { summary: "Get TXXX video data", tags: ["TXXX"] },
})
.get("/search", searchTxxx, {
...querySearch,
detail: { summary: "Search TXXX videos", tags: ["TXXX"] },
})
.get("/related", relatedTxxx, {
...queryId,
detail: { summary: "Get related TXXX videos", tags: ["TXXX"] },
})
.get("/random", randomTxxx, {
detail: { summary: "Get random TXXX videos", tags: ["TXXX"] },
})
);

View File

@@ -19,7 +19,7 @@ export function maybeError(success: boolean, message: string) {
export function timeAgo(input: Date) {
const date = new Date(input);
const formatter: any = new Intl.RelativeTimeFormat("en");
const formatter = new Intl.RelativeTimeFormat("en");
const ranges: { [key: string]: number } = {
years: 3600 * 24 * 365,
months: 3600 * 24 * 30,
@@ -33,7 +33,7 @@ export function timeAgo(input: Date) {
for (const key in ranges) {
if (ranges[key] < Math.abs(secondsElapsed)) {
const delta = secondsElapsed / ranges[key];
return formatter.format(Math.round(delta), key);
return formatter.format(Math.round(delta), key as Intl.RelativeTimeFormatUnit);
}
}
}

83
src/utils/ph-solver.ts Normal file
View File

@@ -0,0 +1,83 @@
/**
* solve Pornhub JS challenge (leastFactor)
* @param html challenge page html
* @returns KEY cookie string
*/
export async function solveChallenge(html: string): Promise<string> {
const cleanHtml = html.replace(/\/\*[\s\S]*?\*\//g, "");
const pMatch = cleanHtml.match(/var p=(\d+);/);
const sMatch = cleanHtml.match(/var s=(\d+);/);
const extraMatch = cleanHtml.match(
/document\.cookie="KEY="\+n\+"\*"\+p\/n\+":"\+s\+":(\d+):1;path=\/;";/
);
if (!pMatch || !sMatch || !extraMatch) {
throw new Error("Challenge variables not found");
}
let p = parseInt(pMatch[1]);
const s = parseInt(sMatch[1]);
const extra = extraMatch[1];
const goFuncMatch = cleanHtml.match(
/function go\(\) \{([\s\S]+?)n=leastFactor\(p\);/
);
if (goFuncMatch) {
const body = goFuncMatch[1].replace(/\s+/g, "");
// 1. Find and process all if-else blocks, then REMOVE them from body
const ifElseRegex = /if\(\(s>>(\d+)\)&1\)p(\+|-)=(\d+)\*(\d+);elsep(\+|-)=(\d+)\*(\d+);/g;
let match;
let bodyWithoutIfs = body;
while ((match = ifElseRegex.exec(body)) !== null) {
const shift = parseInt(match[1]);
const condition = (s >> shift) & 1;
if (condition) {
const sign = match[2];
const val = parseInt(match[3]) * parseInt(match[4]);
p = sign === "+" ? p + val : p - val;
} else {
const sign = match[5];
const val = parseInt(match[6]) * parseInt(match[7]);
p = sign === "+" ? p + val : p - val;
}
// Remove the matched if-else block to avoid double counting
bodyWithoutIfs = bodyWithoutIfs.replace(match[0], "");
}
// 2. Now process remaining adjustments (p+=... or p-=...) in the cleaned body
const adjRegex = /p(\+|-)=(\d+);/g;
let adjMatch;
while ((adjMatch = adjRegex.exec(bodyWithoutIfs)) !== null) {
const sign = adjMatch[1];
const val = parseInt(adjMatch[2]);
p = sign === "+" ? p + val : p - val;
}
}
const n = leastFactor(p);
return `KEY=${n}*${p / n}:${s}:${extra}:1`;
}
function leastFactor(n: number): number {
if (isNaN(n) || !isFinite(n)) return NaN;
if (n === 0) return 0;
if (n % 1 || n * n < 2) return 1;
if (n % 2 === 0) return 2;
if (n % 3 === 0) return 3;
if (n % 5 === 0) return 5;
const m = Math.sqrt(n);
for (let i = 7; i <= m; i += 30) {
if (n % i === 0) return i;
if (n % (i + 4) === 0) return i + 4;
if (n % (i + 6) === 0) return i + 6;
if (n % (i + 10) === 0) return i + 10;
if (n % (i + 12) === 0) return i + 12;
if (n % (i + 16) === 0) return i + 16;
if (n % (i + 22) === 0) return i + 22;
if (n % (i + 24) === 0) return i + 24;
}
return n;
}