דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. פיענוח קאפצ'ה - בקוד פייתון

פיענוח קאפצ'ה - בקוד פייתון

מתוזמן נעוץ נעול הועבר ארכיון code613m
2 פוסטים 2 כותבים 244 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • clickoneC מנותק
    clickoneC מנותק
    clickone
    כתב ב נערך לאחרונה על ידי
    #1

    כיום אני מפענח קאפצ'ה דרך שירות http://deathbycaptcha.com

    2 חסרונות:

    1. זה עולה כסף (לא הרבה, אבל אם יש לך 3000 בקשות בשבוע , זה כסף בסופו של דבר.)
    2. היותר בעייתי - זה לוקח כמה שניות עד שיש תוצאה.

    בדקתי, ומצאתי קוד פייתון שאומרים שהוא עושה את העבודה.
    משום מה אני לא מצליח להריץ את הקוד, ולצערי הידע שלי בפייתון ממש חלש מכדי להבין מה הבעייה (אני מבין שכנראה חסרה החבילה של הOCR)

    יש מישהו שיכול לעזור? - מבחינתי כל קוד יתקבל בברכה, במיוחד קוד דוטנט. (אם זה OCR אז זה אמור להיות פשוט - אבל צריך קודם לנקות את הקישקושים)

    תמונות הקאפצ'ה שאני מדבר עליהם הם הפשוטות, ולא כמו של גוגל שצריך עיון גדול כדי לפענח מה כתוב שם 😞

    הנה תמונה לדוגמא:

    GovCaptchaImage.jpg

    והנה קוד פייתון:

    import sys
    import os
    import re
    import subprocess
    import tempfile
    from PIL import Image
    
    
    def parse_captcha(filename):
        """Return the text for thie image using Tesseract
        """
        img = threshold(filename)
        return tesseract(img)
    
    
    def threshold(filename, limit=100):
        """Make text more clear by thresholding all pixels above / below this limit to white / black
        """
        # read in colour channels
        img = Image.open(filename)
        # resize to make more clearer
        m = 1.5
        img = img.resize((int(img.size[0]*m), int(img.size[1]*m))).convert('RGBA')
        pixdata = img.load()
    
        for y in xrange(img.size[1]):
            for x in xrange(img.size[0]):
                if pixdata[x, y][0] < limit:
                    # make dark color black
                    pixdata[x, y] = (0, 0, 0, 255)
                else:
                    # make light color white
                    pixdata[x, y] = (255, 255, 255, 255)
        img.save('tmp/threshold_' + filename)
        return img.convert('L') # convert image to single channel greyscale
    
    
    
    def call_command(*args):
        """call given command arguments, raise exception if error, and return output
        """
        c = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        output, error = c.communicate()
        if c.returncode != 0:
            if error:
                print error
            print "Error running `%s'" % ' '.join(args)
        return output
    
    
    def tesseract(image):
        """Decode image with Tesseract  
        """
        # create temporary file for tiff image required as input to tesseract
        input_file = tempfile.NamedTemporaryFile(suffix='.tif')
        image.save(input_file.name)
    
        # perform OCR
        output_filename = input_file.name.replace('.tif', '.txt')
        call_command('tesseract', input_file.name, output_filename.replace('.txt', ''))
        
        # read in result from output file
        result = open(output_filename).read()
        os.remove(output_filename)
        return clean(result)
    
    
    def gocr(image):
        """Decode image with gocr
        """
        input_file = tempfile.NamedTemporaryFile(suffix='.ppm')
        image.save(input_file.name)
        result = call_command('gocr', '-i', input_file.name)
        return clean(result)
         
    
    def ocrad(image):
        """Decode image with ocrad
        """
        input_file = tempfile.NamedTemporaryFile(suffix='.ppm')
        image.save(input_file.name)
        result = call_command('ocrad', input_file.name)
        return clean(result)
    
    
    def clean(s):
        """Standardize the OCR output
        """
        # remove non-alpha numeric text
        return re.sub('[\W]', '', s)
    
    
    
    if __name__ == '__main__':
        filenames = sys.argv[1:]
        if filenames:
            for filename in filenames:
                img = threshold(filename)
                print filename
                print 'Tesseract:', tesseract(img)
                print 'Gocr:', gocr(img)
                print 'Ocrad:', ocrad(img)
                print
        else:
            print 'Usage: %s [image1] [image2] ...' % sys.argv[0]
    

    פורסם במקור בפורום CODE613 ב28/07/2014 01:27 (+03:00)

    אין טסט כמו פרודקשן.

    המייל שלי urivpn@gmail.com

    תגובה 1 תגובה אחרונה
    0
    • M מנותק
      M מנותק
      magicode
      כתב ב נערך לאחרונה על ידי
      #2

      אני פיענחתי קאפצה כזה בעבר עם php זה יחסית פשוט.

      לגבי ניקוי אתה יכול להשים לב שהליכלוכים זה נקודות קטנות מימלא אם אתה עושה פונקציה שעוברת פיקסל פיקסל ויוצרת קבוצות קבוצות של פיקסלים שחורים. אתה עושה מערך של פיקסלים לדוגמא 3,4 = קבוצה 6 וכן הלאה. וככה אתה יכול לחפש שאם יש פיקסל קרוב שכבר הוגדר לקבוצה מסויימת אתה מגדיר אותו באותו קבוצה כמו הפיקסל הקרוב.

      ואז אחרי שיש לך קבוצות של פיקסלים אתה יכול למחוק קבוצות שמספר הפיקסלים שלהם נמוך מX פיקסלים. או למחוק הכל חוץ מהחמישה הגדולים ביותר.

      הבעיה בקוד שלך זה שחסר לך תוכנה במחשב שנקראת tesseract או gocr או ocrad אתה לא צריך את פייתון בשביל להריץ פקודות shell אתה יכול לעשות את זה גם עם דוט נט.

      התוכנה שאני מכיר שעובדת טוב זה tesseract. אתה יוצר קובץ זמני של png ומריץ ככה.

      /path/to/tesseract pngfilename txtoutput
      

      בשביל למנוע בעיות תשים נתיבים מלאים של הקבצים. וגם התוכנה הזאת מוציאה קובץ שהיא מוסיפה לו סיומת txt לכן תכניס בלי סיומת ואחרי זה תקרא את הקובץ עם סיומת txt.

      אם היית מפתח בnode הייתי ממליץ לך על המחלקה הזאת
      https://www.npmjs.org/package/dv

      אבל הייתי ממליץ לך לחפש באינטרנט אולי יש מחלקה של tesseract לדוט נט בלי להריץ shell.

      פורסם במקור בפורום CODE613 ב28/07/2014 13:35 (+03:00)

      תגובה 1 תגובה אחרונה
      1

      בא תתחבר לדף היומי!
      • התחברות

      • אין לך חשבון עדיין? הרשמה

      • התחברו או הירשמו כדי לחפש.
      • פוסט ראשון
        פוסט אחרון
      0
      • דף הבית
      • קטגוריות
      • פוסטים אחרונים
      • משתמשים
      • חיפוש
      • חוקי הפורום