Fail to download torrent file if we got redirect and we use cookie
найдено из-за 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".
@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 если есть редирект.
казалось бы не надо ничего менять в 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
- по поводу https://github.com/elgatito/script.elementum.burst/blob/cd5784ab620c8b27de275513febccfa2b98833a9/burst/providers/providers.json#L2873
там как раз таки был жестко прописал домен, но старый. я в последних комитах сделал, чтобы можно было относительные ссылки делать, чтобы проще было менять старый домен на новый.
или я не понял что ты хотел сказать по поводу "Проблема обычно в этом".
- по поводу кук я уже понял где косяк: добавил перед 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: []
соотв куки пустые.
всё как ты описал.
- было бы приколько если бы библиотека могла сама брать общие куки и из них выбирать куки для запроса, тогда бы работало для редиректом, да и не приходилось бы в коде парсить файл с куками.
если такую магию сделать нельзя, то тогда придётся менять домены всегда руками в конфиге.
По поводу автоматической подстановки cookie для всех запросов - в принципе было бы круто такую фичу иметь, но конкретно для редиректов это может и не супер критично, потому что редиректы это временное решение авторов трекера и в какой-то момент придётся всё равно поменять домен в конфиге (когда старый домен отвалится).
Но было бы интересно посмотреть на техническую реализацию с куками.
было бы приколько если бы библиотека могла сама брать общие куки и из них выбирать куки для запроса, тогда бы работало для редиректом, да и не приходилось бы в коде парсить файл с куками.
Есть общий cookie jar в Burst, где хранятся все куки и для каждого домена выбираются и передаются к Elementum. Передавать весь cookie jar в теории наверное можно, но это может быть большой размер хранилища.
@elgatito я имел ввиду другое: не руками выставлять куки для запроса в конкретном месте для конкретного запроса, как в https://github.com/elgatito/script.elementum.burst/blob/cd5784ab620c8b27de275513febccfa2b98833a9/burst/burst.py#L401
а как-то в общем, внутри http вызовов выставлять куки, чтобы даже если произошел редирект, то все равно куки выставились бы автоматически.
ну это наверное надо менять именно код http клиента. просто интересно, возможно ли так сделать.