CAPTCHA ، حالة خاصة: نكسر شبكة عصبية بثلاثين سطرًا من التعليمات البرمجية

   لا أتذكر كيف جئت عبر المقالة habr.com/ru/post/464337 ، لكنها غرقت في ذهني ولم تستريح حتى اليوم الأخير. حاولت عدة مرات فهم ما كان يحدث ، وحاولت عدة مرات أن أجعله يعمل ، ولكن دون جدوى: لا أفهم شيئًا تمامًا في الشبكات العصبية وحتى البرمجة مثل المبرمج الحقيقي.
كلمة التحقق سعيدة


   أخيرًا ، قبل أيام قليلة ، تغلبت على إطلاق الثعبان وقررت ، لماذا لا وما إلى ذلك. بعد أن نسيت كل ما قرأته في المقالة المذكورة ، ذهبت طريقي الخاص.
   تذكر عددًا كبيرًا من حروف التحقق التي تم حلها ، اقترحت أنه يمكنك حلها عن طريق المقارنة العادية مع القناع ، والذي تم تأكيده لاحقًا.
   أولاً ، تم تجميع اختبار CAPTCHA يدويًا (83 قطعة) وأعطاهم أسماء واضحة. حولها البرنامج النصي إلى صور نقطية.

   الأرقام في اختبار CAPTCHA حجمان في الارتفاع بفارق 1 بكسل وعرض من ثلاثة إلى أربعة وجوه. الخط الأساسي لجميع الأحرف في كل كلمة التحقق هو نفسه. كل هذا التنوع ، كما اتضح ، لديه قناع مشترك معين ، مقارنة تحدد بشكل فريد الرقم. قمت بقص عدة (في البداية - 5 ، ثم أضفت 1-2 أخرى ؛ من "4" استغرقت وقتًا أطول من البقية) من نفس الأرقام من captchas مختلفة. في paint.net ، وضعتهم فوق بعضهم البعض وحصلت على قناع مشترك لجميع وجوه كل رقم.

   اكتشفت المشكلة الوحيدة في وقت لاحق ، بالفعل أثناء المعالجة الجماعية ، ولكن تجاوزتها بنجاح
مع عكاز
   , — «1», «2» .. «9». , , «4», «4», «1». , -, «123456789» «423156789» -, «4» , «1».

   بالإضافة إلى سوء الفهم الصغير ، لا تتداخل الضوضاء على الإطلاق. كانت نتيجة هذه المرحلة مجموعة من 9 أقنعة. حلقتين متداخلتين وفويلا! - يتم التعرف على جميع كلمات التحقق الـ 83 الخاصة بي مع اثارة ضجة!

   

   ثم طرح السؤال: أين يمكن الحصول على مجموعة كبيرة من كلمة التحقق للتحقق. وقمت بتنزيل "29000 captcha" من المقالة المذكورة.
ومع ذلك ، تبين أن هذا مضيعة للوقت.
   - (, -, .. ), : : 6503 , 5420 , 760 .. – .. 14882, , , .
-, – -, – . PNG, – JPG, , . , – «”” ».

   لذلك اضطررت إلى الكشف عن Google وإزالة كلمة التحقق المثالية بمفردي: تم تجميع 3224 ملفًا في الليلة ، بما في ذلك 49 ملفًا فارغًا تمامًا ، كما اتضح لاحقًا. شكرا لك غانيشا على الكود .

   في الواقع ، يتناسب التعرف على كلمة التحقق مع 26 سطرًا من كود الثعبان الممل. من الوحدات الخارجية مطلوب فقط PIL. السرعة حوالي 1000 كلمة التحقق في الدقيقة (ألف كلمة التحقق في الدقيقة) على النواة القديمة 2 "أربعة نوى أربعة العربات". على i5 ثمانية لائقة أكثر لائق هو أسرع بشكل ملحوظ ، على الرغم من أن المسألة ، بالطبع ، ليست في الخيوط. الاعتراف بنسبة 100٪ أو قريب جدًا من ذلك: لم يُظهر الفحص الفوري أي أخطاء.

   بالطبع ، كل هذا ليس مثيرًا للاهتمام من حيث الشبكات العصبية وغيرها من blockchains ، ولكن له ميزة محددة جدًا على الخيار المقترح سابقًا: السرعة والدقة. من الصحيح أيضًا أن أي تغيير في معلمات اختبار CAPTCHA - سماعة الرأس أو حجم الخط ، ونوع الضوضاء ، وما إلى ذلك. - سيؤدي إلى عدم القدرة الكاملة على اتخاذ قراري.

قم بتنزيل الأرشيف باستخدام اختبار CAPTCHA من Yandex.Disk (14 ميجا بايت).

مصدر
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()




تحديث اعتبارًا من 13 فبراير 2020.
   عن ماذا كان كل هذا؟ ليس من أجل الاعتراف الرياضي بالصور المحفوظة؟ لا ، كل هذا كان لأغراض براغماتية بحتة.
   حل جاهز للعمل. - خادم التعرف http المحلي بالإضافة إلى ملحق كروم.
   حتى الآن ، الشيء الوحيد الذي يمكنه (آمل ذلك) هو إدخال كلمة التحقق تلقائيًا في المكان الصحيح. الخطط:
  - تنظيف واجهة الموقع ، مع ترك الحد الأدنى الضروري ؛
  - أتمتة تحديث اختبار CAPTCHA عند عرض المعلومات ، مثل تتيح كلمة التحقق الواحدة فتح 4 كائنات فقط.
  - قم بتنزيل جميع البيانات المعدة في وقت واحد ، وليس واحدًا تلو الآخر.

تحديث اعتبارًا من 5 مارس 2020.
   حل جاهز للعمل.- خادم التعرف http المحلي بالإضافة إلى ملحق كروم.
   تم تحديث امتداد Chrome. الآن أصبح بإمكانه ، بالإضافة إلى الاستبدال التلقائي لبرنامج CAPTCHA ،
 1. عند فتح صفحات تحتوي على معلومات حول العقارات ، توسيع المعلومات حول الحقوق ؛
 2. اجمع المعلومات من هذه الصفحات لمزيد من المعالجة.
   لقطة شاشة في التعليق habr.com/post/488018/#comment_21360646

التحديث اعتبارًا من 17 أبريل 2020 .
   بوت لترتيب العبارات من القائمة - بسبب القيود المفروضة على تكرار طلب العبارات - بيان واحد في 5 دقائق. لقطة شاشة في التعليق

All Articles