Instalace Ulož.to captcha serveru a integrace pro pyLoad
V tomto návodu si nainstalujeme jednoduchý server pro řešení captchy z Ulož.to na Raspberry PI. Potřebujeme mít nainstalovaný Ubuntu Server 22 z předchozího návodu. Je nutné mít statickou IP adresu pro náš server v síti. Captchu můžeme řešit pouze pro naší instanci pyLoad na Raspberry PI, nebo i pro všechy ostatní instance pyLoadu, běžící v síti (např. v LXC kontejnerech na Omnii). Tento návod pokrývá obě možnosti.
Server je postaven na projektu ulozto-captcha-breaker, na výsledném modelu pro Tensor Flow. Je to napsané v Pythonu. Raspberry PI jsem vytáhl ze šuplíku, protože rozchodit potřebnou knihovnu tflite_runtime v LXC kontejneru na Turris Omnia se mi nepodařilo.
Vůbec instalace tflite_runtime je trochu složitější, vyžaduje přesné verze Python3 - v novějších Debian forcích (jako je náš Ubuntu Server 22.04.2 64bit) jsou novější verze Python3 než vyžaduje tato knihovna.
O výslednou integraci s pyLoadem se stará jednoduchý prográmek, který jsem vytvořil. Nejsem Pythonář, ale nakonec jsem to zvládnul a vše funguje.
Vše budeme instalovat jako root uživatel, je to nejjednodušší. Abychom nemuseli stále psát sudo, nalogujeme se jako root:
sudo su
Nejdříve si nainstalujeme potřebné knihovny:
apt install -y python3-pip make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev llvm libncurses5-dev libncursesw5-dev tk-dev liblzma-dev
Jdeme do domovského adresáře root uživatele:
cd /root
A nainstalujeme si podporovanou verzi Python3 přes pyenv:
curl https://pyenv.run | bash
Přidáme si do PATH:
vim .bashrc
Na konec souboru vložíme tyto řádky:
export PATH="${HOME}/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
Aplikujeme změny:
source ~/.bashrc
Nainstalujeme si vrzi Pythonu 3.9.16, na které tflite-runtime funguje:
pyenv install 3.9.16
To bude dlooouho trvat. Až se doinstaluje, podíváme se na verze:
pyenv versions
A přepneme na naší verzi:
pyenv global 3.9
A už konečne můžeme nainstalovat to, co skutečně potřebujeme:
python3 -m pip install tflite-runtime Pillow
Nyní si stáhneme projekt na řešení captcha (jsme v /root):
git clone https://github.com/jdvorak23/ulozto-captcha.git
Pokud máme pyLoad pouze na tom samém Raspberry PI a nepotřebujeme řešit captchu pro jiné pyLoady v síti, přepneme na verzi local (jinak tento krok vynecháme):
cd /root/ulozto-captcha/
git checkout local
Tento program si musíme nastavit jako službu, aby se spouštěl automaticky:
vim /etc/systemd/system/captcha.service
Tím jsme vytvořili prázdný soubor, do kterého vložíme:
[Unit]
Description=Socket for captcha resolving script
After=network.target
[Service]
User=root
Group=root
ExecStart=/root/.pyenv/versions/3.9.16/bin/python /root/ulozto-captcha/captcha.py
Restart=always
[Install]
WantedBy=multi-user.target
A uložíme. Povolíme a nastartujeme službu:
systemctl enable captcha.service
systemctl start captcha.service
Zkontrolujeme že běží:
systemctl status captcha.service
Pokud je vše v pořádku, zkusíme test:
python3 /root/ulozto-captcha/test.py
A měli bychom vidět něco takovéhoto (s jinou IP pravděpodobně, v local verzi localhost):
IP: 192.168.1.223 Port: 9988 good
Integrace do pyLoad
Ještě musíme nastavit pyLoad, aby posílal captchy z Ulož.to do naší captcha služby. To se dělá pomocí hooku, který je součástí projektu. Pokud máme verzi local, následující krok vynecháme:
vim /root/ulozto-captcha/assets/UlozToCaptcha.py
A najdeme řádky:
__config__ = [("activated", "bool", "Activated", True),
("host", "string", "IP or hostname or localhost", "pyload.xxx"),
("port", "int", "Port of open socket", 9988)]
Pokud jsme nastavovali vše přesně podle návodu na tomto blogu, nemusíme taktéž nic upravovat. Pokud máme jiný název PC v síti, nebo nemáme DNS a připojujeme se pouze pomocí IP, přepíšeme pyload.xxx na naši IP / hostname. Soubor si uložíme.
Tento soubor musíme nakopírovat do našich pyLoadů. Zkopírování v případě, že máme pyLoad na našem Raspberry PI (stále jsme přihlášeni jako root):
cp /root/ulozto-captcha/assets/UlozToCaptcha.py /root/pyload/module/plugins/hooks/
V případě, že máme další pyLoad v LXC kontejneru na Omnii, můžeme zkopírovat takto, místo NAZEV_LXC vyplníme název kontejneru, který jsme si vybrali při vytváření kontejneru(podle předchozího návodu user1):
scp /root/ulozto-captcha/assets/UlozToCaptcha.py root@192.168.1.1:/srv/lxc/NAZEV_LXC/rootfs/root/pyload/module/plugins/hooks/
PyLoad musíme vyčistit a restartovat aby se změna projevila. Vždy na konkrétní stanici s pyLoadem:
systemctl stop pyload.service
python2 /root/pyload/pyLoadCore.py --clean
systemctl start pyload.service
K tomu bych ještě dodal, že nastavení pluginů a hooků je v souboru:
vim /root/.pyload/plugin.conf
Při prvním spuštění našeho hooku se zde vytvoří sekce s parametry našeho hooku - jako je třeba IP adresa a port. Pokud si po instalaci a prvním spuštění nějak hrajeme s nastaveními, nestačí pouze změnit IP v našem hooku (jak je uvedeno výše), nastavení pyLoad už bere z tohoto plugin.conf. Takže si IP musíme změnit zde, nebo vymazat celou složku s nastavením (.pyload) a spustit pyload znovu "poprvé" s nutností proklikat první nastavení jako když jsme ho nainstalovali.
A je to, zkusíme něco stáhnout, captcha se měla řešit automaticky. Občas se nevyřeší, pyLoad to ale za chvíli zkusí znovu. Pokud je captcha nesprávná, pyLoad o tom captcha aplikaci dá vědět - ta si ukládá pouze správně vyřešené captchy do adresáře images, tj. /root/ulozto-captcha/images. Pokud jich budeme mít hodně a jsme nadšenci, můžeme si vycvičit vlastní model. Jak je popsáno u projektu, ze kterého jsem vycvyčený model vzal(ulozto-captcha-breaker). Pokud Vám vše funguje, nezapomeňte jít na Git a "ohvězdičkovat" všechny projekty, díky kterým to máme: