script.elementum.burst icon indicating copy to clipboard operation
script.elementum.burst copied to clipboard

Fail to download torrent file if we got redirect and we use cookie

Open antonsoroko opened this issue 1 year ago • 6 comments

найдено из-за https://github.com/elgatito/script.elementum.burst/issues/400

с https://www3.yggtorrent.wtf сейчас идёт редирект на https://www3.yggtorrent.cool

казалось бы не надо ничего менять в json конфиге, но если не сменить домен для хотя бы "torrent": то не получается скачать торрент файл.

Если в elementum включить встроенный прокси, у него включить дебаг в лог, а в burst включить использование этого прокси - то будет видно что происходит: идёт авторизация на .wtf, получает редирект на .cool, получает куки на .cool, идёт скачивание на .wtf без кук (у нас куки от другого домена), получает редирект 301 .cool, идёт на .cool с куками, но сайт отвечает что надо авторизоваться. Если редиректов нет (если поправить json для хотябы "torrent":), то работает нормально с теми же куками. Поиск работает нормально с редиректом, потому что не обязательна авторизация для поиска у них, а вот именно скачка торрента не работает, так как там обязательна авторизация у них. ~Но мы выставляем же куки вроде, как у меня в логе ниже.~ похоже что не выставляем.

Я так и не понял это проблема самого сайта или burst. @elgatito прошу глянуть.

DEBU  proxy        ▶ dumpRequest      [787] --> GET https://www3.yggtorrent.wtf:443/engine/download_torrent?id=1054618
DEBU  proxy        ▶ dumpRequest      REQUEST:
GET /engine/download_torrent?id=1054618 HTTP/1.1
Host: www3.yggtorrent.wtf
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36

DEBU  proxy        ▶ dumpResponse     [787] <-- 301 https://www3.yggtorrent.wtf:443/engine/download_torrent?id=1054618
DEBU  proxy        ▶ dumpResponse     RESPONSE:
HTTP/1.1 301 Moved Permanently
Content-Length: 167
Alt-Svc: h3=":443"; ma=86400
Cache-Control: max-age=3600
Cf-Ray: 87b7c6091c563253-VIE
Connection: keep-alive
Content-Type: text/html
Date: Sun, 28 Apr 2024 14:34:31 GMT
Expires: Sun, 28 Apr 2024 15:34:31 GMT
Location: https://www3.yggtorrent.cool/engine/download_torrent?id=1054618
Nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
Report-To: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=URPG%2B3LeBNnH5v7fBD9tBYcjVvWr%2FymO3ywcXyY5rZF%2FaZ5MCoasHzuu2y3QXmnDt%2FlxnXkl%2BjtpCNyKEeWbwKKCU9EHtnRRQjLcQ679BqXIdZKZw8nvu4k3Rrgp8PVd3eB%2B57tK"}],"group":"cf-nel","max_age":604800}
Server: cloudflare
Vary: Accept-Encoding

<html>
<head><title>301 Moved Permanently</title></head>
<body>
<center><h1>301 Moved Permanently</h1></center>
<hr><center>cloudflare</center>
</body>
</html>

DEBU  proxy        ▶ dumpRequest      [821] --> GET https://www3.yggtorrent.cool:443/engine/download_torrent?id=1054618
DEBU  proxy        ▶ dumpRequest      REQUEST:
GET /engine/download_torrent?id=1054618 HTTP/1.1
Host: www3.yggtorrent.cool
Referer: https://www3.yggtorrent.wtf/engine/download_torrent?id=1054618


DEBU  proxy        ▶ dumpResponse     [821] <-- 200 https://www3.yggtorrent.cool:443/engine/download_torrent?id=1054618
DEBU  proxy        ▶ dumpResponse     RESPONSE:
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Cache-Control: no-store, no-cache, must-revalidate
Cf-Cache-Status: DYNAMIC
Cf-Ray: 87b7c60b8e602bcd-FRA
Connection: keep-alive
Content-Type: text/html; charset=UTF-8
Date: Sun, 28 Apr 2024 14:34:31 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
Pragma: no-cache
Report-To: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=rZ5bMQsNoZ8SRTfP8p6UKStEjx1w6ixSZb4ROxCEpP%2BNDCZNXTmTLjc1C8Y1%2FedQwuu8%2B8mIQhAo7ecL5Xa0ZJuT3xbwzyRwAzD5g8kzoB7czsUz6GOlselzHbQpf%2BA47JB6KPif"}],"group":"cf-nel","max_age":604800}
Server: cloudflare
Set-Cookie: ygg_=xxx; expires=Sun, 28-Apr-2024 16:34:31 GMT; Max-Age=7200; path=/; SameSite=None; domain=.yggtorrent.cool; secure; HttpOnly
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN

37
Vous devez vous connecter pour télécharger un torrent
0

WARN  linkssearch  ▶ 1                Resolve failed for https://www3.yggtorrent.wtf/engine/download_torrent?id=1054618|User-Agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 : Invalid input

Vous devez vous connecter pour télécharger un torrent -> Вы должны войти в систему, чтобы скачать торрент

UPD: ещё вижу что был фикс когда-то на похожую тему "added fixes for having redirections from providers".

antonsoroko avatar Apr 29 '24 10:04 antonsoroko

@elgatito а вот запрос и ответ без редиректов когда

[36mDEBU  proxy        ▶ dumpRequest      [0m[321] --> GET https://www3.yggtorrent.cool:443/engine/download_torrent?id=1054782
[36mDEBU  proxy        ▶ dumpRequest      [0mREQUEST:
GET /engine/download_torrent?id=1054782 HTTP/1.1
Host: www3.yggtorrent.cool
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,uk;q=0.6,pl;q=0.5
Cache-Control: max-age=0
Content-Language: en
Cookie: ygg_=XXX
Origin: https://www3.yggtorrent.cool/engine/search?do=search&name=flash+2023&order=desc&sort=seed
Referer: https://www3.yggtorrent.cool/engine/search?do=search&name=flash+2023&order=desc&sort=seed
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 OPR/109.0.0.0

[36mDEBU  proxy        ▶ dumpResponse     [0m[321] <-- 200 https://www3.yggtorrent.cool:443/engine/download_torrent?id=1054782
[36mDEBU  proxy        ▶ dumpResponse     [0mRESPONSE:
HTTP/1.1 200 OK
Content-Length: 83909
Cache-Control: no-store, no-cache, must-revalidate
Cf-Cache-Status: DYNAMIC
Cf-Ray: 87c012a3bb7a04aa-CDG
Connection: keep-alive
Content-Disposition: attachment; filename="The.Flash.2023.MULTI.2160p.HDR10Plus.DV.WEBRip.6CH.x265.HEVC-Elcrackito.mkv.torrent"
Content-Type: application/x-bittorrent
Date: Mon, 29 Apr 2024 14:44:55 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Nel: {"success_fraction":0,"report_to":"cf-nel","max_age":604800}
Pragma: no-cache
Report-To: {"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v4?s=UXriaE%2BrPVDt6e8ZgyMSUJKm2uia%2BKqIqzH7OPVqppQ2gRAxFfXYzSEMQVr9GR9Ftk8Mo9RhybqGP6mVpGrv7sh%2Byt%2FjrugLCyLcB1ZOx7Ys0ZMFSSwIGx53YeQj04QNs7aMyOjl"}],"group":"cf-nel","max_age":604800}
Server: cloudflare
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN

и тут видно что мы в запросе выставляем Cookie: ygg_=XXX , и если сравнить с логом выше то видно что там мы не выставляем Cookie. короче, получается мы не выставляем Cookie если есть редирект.

antonsoroko avatar Apr 29 '24 14:04 antonsoroko

казалось бы не надо ничего менять в json конфиге, но если не сменить домен для хотя бы "torrent": то не получается скачать торрент файл.

Проблема обычно в этом - https://github.com/elgatito/script.elementum.burst/blob/master/burst/providers/providers.json#L2873

Если ссылка на торрент формируется исходя из домена, который в base_url, то нужно чтоб эти значения были актуальными, потому что куки на реальный домен выписываются, а не тот что мы предполагаем. Поэтому Burst авторизуется, получает список, отдаёт Elementum вместе с куками, но Elementum получить ничего не может, потому что кука выписана на один домен, а стучимся мы на другой.

Наверное нужно в Burst переделать формирование ссылок чтоб везде правильные домены были и работало оно везде одинаково.

И убрать такие вещи - https://github.com/elgatito/script.elementum.burst/blob/master/burst/providers/providers.json#L124 , чтоб домен подставлялся через Burst по той же логике (если это тот же домен).

elgatito avatar Apr 29 '24 15:04 elgatito

@elgatito

  1. по поводу https://github.com/elgatito/script.elementum.burst/blob/cd5784ab620c8b27de275513febccfa2b98833a9/burst/providers/providers.json#L2873

там как раз таки был жестко прописал домен, но старый. я в последних комитах сделал, чтобы можно было относительные ссылки делать, чтобы проще было менять старый домен на новый.

или я не понял что ты хотел сказать по поводу "Проблема обычно в этом".

  1. по поводу кук я уже понял где косяк: добавил перед https://github.com/elgatito/script.elementum.burst/blob/cd5784ab620c8b27de275513febccfa2b98833a9/burst/burst.py#L401

log.debug("[%s] cookie_domain: %s" % (provider, repr(cookie_domain))) log.debug("[%s] Cookies: %s" % (provider, repr(cookies)))

и понял что да, получили мы до этого куку на один домен а в итоге делаем запрос на другой [yggtorrent] cookie_domain: 'yggtorrent.wtf' [yggtorrent] Cookies: []

соотв куки пустые.

всё как ты описал.

  1. было бы приколько если бы библиотека могла сама брать общие куки и из них выбирать куки для запроса, тогда бы работало для редиректом, да и не приходилось бы в коде парсить файл с куками.

если такую магию сделать нельзя, то тогда придётся менять домены всегда руками в конфиге.

antonsoroko avatar Apr 29 '24 15:04 antonsoroko

По поводу автоматической подстановки cookie для всех запросов - в принципе было бы круто такую фичу иметь, но конкретно для редиректов это может и не супер критично, потому что редиректы это временное решение авторов трекера и в какой-то момент придётся всё равно поменять домен в конфиге (когда старый домен отвалится).

Но было бы интересно посмотреть на техническую реализацию с куками.

antonsoroko avatar Apr 29 '24 18:04 antonsoroko

было бы приколько если бы библиотека могла сама брать общие куки и из них выбирать куки для запроса, тогда бы работало для редиректом, да и не приходилось бы в коде парсить файл с куками.

Есть общий cookie jar в Burst, где хранятся все куки и для каждого домена выбираются и передаются к Elementum. Передавать весь cookie jar в теории наверное можно, но это может быть большой размер хранилища.

elgatito avatar Apr 30 '24 11:04 elgatito

@elgatito я имел ввиду другое: не руками выставлять куки для запроса в конкретном месте для конкретного запроса, как в https://github.com/elgatito/script.elementum.burst/blob/cd5784ab620c8b27de275513febccfa2b98833a9/burst/burst.py#L401

а как-то в общем, внутри http вызовов выставлять куки, чтобы даже если произошел редирект, то все равно куки выставились бы автоматически.

ну это наверное надо менять именно код http клиента. просто интересно, возможно ли так сделать.

antonsoroko avatar Apr 30 '24 11:04 antonsoroko