fix(hqfap): Cloudflare JS-challenge -> tryb WebView zamiast phone-fetch
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:
goon-foss 2026-07-28 09:42:05 +02:00
parent 90a63b1e77
commit 140764bfc5
3 changed files with 15 additions and 8 deletions

View file

@ -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:
# strona wróciła na CDN vstor.top z realnymi plikami (portable cross-IP, zweryfikowane),
# 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>">`
# (streamtape/voe/doodstream/emturbovid). Generyczny _embed_iframe łapie je anchor-hoster
# patternem → type='hoster', telefon resolwuje (voe backend, dood/filemoon phone-side).

View file

@ -321,8 +321,6 @@ function NativeVideoPlayer({ params }: { params: RouteParams }) {
links = await (await import('../lib/epornerResolver')).resolveEpornerPage(resolvePageUrl);
} else if (resolvePageUrl && playOrigin === 'tube:fpoxxx') {
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) {
// Świeży resolve przez backend (VPS re-runuje extractor KVS → nowy nod + token).
const res = await client.resolvePlayback(sceneId, params.playbackId);

View file

@ -25,7 +25,6 @@ import { resolvePornxpPage } from '../lib/pornxpResolver';
import { resolveSxyprnPage } from '../lib/sxyprnResolver';
import { resolveEpornerPage } from '../lib/epornerResolver';
import { resolveFpoxxxPage } from '../lib/fpoxxxResolver';
import { resolveHqfapPage } from '../lib/hqfapResolver';
import type { RootStackParamList } from '../navigation';
import { theme } from '../theme';
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ł
// 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', {
url: initialUrl,
sceneId,
@ -669,9 +668,11 @@ function PlaybackButton({
? resolveFpoxxxPage
: source.origin === 'tube:pornxpph'
? resolvePornxpPage
: source.origin === 'tube:hqfapcom'
? resolveHqfapPage
: null;
: // hqfap zdjęty 2026-07-28: strona wdrożyła Cloudflare z JS-challenge na
// /watch/ (403 dla każdego zwykłego fetcha, także z pełnym kompletem
// 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) {
setResolving(true);
try {