From 3cc0c3317fddfa12065d3b8a6ed626c423c69989 Mon Sep 17 00:00:00 2001 From: SNEK WAIFU Date: Thu, 14 May 2026 04:28:10 +0700 Subject: [PATCH] remake modifiers --- src/router/endpoint.ts | 300 ++++++++++++++++++++++++++++------------- src/utils/modifier.ts | 4 +- src/utils/ph-solver.ts | 83 ++++++++++++ 3 files changed, 292 insertions(+), 95 deletions(-) create mode 100644 src/utils/ph-solver.ts diff --git a/src/router/endpoint.ts b/src/router/endpoint.ts index 379ccc5..b07340d 100644 --- a/src/router/endpoint.ts +++ b/src/router/endpoint.ts @@ -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; \ No newline at end of file +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"] }, + }) + ); \ No newline at end of file diff --git a/src/utils/modifier.ts b/src/utils/modifier.ts index 70fad88..44dd4cc 100644 --- a/src/utils/modifier.ts +++ b/src/utils/modifier.ts @@ -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); } } } \ No newline at end of file diff --git a/src/utils/ph-solver.ts b/src/utils/ph-solver.ts new file mode 100644 index 0000000..aa7847c --- /dev/null +++ b/src/utils/ph-solver.ts @@ -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 { + 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; +}