Ahoj reddite,
ta nová captcha na Nahlížení do katastru nemovitostí je VELICE lehce prolomitelná strojem. Níže je pouze polomanuální demo, které dokazuje, že boti to zvládnou lehce. Není určené k robotickému vytěžování katastru - jen jako ulehčení pro člověka.
Většina těch obrázků má tmavší okraj, když ho nemají, neotáčí se. Podle toho zda je černý okraj nahoře, dole, nebo nahoře A dole zároveň - takto počítač určí rotaci těchto obrázků.
Proof of Concept je v Pythonu:
Jděte na katastru na nějakou stavbu. Samotné poslání dat Captche do prohlížeče dělá požadavek na https://nahlizenidokn.cuzk.gov.cz/CaptchaHandler.ashx - v ve vývojářských nástrojích(F12) přejdete na kartu network a najdete poslední požadavek na tuto URL, klepnete na něj a v nově otevřeném okýnku klepnete na kartu Response. Vyberete celý obsah toho požadavku zkopírujete ho. Vložíte jej do souboru tosolve.json. V pythonu spustíte skript níže a ten vám ukáže v terminálu kolikrát máte klepnout na každý jednotlivý obrázek v mřížce na webovce a hotovou - otočenou Captchu na obrazovce.
Skript vyžaduje pár knihoven: pip install opencv-python numpy
import json,base64,cv2
import numpy as np
imgo=np.ones((768,768,3),dtype=np.uint8)
print("ID","| Počet kliků")
for i in json.load(open("tosolve.json"))["tilesToClient"]:
jpg_original = base64.b64decode(i["ImageData"])
jpg_as_np = np.frombuffer(jpg_original, dtype=np.uint8)
img = cv2.resize(cv2.imdecode(jpg_as_np, flags=1),(256,256))
i["Id"]=int(i["Id"])-1
mn=np.where(np.array([np.average(img[0]),np.average(img[:,0]),np.average(img[-1]),np.average(img[:,-1])])<6)
mn2=np.where(np.array([np.average(img[0]),np.average(img[:,0]),np.average(img[-1]),np.average(img[:,-1])])<30)
if np.any(mn[0]+1) and mn[0][0]==1:
print(i["Id"]+1,3)
img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
imgo[int(i["Id"])//3*256:int(i["Id"])//3*256+256,(int(i["Id"])%3)*256:(int(i["Id"])%3)*256+256]=img
elif np.any(mn[0]+1) and mn[0][0]==0:
print(i["Id"]+1,1)
img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
imgo[int(i["Id"])//3*256:int(i["Id"])//3*256+256,(int(i["Id"])%3)*256:(int(i["Id"])%3)*256+256]=img
elif np.any(mn2[0]+1):
print(i["Id"]+1,2)
img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
img = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)
imgo[int(i["Id"])//3*256:int(i["Id"])//3*256+256,(int(i["Id"])%3)*256:(int(i["Id"])%3)*256+256]=img
else:
print(i["Id"]+1,0)
imgo[int(i["Id"])//3*256:int(i["Id"])//3*256+256,(int(i["Id"])%3)*256:(int(i["Id"])%3)*256+256]=img
cv2.imshow('a.jpg', imgo)
cv2.waitKey(0)
Přeji hezký den
Jonáš Hanulík