remake modifiers
This commit is contained in:
@@ -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"] },
|
||||
})
|
||||
);
|
||||
@@ -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
83
src/utils/ph-solver.ts
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user