CAPTCHA, kasus khusus: kami merusak jaringan saraf dengan tiga puluh baris kode

   Saya tidak ingat bagaimana saya menemukan artikel habr.com/en/post/464337 , tetapi itu tenggelam dalam otak saya dan tidak memberikan istirahat sampai hari terakhir. Beberapa kali saya mencoba memahami apa yang sedang terjadi, beberapa kali saya mencoba membuatnya bekerja, tetapi tidak berhasil: Saya sama sekali tidak mengerti apa-apa dalam jaringan saraf dan bahkan program seperti programmer sejati.
captcha senang


   Akhirnya, beberapa hari yang lalu, saya mengalahkan peluncuran python dan memutuskan mengapa tidak semua itu. Setelah melupakan semua yang saya baca di artikel yang disebutkan, saya pergi dengan cara saya sendiri.
   Mengingat begitu banyak captcha terselesaikan, saya menyarankan agar Anda dapat menyelesaikannya dengan perbandingan biasa dengan topeng, yang kemudian dikonfirmasi.
   Pertama, secara manual mengumpulkan captcha uji (83 buah) dan memberi mereka nama yang jelas. Script mengubahnya menjadi bitmap.

   Angka-angka dalam captcha tingginya dua ukuran dengan selisih 1 piksel dan lebar tiga hingga empat wajah. Garis dasar semua karakter di semua captcha adalah sama. Semua keragaman ini, ternyata, memiliki topeng umum tertentu, perbandingan yang secara unik mengidentifikasi sosok. Saya memotong beberapa (pada awalnya - 5, kemudian menambahkan 1-2; dari "4" butuh lebih lama dari yang lain) dari nomor yang sama dari captcha yang berbeda. Di paint.net, saya menempatkan mereka di atas satu sama lain dan mendapat topeng yang umum untuk semua wajah dari setiap digit.

   Saya menemukan satu-satunya masalah nanti, sudah selama pemrosesan massal, tetapi berhasil melewatinya
dengan tongkat
   , — «1», «2» .. «9». , , «4», «4», «1». , -, «123456789» «423156789» -, «4» , «1».

   Selain kesalahpahaman kecil ini, kebisingan tidak mengganggu sama sekali. Hasil dari tahap ini adalah satu set 9 topeng. Dua loop bersarang dan voila! - Semua 83 captcha saya dikenali dengan keras!

   

   Kemudian muncul pertanyaan: di mana mendapatkan set besar captcha untuk verifikasi. Dan saya mengunduh "29.000 captcha" dari artikel yang disebutkan.
Namun, ini ternyata hanya buang-buang waktu.
   - (, -, .. ), : : 6503 , 5420 , 760 .. – .. 14882, , , .
-, – -, – . PNG, – JPG, , . , – «”” ».

   Jadi saya harus mengungkap Google dan menambang captcha sempurna saya sendiri: 3224 file terakumulasi per malam, termasuk 49 yang benar-benar kosong, seperti yang ternyata nanti. Terima kasih Ganesha untuk kodenya .

   Sebenarnya pengakuan captcha cocok dengan 26 baris kode python yang membosankan. Dari modul eksternal hanya PIL yang dibutuhkan. Kecepatannya sekitar 1000 captcha per menit (seribu captcha per menit) pada Core 2 lama "empat core empat gigs". Pada aliran delapan yang lebih baik, i5 terasa lebih cepat, meskipun masalahnya, tentu saja, tidak ada di utas. Pengakuan 100% atau sangat dekat dengan itu: pemeriksaan spot tidak menunjukkan kesalahan.

   Tentu saja, semua ini tidak menarik dalam arti jaringan saraf dan blockchain lainnya, tetapi memiliki keunggulan yang sangat pasti atas opsi yang diusulkan sebelumnya: kecepatan dan akurasi. Memang benar bahwa setiap perubahan dalam parameter captcha - headset atau ukuran font, jenis kebisingan, dll. - akan mengarah pada ketidakmampuan sepenuhnya dari keputusan saya.

Unduh arsip dengan captcha dari Yandex.Disk (14MB).

Sumber
from PIL import Image, ImageTk

def recognize(filepath):
  Zlist = [] # [(x1, z1), (x2, z2), (x3, z3), etc.] - position and digit
  captcha = ""
  originalimage = Image.open(filepath).convert('L').point(lambda x : 255 if x > 20 else 0, mode='1').convert('1').convert('RGBA')
  if originalimage.getextrema() == ((0, 0), (0, 0), (0, 0), (255, 255)):
    return("empty image")
  for z in [4, 2, 3, 1, 5, 6, 7, 8, 9]: # reorder to exclude false 1 on 4
    mask = Image.open('mask' + str(z) + '.png').convert('RGBA')
    previ = 0
    for i in range(15, 120): # no digit in left part
      resultimage = Image.alpha_composite(originalimage.crop((i, 0, i + 30, 0 + 50)), mask)
      if resultimage.getextrema() == ((0, 0), (0, 0), (0, 0), (255, 255)):
        if z == 4: # delete 4 to exclude false 1 on 4
          maskx = Image.open('mask4x.png').convert('RGBA') 
          originalimage.paste(Image.alpha_composite(originalimage.crop((i, 0, i + 30, 0 + 50)), maskx), (i, 0))
        if previ == 0 or i > previ + 15: #no digit closer then 15 px
          Zlist.append((i, z))
          if len(Zlist) == 5:
              Zlist.sort()
              for z in Zlist:
                captcha = captcha + str(z[1])
              return(captcha)
          previ = i
          i = i + 15 #skip a little
  Zlist.sort()
  return(str(Zlist)) #if less then 5 digits recognized
	
def main():
  captcha = recognize(entry.path)
#----------------------------------------------#
#          #
#----------------------------------------------#

main()




Pembaruan pada 13 Februari 2020.
   Tentang apa itu semua? Tidak demi pengakuan olahraga dari gambar yang disimpan? Tidak, semua ini murni untuk tujuan pragmatis.
   Solusi siap untuk bekerja. - Server pengenalan http lokal plus ekstensi untuk Chrome.
   Sejauh ini, satu-satunya hal yang dapat (saya harap bisa) adalah memasukkan captcha secara otomatis di tempat yang tepat. Rencana:
  - membersihkan antarmuka situs, meninggalkan minimum yang diperlukan;
  - mengotomatiskan pembaruan captcha saat melihat informasi, seperti satu captcha memungkinkan untuk hanya membuka 4 objek.
  - Unduh semua pernyataan yang disiapkan sekaligus, dan jangan satu per satu.

Pembaruan pada 5 Maret 2020.
   Solusi siap untuk bekerja.- Server pengenalan http lokal plus ekstensi untuk Chrome.
   Memperbarui ekstensi untuk Chrome. Sekarang bisa, selain captcha auto-subtitusi,
 1. ketika membuka halaman dengan informasi tentang objek real estat, memperluas informasi tentang hak;
 2. Kumpulkan informasi dari halaman ini untuk diproses lebih lanjut.
   Tangkapan layar di komentar habr.com/post/488018/#comment_21360646

Pembaruan pada 17 April 2020 .
   Bot untuk memesan pernyataan dari daftar - karena pembatasan pada frekuensi pernyataan pemesanan - 1 pernyataan dalam 5 menit. Tangkapan layar dalam komentar

All Articles