Solve it!

Dieses Thema im Forum "Support & Discussion" wurde erstellt von Death, 28. September 2017.

Schlagworte:
  1. Death

    Death New Member

    Registriert seit:
    2. Juli 2017
    Beiträge:
    4
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    Hey,

    falls sich jemand den "Finde den offenen Kreis"-Captchas stellen möchte habe ich eine kleines Gerüst erstellt, dass ein neues Captcha holt und eurem Code übergibt und ein Kreuz an einer von euch 'berechneten' X/Y Koordinate malt.

    solveIt!.png

    Euer code kann in Zeile 88 eingefügt werden (beim TODO).

    Das Captcha befindet sich in einem 2D-Array ($pictureOriginal) indem die einzelnen Farben stehen.

    Könnt den Code gerne erweitern, sollte nur mal eine Basis darstellen. Ich werde es die Tage einmal probieren und hier den Vortschritt posten. Wenn jemand Lust hat - nur zu :)

    Ich verfolge keine Absicht, sondern habe mich nur gefragt wie man dies automatisch lösen könnte.

    Grüße
    Death

    Einfach den Code in ein .au3 File kopieren und los gehts.
    Code (Text):
    #include <GDIPlus.au3>
    #include <Array.au3>
    #include <Constants.au3>
    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>

    ;path to get new captcha
    $url = "http://filecrypt.cc/captcha/circle.php"

    ;Path to captcha
    $captchaPath = "tmp/"
    DirCreate($captchaPath)
    ;Path where output will be stored
    $outputPath = "tmp/"
    DirCreate($outputPath)
    ;captcha name
    $captchaName = "orig.png"
    $whiteImagePath = $captchaPath & "white.jpg"
    $captchaWidth = 301
    $captchaHeight = 249

    $crossColor = "FFFF0000"

    #Region ### START Koda GUI section ### Form=D:\Desktop\captcha\Form1.kxf
    $hWnd = GUICreate("Captcha solver", 647, 600, 192, 124)


    GUICtrlCreateLabel("Input: ", 208, 16, 31, 17)
    GUICtrlCreateLabel("Result: ", 208, 300, 31, 17)

    $btn_getNewCaptcha = GUICtrlCreateButton("Get new one!", 48, 16, 75, 25)
    $btn_solve = GUICtrlCreateButton("Solve!", 48, 50, 75, 25)

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###


    _GDIPlus_Startup()

    ; Create white image

    Local  $whiteImage[$captchaWidth][$captchaHeight]
    clear($whiteImage, "FFFFFFFF")
    _FileArrayToImage($whiteImagePath, $whiteImage)

    $pic_input = GUICtrlCreatePic($whiteImagePath, 257, 11, $captchaWidth, $captchaHeight)
    $pic_result = GUICtrlCreatePic($whiteImagePath, 257, 300, $captchaWidth, $captchaHeight)

    $while = True

    ; UI-loop
    While $while
        $nMsg = GUIGetMsg()
        Switch $nMsg
            Case $GUI_EVENT_CLOSE
                $while = False
            Case $btn_solve
                solve($captchaPath & "orig.png")
                guiRefresh()
            Case $btn_getNewCaptcha
                removeOld()
                getNewCaptcha()
                guiRefresh()
                GUICtrlSetState($btn_solve, $GUI_ENABLE)
        EndSwitch
    WEnd

    _GDIPlus_Shutdown()



    Func solve($path)
        _log("Solving " & $path)
        Dim $solved[2]
        ; Get Captcha as Array[][]
        Dim $pictureOriginal
        _FileImageToArray($path, $pictureOriginal)
        Local $width = UBound($pictureOriginal, 1) - 1
        Local $height = UBound($pictureOriginal, 2) - 1

        Local $clickX = Int($width / 2)
        Local $clickY = Int($height / 2)


        ; TODO search for open circle and set $clickX and $clickY to it

        ; TODO end

        ;Add cross to correct coordinates
        _log("Adding cross @ " & $clickX & "/" & $clickY)
        Dim $addedCrossPicture = addCross($pictureOriginal, $clickX, $clickY)

        ; create result png
        _FileArrayToImage($captchaPath & "result.png", $addedCrossPicture)
        png2jpg("result")

    EndFunc   ;==>solve



    #Region ###  Not really interesting ###

    Func getNewCaptcha()
        _log("Requesting new captcha.")
        InetGet($url, $captchaPath & "orig.png")
        png2jpg("orig")
        _log("Got new one.")
    EndFunc   ;==>getNewCaptcha

    Func removeOld()
        FileDelete($captchaPath)
    EndFunc   ;==>removeOld

    Func cleanPictures()
        GUICtrlSetImage($pic_input, $whiteImagePath)
        GUICtrlSetImage($pic_result, $whiteImagePath)
    EndFunc   ;==>cleanPictures

    Func guiRefresh($ret = False)
        cleanPictures()
        GUICtrlSetImage($pic_input, $captchaPath & "orig.jpg")
        GUICtrlSetImage($pic_result, $captchaPath & "result.jpg")
    EndFunc   ;==>guiRefresh

    Func addCross($imageArray, $x, $y)
        Dim $final = $imageArray
        Local $width = UBound($imageArray, 1) - 1
        Local $height = UBound($imageArray, 2) - 1

        Dim $cross[39][2] = [[3, 3], [2, 2], [1, 1], [0, 0], [-1, -1], [-2, -2], [-3, -3], [-3, 3], [-2, 2], [-1, 1], [1, -1], [2, -2], [3, -3], _
                [4, 3], [3, 2], [2, 1], [1, 0], [-2, -1], [-3, -2], [-4, -3], [-4, 3], [-2, 2], [-2, 1], [2, -1], [3, -2], [4, -3], _
                [2, 3], [1, 2], [-1, 1], [-1, 0], [-2, -1], [-3, -2], [-4, -3], [-4, 3], [-3, 2], [-2, 1], [0, -1], [1, -2], [2, -3] _
                ]
        For $k = 0 To UBound($cross) - 1

            Local $w = $x + $cross[$k][0]
            Local $h = $y + $cross[$k][1]

            If (($w > $width) Or ($w < 0) Or ($h > $height) Or ($h < 0)) Then ContinueLoop

            $final[$w][$h] = $crossColor
        Next

        Return $final ;
    EndFunc   ;==>addCross

    Func png2jpg($name)
        Dim $a
        _FileImageToArray($captchaPath & $name & ".png", $a)
        _FileArrayToImage($captchaPath & $name & ".jpg", $a)
    EndFunc   ;==>png2jpg

    ; code by Malkey: thanks man!
    Func _FileImageToArray($filename, ByRef $aArray)
        Local $Reslt, $stride, $format, $Scan0, $iW, $iH, $hImage
        Local $v_Buffer, $width, $height
        Local $i, $j

        $hImage = _GDIPlus_ImageLoadFromFile($filename)
        $iW = _GDIPlus_ImageGetWidth($hImage)
        $iH = _GDIPlus_ImageGetHeight($hImage)
        $Reslt = _GDIPlus_BitmapLockBits($hImage, 0, 0, $iW, $iH, $GDIP_ILMREAD, $GDIP_PXF32ARGB)

        ;Get the returned values of _GDIPlus_BitmapLockBits ()
        $width = DllStructGetData($Reslt, "width")
        $height = DllStructGetData($Reslt, "height")
        $stride = DllStructGetData($Reslt, "stride")
        $format = DllStructGetData($Reslt, "format")
        $Scan0 = DllStructGetData($Reslt, "Scan0")

        Dim $aArray[$width][$height]
        For $i = 0 To $iW - 1
            For $j = 0 To $iH - 1
                $v_Buffer = DllStructCreate("dword", $Scan0 + ($j * $stride) + ($i * 4))
                $aArray[$i][$j] = Hex(DllStructGetData($v_Buffer, 1), 8)
            Next
        Next
        _GDIPlus_BitmapUnlockBits($hImage, $Reslt)
        _GDIPlus_ImageDispose($hImage)
        Return
    EndFunc   ;==>_FileImageToArray

    ; code by Malkey: thanks again ;)
    Func _FileArrayToImage($filename, $aArray)
        Local $iW = UBound($aArray, 1), $iH = UBound($aArray, 2), $sResult = ""
        Local $hBMP, $hImage1, $Reslt, $width, $height, $stride, $format, $Scan0
        Local $sResult, $v_BufferA
        Local $i, $j

        $hBMP = _WinAPI_CreateBitmap($iW, $iH, 1, 32)
        $hImage1 = _GDIPlus_BitmapCreateFromHBITMAP($hBMP)
        $Reslt = _GDIPlus_BitmapLockBits($hImage1, 0, 0, $iW, $iH, $GDIP_ILMWRITE, $GDIP_PXF32ARGB)

        ;Get the returned values of _GDIPlus_BitmapLockBits ()
        $width = DllStructGetData($Reslt, "width")
        $height = DllStructGetData($Reslt, "height")
        $stride = DllStructGetData($Reslt, "stride")
        $format = DllStructGetData($Reslt, "format")
        $Scan0 = DllStructGetData($Reslt, "Scan0")

        $v_BufferA = DllStructCreate("DWORD[" & $height * $width & "]", $Scan0)

        For $j = 0 To $height - 1
            For $i = 0 To $width - 1
                DllStructSetData($v_BufferA, 1, Execute("0x" & $aArray[$i][$j]), ($j * $width) + $i + 1) ; "+1" - base 1.
            Next
        Next

        _GDIPlus_BitmapUnlockBits($hImage1, $Reslt)
        _GDIPlus_ImageSaveToFile($hImage1, $filename)

        _GDIPlus_ImageDispose($hImage1)
        _WinAPI_DeleteObject($hBMP)
        Return
    EndFunc   ;==>_FileArrayToImage

    ;Setzt Array zurück auf $value
    ;Funktioniert mit 1,2 und 3D Arrays
    Func clear(ByRef $array, $value = 0)
        Local $dimension = UBound($array, 0)
        Local $size = UBound($array)
        Local $i, $j, $k
        If ($dimension == 1) Then
            For $i = 0 To $size - 1
                $array[$i] = $value
            Next
            Return
        EndIf
        If ($dimension == 2) Then
            For $i = 0 To UBound($array, 1) - 1
                For $j = 0 To UBound($array, 2) - 1
                    $array[$i][$j] = $value
                Next
            Next
            Return
        EndIf
        If ($dimension == 3) Then
            For $i = 0 To UBound($array, 1) - 1
                For $j = 0 To UBound($array, 2) - 1
                    For $k = 0 To UBound($array, 3) - 1
                        $array[$i][$j][$k] = $value
                    Next
                Next
            Next
            Return
        EndIf
    EndFunc   ;==>clear


    Func _log($message)
        ConsoleWrite(@HOUR & ":" & @MIN & ":" & @SEC & @TAB & $message & @CRLF)
    EndFunc   ;==>_log


    #EndRegion ###  Not really interesting ###
     
  2. susesKaninchen

    susesKaninchen New Member

    Registriert seit:
    3. Juli 2017
    Beiträge:
    21
    Zustimmungen:
    13
    Punkte für Erfolge:
    3
    Wir hatten mal einen Wettstrewit hier im Forum wo 20 Lösungen oder so dazu eingegangen sind ;)
     
  3. Death

    Death New Member

    Registriert seit:
    2. Juli 2017
    Beiträge:
    4
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    jo, da ging es um diese captchas http://www.relink.us/core/captcha/circlecaptcha.php?id=908dfd6007b5fa3e287c309ce87f2f . Zumindest meine Lösung geht nicht mehr, da früher der gesuchte Kreis dicker war als die anderen - das wurde nun wohl angepasst.
     
  4. susesKaninchen

    susesKaninchen New Member

    Registriert seit:
    3. Juli 2017
    Beiträge:
    21
    Zustimmungen:
    13
    Punkte für Erfolge:
    3
    Wenn du genau hin schaust ist der aktuelle auch dicker ;) nur halt in einer anderen farbe ;) deswegen selber ansatz, würde das ja lösen, habe aber leider keine Zeit.
    Aber der ofene Kreis ist immer dicker, wenn du also die Pixelstärke suchen lässt und dann noch ürüfst ob es ein Kreis ist solltest du ihn fidnen.

    edit: naja und du musst eine mindestgröße eingeben denn die C werden sonst mit erkannt. aber dann sollte es klappen.
     
    Death gefällt das.
  5. Death

    Death New Member

    Registriert seit:
    2. Juli 2017
    Beiträge:
    4
    Zustimmungen:
    0
    Punkte für Erfolge:
    1
    Jo, das ist mir auch aufgefallen. Manchmal sind auch die Striche so dick :/
    Aber ich hatte eigentlich extra geschaut und es kommt auch manchmal vor, das der gesuchte nicht dick ist.. Aber bekomme jetzt auch kein Captcha mehr wo das passiert..
     

Diese Seite empfehlen

Die Seite wird geladen...