[GH-ISSUE #422] kinozal.tv разделегирован? #328

Open
opened 2026-10-13 19:55:58 +00:00 by bsakaguchi · 9 comments
Owner

Originally created by @zalessky on GitHub (Jul 16, 2026).
Original GitHub issue: https://github.com/werwolfby/monitorrent/issues/422

Перестал резолвиться kinozal.tv
Зеркала https://kinozal.guru и https://kinozal.me вполне себе работают.

Переписал плагин - теперь позволяет прописывать в настройках другие зеркала.

kinozal.py

Originally created by @zalessky on GitHub (Jul 16, 2026). Original GitHub issue: https://github.com/werwolfby/monitorrent/issues/422 Перестал резолвиться kinozal.tv Зеркала https://kinozal.guru и https://kinozal.me вполне себе работают. Переписал плагин - теперь позволяет прописывать в настройках другие зеркала. [kinozal.py](https://github.com/user-attachments/files/30084492/kinozal.py)
Author
Owner

@Grosses84 commented on GitHub (Jul 20, 2026):

Работает, спасибо:)

<!-- gh-comment-id:5018922837 --> @Grosses84 commented on GitHub (Jul 20, 2026): Работает, спасибо:)
Author
Owner

@zalessky commented on GitHub (Sep 3, 2026):

kinozal.py свежие обновы

<!-- gh-comment-id:5521330137 --> @zalessky commented on GitHub (Sep 3, 2026): [kinozal.py](https://github.com/user-attachments/files/31770158/kinozal.py) свежие обновы
Author
Owner

@a-flash commented on GitHub (Sep 11, 2026):

Спасибо за обновления исправлений. Все работало неделю назад. Сейчас видимо тоже за cloudflare спрятались, и me и guru. Уже добавленные раздачи работают, а вот новые не добавляет :(

<!-- gh-comment-id:5633048905 --> @a-flash commented on GitHub (Sep 11, 2026): Спасибо за обновления исправлений. Все работало неделю назад. Сейчас видимо тоже за cloudflare спрятались, и me и guru. Уже добавленные раздачи работают, а вот новые не добавляет :(
Author
Owner

@RU2026 commented on GitHub (Sep 14, 2026):

kinozal.pyé_é mediumизировать

Добавь пожалуйста ещё kinozal.jumpingcrab.com

<!-- gh-comment-id:5663095894 --> @RU2026 commented on GitHub (Sep 14, 2026): > [kinozal.](https://github.com/user-attachments/files/31770158/kinozal.py)pyé_é mediumизировать Добавь пожалуйста ещё kinozal.jumpingcrab.com
Author
Owner

@zalessky commented on GitHub (Sep 14, 2026):

kinozal.py

kinozal.jumpingcrab.com добавил. не забудьте обновить списки обходов
капчу CF обходить муторно. попробовал что-то навайбкодить. но отлаживать некогда. тестируйте, пишите как работает

<!-- gh-comment-id:5665108225 --> @zalessky commented on GitHub (Sep 14, 2026): [kinozal.py](https://github.com/user-attachments/files/32196045/kinozal.py) kinozal.jumpingcrab.com добавил. не забудьте обновить списки обходов капчу CF обходить муторно. попробовал что-то навайбкодить. но отлаживать некогда. тестируйте, пишите как работает
Author
Owner

@RU2026 commented on GitHub (Sep 15, 2026):

kinozal.py

kinozal.jumpingcrab.com добавил. не забудьте обновить списки обходов капчу CF обходить муторно. попробовал что-то навайбкодить. но отлаживать некогда. тестируйте, пишите как работает

Всё отлично работает, спасибо!

<!-- gh-comment-id:5678897834 --> @RU2026 commented on GitHub (Sep 15, 2026): > [kinozal.py](https://github.com/user-attachments/files/32196045/kinozal.py) > > kinozal.jumpingcrab.com добавил. не забудьте обновить списки обходов капчу CF обходить муторно. попробовал что-то навайбкодить. но отлаживать некогда. тестируйте, пишите как работает Всё отлично работает, спасибо!
Author
Owner

@zalessky commented on GitHub (Sep 18, 2026):

<html> <html><head></head>

monitorrent + kinozal за Cloudflare

Плагин kinozal.py для monitorrent, работающий с зеркалами kinozal, закрытыми защитой Cloudflare Turnstile, и инструкция, как всё это развернуть.


Проблема

Осенью 2026 зеркала kinozal.me и kinozal.guru встали за Cloudflare Turnstile. Штатный плагин monitorrent получает от них 403 со страницей «Just a moment…» и не может ни проверить обновление раздачи, ни скачать торрент-файл. Зеркала без защиты (jumpingcrab.com, cloudns.nz) отвечают 429 Too Many Requests — они маленькие и быстро упираются в свой лимит.

Что не сработало

Проверено на практике, чтобы вы не тратили время:

Подход Результат
cloudscraper Turnstile не берёт в принципе: нет JS-движка, решает только старый вычислительный челлендж. Проект не развивается с 2023 года.
Ручное копирование cf_clearance из своего браузера Cloudflare сверяет отпечаток TLS-соединения. Кука, добытая в Chrome и предъявленная из Python, отвергается.
Playwright внутри monitorrent, headless Firefox Turnstile не проходит. Проверено на Firefox 110 и на Firefox 150 — одинаково, полный таймаут ожидания.
Byparr как источник самих страниц Cloudflare проходит, но его браузер неавторизован: подстановка ваших кук не поддерживается (PR #314 не влит), и details.php отдаёт форму входа.
request.post к Byparr (логин через солвер) Не реализован, тот же PR.
Логин через GET-параметры takelogin.php не принимает данные формы из query string.

В логах Byparr в норме тишина и редкие Challenge detected → Clicked the challenge checkbox → Done.


Ограничения

  • Скачивание .torrent выполняет сам движок monitorrent своим кодом, мимо curl_cffi. Пока проходит за счёт куки и User-Agent от солвера, но это слабое место: если проверка обновлений работает, а скачивание отдаёт 403 — причина здесь.
  • Byparr не гарантирует прохождение. Turnstile меняется, и его автор об этом честно предупреждает.
  • Byparr держит один браузер. Плагин выстраивает обращения к нему в очередь; не направляйте туда параллельно другие приложения.
  • Решение рассчитано на учётную запись, которая у вас уже есть. Обхода авторизации здесь нет.

Благодарности

</html> </html># monitorrent + kinozal за Cloudflare

Плагин kinozal.py для [monitorrent](https://github.com/werwolfby/monitorrent),
работающий с зеркалами kinozal, закрытыми защитой Cloudflare Turnstile,
и инструкция, как всё это развернуть.


Проблема

Осенью 2026 зеркала kinozal.me и kinozal.guru встали за Cloudflare
Turnstile. Штатный плагин monitorrent получает от них 403 со страницей
«Just a moment…» и не может ни проверить обновление раздачи, ни скачать
торрент-файл. Зеркала без защиты (jumpingcrab.com, cloudns.nz)
отвечают 429 Too Many Requests — они маленькие и быстро упираются
в свой лимит.

Что не сработало

Проверено на практике, чтобы вы не тратили время:

Подход Результат
cloudscraper Turnstile не берёт в принципе: нет JS-движка, решает только старый вычислительный челлендж. Проект не развивается с 2023 года.
Ручное копирование cf_clearance из своего браузера Cloudflare сверяет отпечаток TLS-соединения. Кука, добытая в Chrome и предъявленная из Python, отвергается.
Playwright внутри monitorrent, headless Firefox Turnstile не проходит. Проверено на Firefox 110 и на Firefox 150 — одинаково, полный таймаут ожидания.
Byparr как источник самих страниц Cloudflare проходит, но его браузер неавторизован: подстановка ваших кук не поддерживается ([PR #314](https://github.com/thephaseless/Byparr/pull/314) не влит), и details.php отдаёт форму входа.
request.post к Byparr (логин через солвер) Не реализован, тот же PR.
Логин через GET-параметры takelogin.php не принимает данные формы из query string.

Что работает

Роли разделены:

  1. Byparr проходит Turnstile и отдаёт валидную куку cf_clearance.
    Дёргается редко — только когда куку отвергли.
  2. Плагин ходит на зеркало напрямую через curl_cffi — библиотеку,
    которая повторяет TLS-рукопожатие настоящего браузера. Отпечаток
    совпадает с браузером солвера, и кука принимается.
  3. Авторизация на трекере живёт в этих же прямых запросах, поэтому
    страницы приходят нормальные, а не гостевые.

Профиль TLS подбирается автоматически под User-Agent, который вернул
солвер. Это важно: если отпечаток будет от одной версии браузера, а
User-Agent от другой, Cloudflare сочтёт это рассогласованием и снова
покажет проверку.

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


Что понадобится

  • Docker и docker compose;
  • около 2 ГБ свободной памяти под браузер внутри Byparr;
  • действующая учётная запись на kinozal;
  • выход в интернет с сервера (на сборку образа нужен доступ к PyPI).

Файлы из этого репозитория:

Файл Зачем
kinozal.py Сам плагин. Подкладывается в контейнер поверх штатного.
Dockerfile Рецепт образа: официальный monitorrent + пакет curl_cffi.
docker-compose.yml Описание двух контейнеров: monitorrent и byparr.

Шаг 1. Каталоги и файлы

Выберите каталог, где будут лежать база и плагин. Он может быть любым,
главное — постоянным. Типичный выбор:

Система Путь
Unraid /mnt/user/appdata/monitorrent
Synology /volume1/docker/monitorrent
Обычный Linux /opt/monitorrent или /srv/monitorrent

Дальше по тексту используется /srv/monitorrent — подставляйте свой.

mkdir -p /srv/monitorrent/{db,plugins,build}

Положите файлы:

  • kinozal.py → /srv/monitorrent/plugins/kinozal.py
  • Dockerfile → /srv/monitorrent/build/Dockerfile
  • docker-compose.yml → /srv/monitorrent/ (или вставьте его текст
    прямо в редактор стека Portainer)

Если monitorrent у вас уже работает — не создавайте новую базу.
Найдите, где лежит текущая monitorrent.db, и укажите в compose именно
этот каталог, иначе потеряете список раздач.

Шаг 2. Образ с curl_cffi

curl_cffi — обычный пакет с PyPI, в штатном образе monitorrent его
нет. Готового образа с ним нигде не опубликовано, поэтому нужно один
раз собрать свой. Есть два способа.

Способ А: собрать по Dockerfile (рекомендуется)

Весь Dockerfile — это две строки: взять официальный образ и доставить
в него пакет.

cd /srv/monitorrent/build
docker build --no-cache -t monitorrent-cffi:latest .

Флаг --no-cache важен: без него Docker может подставить слой от
предыдущей сборки, и пакет молча не установится.

Проверка:

docker run --rm monitorrent-cffi:latest python3 -c "import curl_cffi; print(curl_cffi.__version__)"

Должен напечатать номер версии. Если вместо этого ModuleNotFoundError —
пересоберите, убедившись, что --no-cache на месте.

Способ Б: доустановить в работающий контейнер и зафиксировать

Годится, если собирать образ неудобно. Сначала запустите штатный
monitorrent (или используйте уже работающий), затем:

# 1. доустановить пакет внутрь работающего контейнера
docker exec monitorrent pip install curl_cffi

# 2. сохранить изменённый контейнер как новый образ
docker commit monitorrent monitorrent-cffi:latest

После этого в docker-compose.yml останется image: monitorrent-cffi:latest,
и при пересоздании контейнера пакет никуда не денется.

Важно понимать разницу: docker exec ... pip install сам по себе
живёт только до пересоздания контейнера. Именно docker commit
(или сборка по Dockerfile) делает изменение постоянным. Если пропустить
второй шаг, после ближайшего обновления стека всё вернётся к исходному
состоянию и в логах появится 'curl_cffi' is not installed.

Шаг 3. Правка docker-compose.yml

Откройте файл и замените пути в разделах volumes на свои. Менять нужно
только то, что слева от двоеточия — правая часть это путь внутри
контейнера, он фиксированный:

      - /srv/monitorrent/db:/db
      - /srv/monitorrent/plugins/kinozal.py:/var/www/monitorrent/monitorrent/plugins/trackers/kinozal.py

Если порт 6687 на хосте занят, поменяйте левое число:
"8687:6687/tcp".

Если у вас подменены и другие плагины (например lostfilm.py),
добавьте для них такие же строки.

Шаг 4. Запуск

Из командной строки:

cd /srv/monitorrent
docker compose up -d

Или через Portainer: Stacks → Add stack → Web editor, вставить
содержимое docker-compose.yml, нажать Deploy the stack.

Byparr при первом старте скачивает браузер — это несколько минут.
Дождитесь готовности:

curl -s http://localhost:8191/health

Проверьте, что monitorrent видит солвер:

docker exec monitorrent python3 -c "
import json, urllib.request
req = urllib.request.Request('http://byparr:8191/v1',
    data=json.dumps({'cmd':'request.get','url':'https://example.com',
                     'maxTimeout':60000}).encode(),
    headers={'Content-Type':'application/json'})
print(json.loads(urllib.request.urlopen(req, timeout=120).read()).get('status'))
"

Ожидаемый ответ — ok.

Шаг 5. Настройка плагина

Откройте http://<адрес-сервера>:6687 → Settings → Trackers →
kinozal.tv
:

  • Логин и Пароль — ваша учётная запись на трекере;
  • Зеркало — домен без https:// и без завершающего слэша,
    например kinozal.guru.

Нажмите Save, затем Check. Должно появиться
Connection successful.

Домен зеркала хранится отдельно от ссылок на раздачи: когда kinozal
переедет на новый адрес, достаточно поменять одно это поле — все
сохранённые раздачи продолжат работать, даже если в их ссылках стоит
старый домен.


Как обновить плагин потом

Если плагин подключён томом (как в docker-compose.yml выше), достаточно
заменить файл и перезапустить контейнер:

cp kinozal.py /srv/monitorrent/plugins/kinozal.py
docker restart monitorrent

Если тома нет и нужно положить файл внутрь разово:

docker cp kinozal.py monitorrent:/var/www/monitorrent/monitorrent/plugins/trackers/kinozal.py
docker restart monitorrent

Учтите: скопированный так файл исчезнет при пересоздании контейнера.
Для постоянной работы лучше подключить том.

Проверить, какая версия сейчас в контейнере:

docker exec monitorrent sha256sum /var/www/monitorrent/monitorrent/plugins/trackers/kinozal.py
sha256sum kinozal.py

Суммы должны совпасть.


Переменные окружения

Переменная По умолчанию Назначение
KINOZAL_BYPARR_URL не задана Адрес солвера, например http://byparr:8191/v1. Без неё плагин работает в прямом режиме — годится для зеркал без защиты.
KINOZAL_REQUEST_TIMEOUT_SEC 45 Таймаут запросов к зеркалу. Штатных 10 секунд monitorrent не хватает.
KINOZAL_IMPERSONATE подбирается автоматически Профиль TLS-отпечатка. По умолчанию подстраивается под User-Agent солвера, причём только из тех версий, которые есть в установленной curl_cffi. Задавайте вручную, только если автоподбор ошибается — и сверьтесь со списком своей версии библиотеки.
KINOZAL_CHALLENGE_COOLDOWN_SEC 1800 Пауза после неудачной попытки пройти проверку, чтобы десятки раздач не тратили по таймауту каждая.
KINOZAL_SOLVER_CACHE_TTL_SEC 90 Время жизни кэша страниц солвера.

Про Unraid

В docker-compose.yml у обоих сервисов есть метки:

      net.unraid.docker.managed: composeman
      net.unraid.docker.webui: "http://[IP]:[PORT:6687]/"

[IP] и [PORT:6687] — не заготовки, которые нужно заполнить
руками
. Это синтаксис самого Unraid: он подставит туда адрес сервера
и фактический порт. Оставьте строки как есть.

Метки нужны, чтобы контейнеры появились в списке Docker в веб-интерфейсе
Unraid с работающей ссылкой на интерфейс. Надёжнее всего это работает,
если стек развёрнут через плагин Compose Manager (Apps → Compose
Manager). Контейнеры, созданные через Portainer, Unraid показывает
не всегда.

На других системах метки просто игнорируются.


Диагностика

docker logs -f monitorrent 2>&1 | grep -i kinozal
docker logs -f byparr
Строка в логе Что значит
using curl_cffi with browser TLS impersonation Имитация отпечатка включена. Появляется при первом запросе, а не при старте.
'curl_cffi' is not installed Пакет не попал в образ. См. шаг 2, особенно про docker commit.
matching TLS impersonation profile to the solver's browser Профиль подстроен под браузер солвера. Норма.
cf_clearance rejected, refreshing it via solver Кука протухла, идём за новой. Норма, если происходит редко.
Cloudflare challenge page received Прямой запрос отбит. Если повторяется постоянно даже после обновления куки — не сходится профиль отпечатка.
timed out ... 0 bytes received Защиту прошли, зеркало не успевает ответить. Увеличьте KINOZAL_REQUEST_TIMEOUT_SEC.
mirror domain is empty or invalid В настройках плагина не заполнено поле «Зеркало».
TLS impersonation profile is not supported by the installed curl_cffi Набор профилей зависит от версии библиотеки. Плагин сам переключится на доступный; строка информационная.
'mn1_menu' block not found + заголовок страницы без слова «Вход» Раздача удалена с трекера. Проверьте ссылку в браузере.
'mn1_menu' block not found + заголовок «Вход» Сессия не авторизована, войдите заново в настройках плагина.

В логах Byparr в норме тишина и редкие
Challenge detected → Clicked the challenge checkbox → Done.


Ограничения

  • Скачивание .torrent выполняет сам движок monitorrent своим кодом,
    мимо curl_cffi. Пока проходит за счёт куки и User-Agent от солвера,
    но это слабое место: если проверка обновлений работает, а скачивание
    отдаёт 403 — причина здесь.
  • Byparr не гарантирует прохождение. Turnstile меняется, и его автор
    об этом честно предупреждает.
  • Byparr держит один браузер. Плагин выстраивает обращения к нему
    в очередь; не направляйте туда параллельно другие приложения.
  • Решение рассчитано на учётную запись, которая у вас уже есть.
    Обхода авторизации здесь нет.

Благодарности

kinozal.py
Dockerfile.yml
(убрать .yml - иначе гитхаб не позволяет залить файл)
docker-compose.yml

P.S. Проверьте, достаточно ли подробно и понятно написана инструкция.Вдруг, какой-нибудь шаг может оказаться неочевидным
Видел, что lostfilm тоже спрятался за CF - уверен, найденное решение и там поможет, но у меня нет там раздач активных, тестировать особо не на чем.
P.P.S. Судя по всему, автор свовсем охладел к проекту и забросил его. Много осталось пользователей? Есть смысл форкать и продолжать поддерживать его или все уже перешли на онлайн просмотр через лампу и торсерв?

<!-- gh-comment-id:5729438993 --> @zalessky commented on GitHub (Sep 18, 2026): <html> <body> <!--StartFragment--><html><head></head><body><h1>monitorrent + kinozal за Cloudflare</h1> <p>Плагин <code>kinozal.py</code> для <a href="https://github.com/werwolfby/monitorrent">monitorrent</a>, работающий с зеркалами kinozal, закрытыми защитой Cloudflare Turnstile, и инструкция, как всё это развернуть.</p> <hr> <h2>Проблема</h2> <p>Осенью 2026 зеркала <code>kinozal.me</code> и <code>kinozal.guru</code> встали за Cloudflare Turnstile. Штатный плагин monitorrent получает от них <code>403</code> со страницей «Just a moment…» и не может ни проверить обновление раздачи, ни скачать торрент-файл. Зеркала без защиты (<code>jumpingcrab.com</code>, <code>cloudns.nz</code>) отвечают <code>429 Too Many Requests</code> — они маленькие и быстро упираются в свой лимит.</p> <h2>Что не сработало</h2> <p>Проверено на практике, чтобы вы не тратили время:</p> Подход | Результат -- | -- cloudscraper | Turnstile не берёт в принципе: нет JS-движка, решает только старый вычислительный челлендж. Проект не развивается с 2023 года. Ручное копирование cf_clearance из своего браузера | Cloudflare сверяет отпечаток TLS-соединения. Кука, добытая в Chrome и предъявленная из Python, отвергается. Playwright внутри monitorrent, headless Firefox | Turnstile не проходит. Проверено на Firefox 110 и на Firefox 150 — одинаково, полный таймаут ожидания. Byparr как источник самих страниц | Cloudflare проходит, но его браузер неавторизован: подстановка ваших кук не поддерживается (PR #314 не влит), и details.php отдаёт форму входа. request.post к Byparr (логин через солвер) | Не реализован, тот же PR. Логин через GET-параметры | takelogin.php не принимает данные формы из query string. <p>В логах Byparr в норме тишина и редкие <code>Challenge detected</code> → <code>Clicked the challenge checkbox</code> → <code>Done</code>.</p> <hr> <h2>Ограничения</h2> <ul> <li><strong>Скачивание <code>.torrent</code></strong> выполняет сам движок monitorrent своим кодом, мимо curl_cffi. Пока проходит за счёт куки и User-Agent от солвера, но это слабое место: если проверка обновлений работает, а скачивание отдаёт 403 — причина здесь.</li> <li><strong>Byparr не гарантирует прохождение.</strong> Turnstile меняется, и его автор об этом честно предупреждает.</li> <li><strong>Byparr держит один браузер.</strong> Плагин выстраивает обращения к нему в очередь; не направляйте туда параллельно другие приложения.</li> <li>Решение рассчитано на учётную запись, которая у вас уже есть. Обхода авторизации здесь нет.</li> </ul> <h2>Благодарности</h2> <ul> <li><a href="https://github.com/werwolfby/monitorrent">werwolfby/monitorrent</a></li> <li><a href="https://github.com/thephaseless/Byparr">thephaseless/Byparr</a></li> <li><a href="https://github.com/lexiforest/curl_cffi">lexiforest/curl_cffi</a></li> </ul></body></html><!--EndFragment--> </body> </html># monitorrent + kinozal за Cloudflare Плагин `kinozal.py` для [[monitorrent](https://github.com/werwolfby/monitorrent)](https://github.com/werwolfby/monitorrent), работающий с зеркалами kinozal, закрытыми защитой Cloudflare Turnstile, и инструкция, как всё это развернуть. --- ## Проблема Осенью 2026 зеркала `kinozal.me` и `kinozal.guru` встали за Cloudflare Turnstile. Штатный плагин monitorrent получает от них `403` со страницей «Just a moment…» и не может ни проверить обновление раздачи, ни скачать торрент-файл. Зеркала без защиты (`jumpingcrab.com`, `cloudns.nz`) отвечают `429 Too Many Requests` — они маленькие и быстро упираются в свой лимит. ## Что не сработало Проверено на практике, чтобы вы не тратили время: | Подход | Результат | |---|---| | `cloudscraper` | Turnstile не берёт в принципе: нет JS-движка, решает только старый вычислительный челлендж. Проект не развивается с 2023 года. | | Ручное копирование `cf_clearance` из своего браузера | Cloudflare сверяет отпечаток TLS-соединения. Кука, добытая в Chrome и предъявленная из Python, отвергается. | | Playwright внутри monitorrent, headless Firefox | Turnstile не проходит. Проверено на Firefox 110 и на Firefox 150 — одинаково, полный таймаут ожидания. | | Byparr как источник самих страниц | Cloudflare проходит, но его браузер неавторизован: подстановка ваших кук не поддерживается ([[PR #314](https://github.com/thephaseless/Byparr/pull/314)](https://github.com/thephaseless/Byparr/pull/314) не влит), и `details.php` отдаёт форму входа. | | `request.post` к Byparr (логин через солвер) | Не реализован, тот же PR. | | Логин через GET-параметры | `takelogin.php` не принимает данные формы из query string. | ## Что работает Роли разделены: 1. **Byparr** проходит Turnstile и отдаёт валидную куку `cf_clearance`. Дёргается редко — только когда куку отвергли. 2. **Плагин** ходит на зеркало напрямую через **curl_cffi** — библиотеку, которая повторяет TLS-рукопожатие настоящего браузера. Отпечаток совпадает с браузером солвера, и кука принимается. 3. Авторизация на трекере живёт в этих же прямых запросах, поэтому страницы приходят нормальные, а не гостевые. Профиль TLS подбирается автоматически под User-Agent, который вернул солвер. Это важно: если отпечаток будет от одной версии браузера, а User-Agent от другой, Cloudflare сочтёт это рассогласованием и снова покажет проверку. В установившемся режиме браузер запускается раз в несколько часов, всё остальное время идут обычные быстрые HTTP-запросы. --- ## Что понадобится - Docker и docker compose; - около 2 ГБ свободной памяти под браузер внутри Byparr; - действующая учётная запись на kinozal; - выход в интернет с сервера (на сборку образа нужен доступ к PyPI). Файлы из этого репозитория: | Файл | Зачем | |---|---| | `kinozal.py` | Сам плагин. Подкладывается в контейнер поверх штатного. | | `Dockerfile` | Рецепт образа: официальный monitorrent + пакет `curl_cffi`. | | `docker-compose.yml` | Описание двух контейнеров: monitorrent и byparr. | --- ## Шаг 1. Каталоги и файлы Выберите каталог, где будут лежать база и плагин. Он может быть любым, главное — постоянным. Типичный выбор: | Система | Путь | |---|---| | Unraid | `/mnt/user/appdata/monitorrent` | | Synology | `/volume1/docker/monitorrent` | | Обычный Linux | `/opt/monitorrent` или `/srv/monitorrent` | Дальше по тексту используется `/srv/monitorrent` — подставляйте свой. ```bash mkdir -p /srv/monitorrent/{db,plugins,build} ``` Положите файлы: - `kinozal.py` → `/srv/monitorrent/plugins/kinozal.py` - `Dockerfile` → `/srv/monitorrent/build/Dockerfile` - `docker-compose.yml` → `/srv/monitorrent/` (или вставьте его текст прямо в редактор стека Portainer) Если monitorrent у вас уже работает — **не создавайте новую базу**. Найдите, где лежит текущая `monitorrent.db`, и укажите в compose именно этот каталог, иначе потеряете список раздач. ## Шаг 2. Образ с curl_cffi `curl_cffi` — обычный пакет с PyPI, в штатном образе monitorrent его нет. Готового образа с ним нигде не опубликовано, поэтому нужно один раз собрать свой. Есть два способа. ### Способ А: собрать по Dockerfile (рекомендуется) Весь `Dockerfile` — это две строки: взять официальный образ и доставить в него пакет. ```bash cd /srv/monitorrent/build docker build --no-cache -t monitorrent-cffi:latest . ``` Флаг `--no-cache` важен: без него Docker может подставить слой от предыдущей сборки, и пакет молча не установится. Проверка: ```bash docker run --rm monitorrent-cffi:latest python3 -c "import curl_cffi; print(curl_cffi.__version__)" ``` Должен напечатать номер версии. Если вместо этого `ModuleNotFoundError` — пересоберите, убедившись, что `--no-cache` на месте. ### Способ Б: доустановить в работающий контейнер и зафиксировать Годится, если собирать образ неудобно. Сначала запустите штатный monitorrent (или используйте уже работающий), затем: ```bash # 1. доустановить пакет внутрь работающего контейнера docker exec monitorrent pip install curl_cffi # 2. сохранить изменённый контейнер как новый образ docker commit monitorrent monitorrent-cffi:latest ``` После этого в `docker-compose.yml` останется `image: monitorrent-cffi:latest`, и при пересоздании контейнера пакет никуда не денется. Важно понимать разницу: `docker exec ... pip install` сам по себе живёт **только до пересоздания контейнера**. Именно `docker commit` (или сборка по Dockerfile) делает изменение постоянным. Если пропустить второй шаг, после ближайшего обновления стека всё вернётся к исходному состоянию и в логах появится `'curl_cffi' is not installed`. ## Шаг 3. Правка docker-compose.yml Откройте файл и замените пути в разделах `volumes` на свои. Менять нужно только то, что **слева от двоеточия** — правая часть это путь внутри контейнера, он фиксированный: ```yaml - /srv/monitorrent/db:/db - /srv/monitorrent/plugins/kinozal.py:/var/www/monitorrent/monitorrent/plugins/trackers/kinozal.py ``` Если порт 6687 на хосте занят, поменяйте левое число: `"8687:6687/tcp"`. Если у вас подменены и другие плагины (например `lostfilm.py`), добавьте для них такие же строки. ## Шаг 4. Запуск Из командной строки: ```bash cd /srv/monitorrent docker compose up -d ``` Или через Portainer: **Stacks → Add stack → Web editor**, вставить содержимое `docker-compose.yml`, нажать **Deploy the stack**. Byparr при первом старте скачивает браузер — это несколько минут. Дождитесь готовности: ```bash curl -s http://localhost:8191/health ``` Проверьте, что monitorrent видит солвер: ```bash docker exec monitorrent python3 -c " import json, urllib.request req = urllib.request.Request('http://byparr:8191/v1', data=json.dumps({'cmd':'request.get','url':'https://example.com', 'maxTimeout':60000}).encode(), headers={'Content-Type':'application/json'}) print(json.loads(urllib.request.urlopen(req, timeout=120).read()).get('status')) " ``` Ожидаемый ответ — `ok`. ## Шаг 5. Настройка плагина Откройте `http://<адрес-сервера>:6687` → **Settings → Trackers → kinozal.tv**: - **Логин** и **Пароль** — ваша учётная запись на трекере; - **Зеркало** — домен без `https://` и без завершающего слэша, например `kinozal.guru`. Нажмите **Save**, затем **Check**. Должно появиться `Connection successful`. Домен зеркала хранится отдельно от ссылок на раздачи: когда kinozal переедет на новый адрес, достаточно поменять одно это поле — все сохранённые раздачи продолжат работать, даже если в их ссылках стоит старый домен. --- ## Как обновить плагин потом Если плагин подключён томом (как в `docker-compose.yml` выше), достаточно заменить файл и перезапустить контейнер: ```bash cp kinozal.py /srv/monitorrent/plugins/kinozal.py docker restart monitorrent ``` Если тома нет и нужно положить файл внутрь разово: ```bash docker cp kinozal.py monitorrent:/var/www/monitorrent/monitorrent/plugins/trackers/kinozal.py docker restart monitorrent ``` Учтите: скопированный так файл исчезнет при пересоздании контейнера. Для постоянной работы лучше подключить том. Проверить, какая версия сейчас в контейнере: ```bash docker exec monitorrent sha256sum /var/www/monitorrent/monitorrent/plugins/trackers/kinozal.py sha256sum kinozal.py ``` Суммы должны совпасть. --- ## Переменные окружения | Переменная | По умолчанию | Назначение | |---|---|---| | `KINOZAL_BYPARR_URL` | не задана | Адрес солвера, например `http://byparr:8191/v1`. Без неё плагин работает в прямом режиме — годится для зеркал без защиты. | | `KINOZAL_REQUEST_TIMEOUT_SEC` | `45` | Таймаут запросов к зеркалу. Штатных 10 секунд monitorrent не хватает. | | `KINOZAL_IMPERSONATE` | подбирается автоматически | Профиль TLS-отпечатка. По умолчанию подстраивается под User-Agent солвера, причём только из тех версий, которые есть в установленной `curl_cffi`. Задавайте вручную, только если автоподбор ошибается — и сверьтесь со списком своей версии библиотеки. | | `KINOZAL_CHALLENGE_COOLDOWN_SEC` | `1800` | Пауза после неудачной попытки пройти проверку, чтобы десятки раздач не тратили по таймауту каждая. | | `KINOZAL_SOLVER_CACHE_TTL_SEC` | `90` | Время жизни кэша страниц солвера. | --- ## Про Unraid В `docker-compose.yml` у обоих сервисов есть метки: ```yaml net.unraid.docker.managed: composeman net.unraid.docker.webui: "http://[IP]:[PORT:6687]/" ``` `[IP]` и `[PORT:6687]` — **не заготовки, которые нужно заполнить руками**. Это синтаксис самого Unraid: он подставит туда адрес сервера и фактический порт. Оставьте строки как есть. Метки нужны, чтобы контейнеры появились в списке Docker в веб-интерфейсе Unraid с работающей ссылкой на интерфейс. Надёжнее всего это работает, если стек развёрнут через плагин **Compose Manager** (Apps → Compose Manager). Контейнеры, созданные через Portainer, Unraid показывает не всегда. На других системах метки просто игнорируются. --- ## Диагностика ```bash docker logs -f monitorrent 2>&1 | grep -i kinozal docker logs -f byparr ``` | Строка в логе | Что значит | |---|---| | `using curl_cffi with browser TLS impersonation` | Имитация отпечатка включена. Появляется при первом запросе, а не при старте. | | `'curl_cffi' is not installed` | Пакет не попал в образ. См. шаг 2, особенно про `docker commit`. | | `matching TLS impersonation profile to the solver's browser` | Профиль подстроен под браузер солвера. Норма. | | `cf_clearance rejected, refreshing it via solver` | Кука протухла, идём за новой. Норма, если происходит редко. | | `Cloudflare challenge page received` | Прямой запрос отбит. Если повторяется постоянно даже после обновления куки — не сходится профиль отпечатка. | | `timed out ... 0 bytes received` | Защиту прошли, зеркало не успевает ответить. Увеличьте `KINOZAL_REQUEST_TIMEOUT_SEC`. | | `mirror domain is empty or invalid` | В настройках плагина не заполнено поле «Зеркало». | | `TLS impersonation profile is not supported by the installed curl_cffi` | Набор профилей зависит от версии библиотеки. Плагин сам переключится на доступный; строка информационная. | | `'mn1_menu' block not found` + заголовок страницы без слова «Вход» | Раздача удалена с трекера. Проверьте ссылку в браузере. | | `'mn1_menu' block not found` + заголовок «Вход» | Сессия не авторизована, войдите заново в настройках плагина. | В логах Byparr в норме тишина и редкие `Challenge detected` → `Clicked the challenge checkbox` → `Done`. --- ## Ограничения - **Скачивание `.torrent`** выполняет сам движок monitorrent своим кодом, мимо curl_cffi. Пока проходит за счёт куки и User-Agent от солвера, но это слабое место: если проверка обновлений работает, а скачивание отдаёт 403 — причина здесь. - **Byparr не гарантирует прохождение.** Turnstile меняется, и его автор об этом честно предупреждает. - **Byparr держит один браузер.** Плагин выстраивает обращения к нему в очередь; не направляйте туда параллельно другие приложения. - Решение рассчитано на учётную запись, которая у вас уже есть. Обхода авторизации здесь нет. ## Благодарности - [[werwolfby/monitorrent](https://github.com/werwolfby/monitorrent)](https://github.com/werwolfby/monitorrent) - [[thephaseless/Byparr](https://github.com/thephaseless/Byparr)](https://github.com/thephaseless/Byparr) - [[lexiforest/curl_cffi](https://github.com/lexiforest/curl_cffi)](https://github.com/lexiforest/curl_cffi) [kinozal.py](https://github.com/user-attachments/files/32380330/kinozal.py) [Dockerfile.yml](https://github.com/user-attachments/files/32379857/Dockerfile.yml) (убрать .yml - иначе гитхаб не позволяет залить файл) [docker-compose.yml](https://github.com/user-attachments/files/32379806/docker-compose.yml) P.S. Проверьте, достаточно ли подробно и понятно написана инструкция.Вдруг, какой-нибудь шаг может оказаться неочевидным Видел, что lostfilm тоже спрятался за CF - уверен, найденное решение и там поможет, но у меня нет там раздач активных, тестировать особо не на чем. P.P.S. Судя по всему, автор свовсем охладел к проекту и забросил его. Много осталось пользователей? Есть смысл форкать и продолжать поддерживать его или все уже перешли на онлайн просмотр через лампу и торсерв?
Author
Owner

@Grosses84 commented on GitHub (Sep 23, 2026):

Ну ты мощЬ! Так подробно всё описал, к сожалению это не мой случай. У меня монитор запущен из под винды:(

<!-- gh-comment-id:5787319419 --> @Grosses84 commented on GitHub (Sep 23, 2026): Ну ты мощЬ! Так подробно всё описал, к сожалению это не мой случай. У меня монитор запущен из под винды:(
Author
Owner

@zalessky commented on GitHub (Sep 23, 2026):

Установка без Docker (Windows, Linux)

Если monitorrent у вас запускается напрямую, а не в контейнере,
нужно сделать две вещи: доставить пакет curl_cffi в тот Python,
которым работает monitorrent, и где-то поднять Byparr.

1. curl_cffi

Сначала выясните, какой именно Python запускает monitorrent —
у многих в системе их несколько, и пакет легко поставить не туда.

Linux:

# если monitorrent запущен — посмотреть его интерпретатор
ps -eo pid,cmd | grep [s]erver.py

# если используется виртуальное окружение monitorrent
/path/to/monitorrent/venv/bin/pip install curl_cffi
/path/to/monitorrent/venv/bin/python -c "import curl_cffi; print(curl_cffi.__version__)"

# если системный Python
python3 -m pip install curl_cffi

Windows (PowerShell или cmd):

cd C:\path\to\monitorrent
python -m pip install curl_cffi
python -c "import curl_cffi; print(curl_cffi.__version__)"

Если у monitorrent своё окружение, используйте его:
C:\path\to\monitorrent\venv\Scripts\python.exe -m pip install curl_cffi.

Здесь у вас преимущество перед Docker-установкой. В официальном
образе monitorrent Python 3.9, а curl_cffi новее 0.13.0 под него не
собирается — потолок имитации Firefox 135. Если ваш Python 3.10 или
новее, установится 0.16.x с профилями свежих Firefox, и отпечаток
сойдётся с браузером Byparr гораздо точнее. Проверить:

python -c "import typing; from curl_cffi.requests.impersonate import BrowserTypeLiteral; print([x for x in typing.get_args(BrowserTypeLiteral) if x.startswith('firefox')])"

2. Byparr

Byparr распространяется как контейнер, собственной установки под
Windows или Linux у него нет. Вариантов три:

  1. Docker только для Byparr. Сам monitorrent остаётся как есть,
    рядом ставится Docker (на Windows — Docker Desktop) и запускается
    один контейнер:

    docker run -d --name byparr --restart unless-stopped \
      --shm-size=2g -p 8191:8191 ghcr.io/thephaseless/byparr:main
    
  2. Byparr на другой машине в сети — например, на домашнем сервере
    или NAS. Тогда в адресе укажете её IP вместо localhost.

  3. Без Byparr вообще. Если вы работаете с зеркалом без защиты
    Cloudflare, солвер не нужен: не задавайте переменную
    KINOZAL_BYPARR_URL, и плагин будет ходить напрямую.

Проверка готовности:

curl http://localhost:8191/health

3. Переменные окружения

Плагин настраивается переменными окружения (список — в основном
разделе README). Задать их надо так, чтобы их видел процесс
monitorrent.

Linux, запуск вручную:

export KINOZAL_BYPARR_URL=http://localhost:8191/v1
export KINOZAL_REQUEST_TIMEOUT_SEC=45
python server.py

Linux, systemd — в unit-файле службы:

[Service]
Environment=KINOZAL_BYPARR_URL=http://localhost:8191/v1
Environment=KINOZAL_REQUEST_TIMEOUT_SEC=45

после правки: systemctl daemon-reload && systemctl restart monitorrent

Windows — либо через «Система → Дополнительные параметры системы →
Переменные среды» (нужен перезапуск monitorrent), либо bat-файлом
запуска:

@echo off
set KINOZAL_BYPARR_URL=http://localhost:8191/v1
set KINOZAL_REQUEST_TIMEOUT_SEC=45
python server.py

Учтите: setx задаёт переменную только для новых процессов, текущее
окно её не увидит.

4. Плагин

Положите kinozal.py в каталог трекеров, заменив штатный:

  • Linux: /path/to/monitorrent/monitorrent/plugins/trackers/kinozal.py
  • Windows: C:\path\to\monitorrent\monitorrent\plugins\trackers\kinozal.py

Исходный файл лучше сохранить (kinozal.py.bak), чтобы было куда
откатиться. После замены перезапустите monitorrent.

Проверка, что всё сошлось — в логе при первом запросе к трекеру должна
появиться строка using curl_cffi with browser TLS impersonation.

<!-- gh-comment-id:5789615437 --> @zalessky commented on GitHub (Sep 23, 2026): ## Установка без Docker (Windows, Linux) Если monitorrent у вас запускается напрямую, а не в контейнере, нужно сделать две вещи: доставить пакет `curl_cffi` в тот Python, которым работает monitorrent, и где-то поднять Byparr. ### 1. curl_cffi Сначала выясните, какой именно Python запускает monitorrent — у многих в системе их несколько, и пакет легко поставить не туда. **Linux:** ```bash # если monitorrent запущен — посмотреть его интерпретатор ps -eo pid,cmd | grep [s]erver.py # если используется виртуальное окружение monitorrent /path/to/monitorrent/venv/bin/pip install curl_cffi /path/to/monitorrent/venv/bin/python -c "import curl_cffi; print(curl_cffi.__version__)" # если системный Python python3 -m pip install curl_cffi ``` **Windows (PowerShell или cmd):** ``` cd C:\path\to\monitorrent python -m pip install curl_cffi python -c "import curl_cffi; print(curl_cffi.__version__)" ``` Если у monitorrent своё окружение, используйте его: `C:\path\to\monitorrent\venv\Scripts\python.exe -m pip install curl_cffi`. **Здесь у вас преимущество перед Docker-установкой.** В официальном образе monitorrent Python 3.9, а `curl_cffi` новее 0.13.0 под него не собирается — потолок имитации Firefox 135. Если ваш Python 3.10 или новее, установится 0.16.x с профилями свежих Firefox, и отпечаток сойдётся с браузером Byparr гораздо точнее. Проверить: ``` python -c "import typing; from curl_cffi.requests.impersonate import BrowserTypeLiteral; print([x for x in typing.get_args(BrowserTypeLiteral) if x.startswith('firefox')])" ``` ### 2. Byparr Byparr распространяется как контейнер, собственной установки под Windows или Linux у него нет. Вариантов три: 1. **Docker только для Byparr.** Сам monitorrent остаётся как есть, рядом ставится Docker (на Windows — Docker Desktop) и запускается один контейнер: ``` docker run -d --name byparr --restart unless-stopped \ --shm-size=2g -p 8191:8191 ghcr.io/thephaseless/byparr:main ``` 2. **Byparr на другой машине в сети** — например, на домашнем сервере или NAS. Тогда в адресе укажете её IP вместо `localhost`. 3. **Без Byparr вообще.** Если вы работаете с зеркалом без защиты Cloudflare, солвер не нужен: не задавайте переменную `KINOZAL_BYPARR_URL`, и плагин будет ходить напрямую. Проверка готовности: ``` curl http://localhost:8191/health ``` ### 3. Переменные окружения Плагин настраивается переменными окружения (список — в основном разделе README). Задать их надо так, чтобы их видел процесс monitorrent. **Linux, запуск вручную:** ```bash export KINOZAL_BYPARR_URL=http://localhost:8191/v1 export KINOZAL_REQUEST_TIMEOUT_SEC=45 python server.py ``` **Linux, systemd** — в unit-файле службы: ```ini [Service] Environment=KINOZAL_BYPARR_URL=http://localhost:8191/v1 Environment=KINOZAL_REQUEST_TIMEOUT_SEC=45 ``` после правки: `systemctl daemon-reload && systemctl restart monitorrent` **Windows** — либо через «Система → Дополнительные параметры системы → Переменные среды» (нужен перезапуск monitorrent), либо bat-файлом запуска: ```bat @echo off set KINOZAL_BYPARR_URL=http://localhost:8191/v1 set KINOZAL_REQUEST_TIMEOUT_SEC=45 python server.py ``` Учтите: `setx` задаёт переменную только для новых процессов, текущее окно её не увидит. ### 4. Плагин Положите `kinozal.py` в каталог трекеров, заменив штатный: - Linux: `/path/to/monitorrent/monitorrent/plugins/trackers/kinozal.py` - Windows: `C:\path\to\monitorrent\monitorrent\plugins\trackers\kinozal.py` Исходный файл лучше сохранить (`kinozal.py.bak`), чтобы было куда откатиться. После замены перезапустите monitorrent. Проверка, что всё сошлось — в логе при первом запросе к трекеру должна появиться строка `using curl_cffi with browser TLS impersonation`.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
werwolfby/monitorrent#328
No description provided.