fix(hqfap): Cloudflare JS-challenge -> tryb WebView zamiast phone-fetch
Some checks are pending
Backend tests / test (push) Waiting to run
Some checks are pending
Backend tests / test (push) Waiting to run
hqfap wdrozyl Cloudflare na strony /watch/ (2026-07-28): 403 z VPS ORAZ z residential IP, takze przy pelnym komplecie naglowkow przegladarki (strona glowna dalej 200, wiec blokada celuje w strony wideo). Phone-side resolveHqfapPage to zwykly fetch, wiec nie ma jak wykonac JS-challenge -> resolve padal i user ladowal na stronie hostera (bug-report 92e9133e 'Hqfap przekierowuje na strone'). Telemetria tego NIE pokazala: hqfap ma 99-100% do 26.07 i ZERO eventow od 27.07, bo blad wystepuje PRZED playerem, wiec event nie powstaje. Ten sam wzorzec co przy freshporno - przy takich zgloszeniach nie ufac samemu success-rate. Fix: hqfapcom -> _vps_blocked_fallback (WebView, Chrome engine + JS + cookie przechodzi challenge; INJECTED_JS i tak wylusknie mp4 i wroci na native player). Zdjety z PHONE_RESOLVE_ORIGINS i z lancucha phone-resolve w SceneDetail/Player.
This commit is contained in:
parent
90a63b1e77
commit
140764bfc5
3 changed files with 15 additions and 8 deletions
|
|
@ -210,7 +210,15 @@ _REGISTRY: dict[str, Callable[[str], list[StreamSource] | None]] = {
|
||||||
# biblioteka serwowała `/upload/videos/video_down.mp4` stub), PRZYWRÓCONY 2026-07-07:
|
# biblioteka serwowała `/upload/videos/video_down.mp4` stub), PRZYWRÓCONY 2026-07-07:
|
||||||
# strona wróciła na CDN vstor.top z realnymi plikami (portable cross-IP, zweryfikowane),
|
# strona wróciła na CDN vstor.top z realnymi plikami (portable cross-IP, zweryfikowane),
|
||||||
# user request. 4k69 zostaje usunięty (nie sprawdzany ponownie).
|
# user request. 4k69 zostaje usunięty (nie sprawdzany ponownie).
|
||||||
"hqfapcom": hqfap.extract,
|
# 2026-07-28: hqfap wdrożył Cloudflare z JS-challenge na strony /watch/ — 403 zarówno
|
||||||
|
# z VPS, jak i z residential IP, także przy pełnym komplecie nagłówków przeglądarki
|
||||||
|
# (strona główna dalej 200, więc blokada jest celowana w strony wideo). Phone-side
|
||||||
|
# `resolveHqfapPage` (zwykły fetch) nie ma jak przejść challenge, więc padał i user
|
||||||
|
# lądował na stronie zamiast na wideo (bug-report 92e9133e "Hqfap przekierowuje na
|
||||||
|
# stronę"; telemetria to PRZEMILCZAŁA — zero eventów od 27.07, bo błąd jest przed
|
||||||
|
# playerem). WebView (Chrome engine + JS + cookie) challenge przechodzi, więc
|
||||||
|
# przełączamy na tryb WebView; INJECTED_JS i tak wyłuska mp4 i wróci na native player.
|
||||||
|
"hqfapcom": _vps_blocked_fallback.extract,
|
||||||
# javflix (JAV, WordPress) — przyciski serwerów to `<a class="myLink" href="<embed>">`
|
# javflix (JAV, WordPress) — przyciski serwerów to `<a class="myLink" href="<embed>">`
|
||||||
# (streamtape/voe/doodstream/emturbovid). Generyczny _embed_iframe łapie je anchor-hoster
|
# (streamtape/voe/doodstream/emturbovid). Generyczny _embed_iframe łapie je anchor-hoster
|
||||||
# patternem → type='hoster', telefon resolwuje (voe backend, dood/filemoon phone-side).
|
# patternem → type='hoster', telefon resolwuje (voe backend, dood/filemoon phone-side).
|
||||||
|
|
|
||||||
|
|
@ -321,8 +321,6 @@ function NativeVideoPlayer({ params }: { params: RouteParams }) {
|
||||||
links = await (await import('../lib/epornerResolver')).resolveEpornerPage(resolvePageUrl);
|
links = await (await import('../lib/epornerResolver')).resolveEpornerPage(resolvePageUrl);
|
||||||
} else if (resolvePageUrl && playOrigin === 'tube:fpoxxx') {
|
} else if (resolvePageUrl && playOrigin === 'tube:fpoxxx') {
|
||||||
links = await (await import('../lib/fpoxxxResolver')).resolveFpoxxxPage(resolvePageUrl);
|
links = await (await import('../lib/fpoxxxResolver')).resolveFpoxxxPage(resolvePageUrl);
|
||||||
} else if (resolvePageUrl && playOrigin === 'tube:hqfapcom') {
|
|
||||||
links = await (await import('../lib/hqfapResolver')).resolveHqfapPage(resolvePageUrl);
|
|
||||||
} else if (canBackendReresolve && sceneId && params.playbackId) {
|
} else if (canBackendReresolve && sceneId && params.playbackId) {
|
||||||
// Świeży resolve przez backend (VPS re-runuje extractor KVS → nowy nod + token).
|
// Świeży resolve przez backend (VPS re-runuje extractor KVS → nowy nod + token).
|
||||||
const res = await client.resolvePlayback(sceneId, params.playbackId);
|
const res = await client.resolvePlayback(sceneId, params.playbackId);
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,6 @@ import { resolvePornxpPage } from '../lib/pornxpResolver';
|
||||||
import { resolveSxyprnPage } from '../lib/sxyprnResolver';
|
import { resolveSxyprnPage } from '../lib/sxyprnResolver';
|
||||||
import { resolveEpornerPage } from '../lib/epornerResolver';
|
import { resolveEpornerPage } from '../lib/epornerResolver';
|
||||||
import { resolveFpoxxxPage } from '../lib/fpoxxxResolver';
|
import { resolveFpoxxxPage } from '../lib/fpoxxxResolver';
|
||||||
import { resolveHqfapPage } from '../lib/hqfapResolver';
|
|
||||||
import type { RootStackParamList } from '../navigation';
|
import type { RootStackParamList } from '../navigation';
|
||||||
import { theme } from '../theme';
|
import { theme } from '../theme';
|
||||||
import type { PlaybackSource, SceneOut, StreamLink } from '../types';
|
import type { PlaybackSource, SceneOut, StreamLink } from '../types';
|
||||||
|
|
@ -626,7 +625,7 @@ function PlaybackButton({
|
||||||
|
|
||||||
// IP-bound tuby resolwowane phone-side: przekaż page_url, by Player mógł
|
// IP-bound tuby resolwowane phone-side: przekaż page_url, by Player mógł
|
||||||
// re-resolve'ować świeży token gdy native padnie na initial-load (zmiana IP / TTL).
|
// re-resolve'ować świeży token gdy native padnie na initial-load (zmiana IP / TTL).
|
||||||
const PHONE_RESOLVE_ORIGINS = ['tube:sxyprncom', 'tube:epornercom', 'tube:fpoxxx', 'tube:hqfapcom'];
|
const PHONE_RESOLVE_ORIGINS = ['tube:sxyprncom', 'tube:epornercom', 'tube:fpoxxx'];
|
||||||
nav.navigate('Player', {
|
nav.navigate('Player', {
|
||||||
url: initialUrl,
|
url: initialUrl,
|
||||||
sceneId,
|
sceneId,
|
||||||
|
|
@ -669,9 +668,11 @@ function PlaybackButton({
|
||||||
? resolveFpoxxxPage
|
? resolveFpoxxxPage
|
||||||
: source.origin === 'tube:pornxpph'
|
: source.origin === 'tube:pornxpph'
|
||||||
? resolvePornxpPage
|
? resolvePornxpPage
|
||||||
: source.origin === 'tube:hqfapcom'
|
: // hqfap zdjęty 2026-07-28: strona wdrożyła Cloudflare z JS-challenge na
|
||||||
? resolveHqfapPage
|
// /watch/ (403 dla każdego zwykłego fetcha, także z pełnym kompletem
|
||||||
: null;
|
// nagłówków przeglądarki), więc phone-resolve tylko padał i zrzucał usera
|
||||||
|
// na stronę hostera. Backend oznacza go teraz jako WebView-only.
|
||||||
|
null;
|
||||||
if (phoneResolver) {
|
if (phoneResolver) {
|
||||||
setResolving(true);
|
setResolving(true);
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue