DeathByCapture provides a .NET assembly for interaction with the mighty workforce overseas that lets you overcome those nasty captchas. Unfortunately you cannot use the assembly when you want to ‘[System.Reflection.Assembly]::LoadFile()’ as the ‘DeathByCaptcha.HttpClient’ is an abstract base class where you cannot pass the login credentials as arguments to the constructor.
Adding the assembly to the GAC is not possible without recompiling as it is missing a strong name. The easiest way when you don’t have Visual Studio is disassemble and reassemble the assembly with a strong name as described on OJ’s blog or elsewhere on the web.
You can then use the assembly as usual, after you added it to the GAC; for example like this:
$credDbc = Get-Credential; [Reflection.Assembly]::LoadFile("$PWD\DeathByCaptcha.dll"); $c = New-Object DeathByCaptcha.HttpClient -ArgumentList $credDbc.UserName, $credDbc.GetNetworkCredential().Password; $CaptchaPathAndFileName = "$PWD\SomeCaptchaFile.jpg"; $Captcha = $c.Decode($CaptchaPathAndFileName, 30); $Captcha Id : 12345678 Uploaded : True Text : abcd Solved : True Correct : True
Note: the HTTPClient uses (plain) ‘HTTP’ (as the name implies) and not a secure connection. The same holds true when using the SocketClient by the way.
POST /api/captcha HTTP/1.1 Accept: application/json User-Agent: DBC/.NET v4.1.2 Content-Type: multipart/form-data; boundary=7e1ffbf616984adaa2896b35de9baafb Host: api.dbcapi.me Content-Length: 2934 Connection: Close --7e1ffbf616984adaa2896b35de9baafb Content-Disposition: form-data; name="swid" Content-Length: 1 0 --7e1ffbf616984adaa2896b35de9baafb Content-Disposition: form-data; name="username" Content-Length: 27 someuser@example.com --7e1ffbf616984adaa2896b35de9baafb Content-Disposition: form-data; name="password" Content-Length: 16 P@ssL0rd --7e1ffbf616984adaa2896b35de9baafb Content-Disposition: form-data; name="captchafile"; filename="captcha.jpeg" Content-Type: application/octet-stream Content-Length: 2311 --7e1ffbf616984adaa2896b35de9baafb-- HTTP/1.1 303 See Other Server: nginx/1.2.3 Date: Sat, 11 May 2013 08:58:04 GMT Content-Type: text/html Content-Length: 71 Connection: close Location: http://api.dbcapi.me/api/captcha/12345678 Set-Cookie: BACKEND=B|ABCDE|ABCDE; path=/ {"status": 0, "captcha": 12345678, "is_correct": true, "text": "abcd"}
By the way: a quick way to save a capture to disk is via the clipboard:
if([System.Windows.Forms.Clipboard]::ContainsImage()) { $Image = = [System.Windows.Forms.Clipboard]::GetImage(); $Image Tag : PhysicalDimension : {Width=180, Height=103} Size : {Width=180, Height=103} Width : 180 Height : 103 HorizontalResolution : 96 VerticalResolution : 96 Flags : 335888 RawFormat : [ImageFormat: b96b3caa-0728-11d3-9d7b-0000f81ef32e] PixelFormat : Format32bppRgb Palette : System.Drawing.Imaging.ColorPalette FrameDimensionsList : {7462dc86-6180-4c7e-8e3f-ee7333a7a483} PropertyIdList : {} PropertyItems : {} $CaptchaPathandFileName = Join-Path -Path $PWD -ChildPath 'captcha.png'; $Image.Save($CaptchaPathandFileName, [System.Drawing.Imaging.ImageFormat]::Png); } # if