请求发布方法未返回有效响应

时间:2021-02-17 07:55:25

标签: python python-requests captcha

我正在尝试在一个具有简单验证码的网站上工作。这是link

步骤:

一个人应该输入一个案例编号,例如200078510,然后在验证码中输入数字,然后点击 Search 按钮。

进展:

我可以解决验证码的一部分,但是在尝试使用 POST 库中的 requests 方法时,我没有得到有效的响应。我得到了这个字符串 حدث خطأ ما ,这意味着 Something went wrong。一个成功的回复会在回复中包含案例编号,例如200078510

问题:

90% 的时间 myCaptcha 是正确的,所以我认为问题出在 POST 请求上。谁能看到我的 POST 请求有什么问题?

我在最后提供了一个有效的 VBA 示例,作为附加信息,以防万一。


这是我现在可以做的代码:

import requests
import cv2
import numpy as np
import pytesseract
from PIL import Image

sNumber = 'Number.png'
sTemp = 'Temp.png'
pytesseract.pytesseract.tesseract_cmd=r'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'

def getCaptcha():
    response = requests.get("https://eservices.moj.gov.kw/captcha/imgCaptcha.jsp")
    with open(sNumber, "wb") as f:
        f.write(response.content)
        f.close()
    img = cv2.imread(sNumber)
    lower = np.array([0, 0, 0])
    upper = np.array([46, 46, 255])
    thresh = cv2.inRange(img, lower, upper)
    thresh = 255 - thresh
    cv2.imwrite(sTemp, thresh)   
    img=Image.open(sTemp)
    text=pytesseract.image_to_string(img, lang='eng',config='--psm 10 --oem 3 -c tessedit_char_whitelist=0123456789')
    return text

myCaptcha = getCaptcha()
print(myCaptcha)

payload = {'txtCaseNo': '200078510', 'txtCaptcha2': myCaptcha, 'searchType': '0'}
r = requests.post("https://eservices.moj.gov.kw/viewResults/validateCase.jsp", data=payload)
print(r.url)
print(r.text)

我什至尝试使用这样的标题和同样的问题

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36',
          'Content-Type':'application/x-www-form-urlencoded'}

payload = {'txtCaseNo': '200078510', 'txtCaptcha2': myCaptcha, 'searchType': '0'}
r = requests.post("https://eservices.moj.gov.kw/viewResults/validateCase.jsp",headers = headers, data=payload)

只是我需要能够使用请求包的 POST 方法,以便能够发送合适的参数,然后导航到与搜索号码相关的多个部分。


补充信息(VBA 中的工作示例参考):

我在 VBA 中有一个用于整个过程的工作代码。该代码导航到一个 URL 并输入一个数字,然后在验证码上输入数字。代码如下:

Public vCaptcha

Sub Test()
    Dim wsIndex As Worksheet, wsData As Worksheet, http As New XMLHTTP60, html As New HTMLDocument, htmlData As New HTMLDocument, postCasePane As Object, oTables As Object, postTable As Object, postWrongSec As Object, strArg As String, xTemp As String, sTemp As String, r As Long, lr As Long, i As Long, ii As Long, vMAX As Long, cnt As Long
    Set wsIndex = ThisWorkbook.Worksheets("Index")
    Set wsData = ThisWorkbook.Worksheets("Data")
    wsData.Range("A1").CurrentRegion.Offset(1).ClearContents
    For r = 2 To wsIndex.Cells(Rows.Count, 1).End(xlUp).Row
        If r Mod 10 = 0 Then ThisWorkbook.Save
        lr = wsData.Cells(Rows.Count, 1).End(xlUp).Row + 1
        If wsIndex.Cells(r, 1).Value = "" Then GoTo Skipper
sPoint:
        Application.StatusBar = "Case Number: " & wsIndex.Cells(r, 1).Value & " ------- Row " & r
        DecryptCaptcha
        strArg = "txtCaseNo=" & wsIndex.Cells(r, 1).Value & "&txtCaptcha2=" & vCaptcha & "&searchType=0"
        With http
            .Open "POST", "https://eservices.moj.gov.kw/viewResults/validateCase.jsp", False
            .setRequestHeader "Content-type", "application/x-www-form-urlencoded"
            .send strArg
            html.body.innerHTML = .responseText
            Set postWrongSec = html.querySelector("span[lang='AR-KW']")
            If Not postWrongSec Is Nothing Then
                If postWrongSec.innerText = "ÚÝæÇ: ÑãÒ ÇáÍãÇíÉ ÛíÑ ÕÍíÍ !!!" Then
                    cnt = cnt + 1
                    Debug.Print "Wrong Captcha " & cnt: GoTo sPoint
                End If
            End If
            Set postCasePane = html.querySelector("#caseViewPane span h4")
            If postCasePane Is Nothing Then wsData.Range("A" & lr).Value = wsIndex.Cells(r, 1).Value: wsData.Range("C" & lr).Value = "ÑÞã ÇáÞÖíÉ ÛíÑ ÕÍíÍ": GoTo Skipper
            .Open "POST", "https://eservices.moj.gov.kw/viewResults/viewLastEvents.jsp", False
            .setRequestHeader "Content-type", "application/x-www-form-urlencoded"
            .send
            html.body.innerHTML = .responseText
        End With
            Set html = Nothing: Set htmlData = Nothing
Skipper:
        Application.Wait Now + TimeValue("00:00:05")
    Next r
    Application.StatusBar = Empty
    MsgBox "Done...", 64
End Sub

这是负责验证码的部分

Private Sub DecryptCaptcha()
    Dim res, sDestFolder As String, strFile As String, sURL As String
    sDestFolder = ThisWorkbook.Path & "\"
    strFile = "Number.png"
    sURL = "https://eservices.moj.gov.kw/captcha/imgCaptcha.jsp"
    With CreateObject("MSXML2.XMLHTTP")
        .Open "GET", sURL, False
        .send
        res = .responseBody
    End With
    With CreateObject("ADODB.Stream")
        .Type = 1
        .Open
        .write res
        .SaveToFile sDestFolder & strFile, 2
    End With
    vCaptcha = CleanNumber(ScriptFile(sDestFolder & strFile))
End Sub

Function ScriptFile(strImage As String) As String
    Dim wshShell As Object, sOutput As String, strCommand As String
    sOutput = ThisWorkbook.Path & "\OutputNumber.txt"
    strCommand = "Powershell.exe -File ""C:\Users\" & Environ("USERNAME") & "\Desktop\ConvertImage.ps1"" " & strImage
    Set wshShell = CreateObject("WScript.Shell")
    wshShell.Run strCommand, 0, True
    ScriptFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(sOutput).ReadAll
End Function

Function CleanNumber(ByVal strText As String) As String
    With CreateObject("VBScript.RegExp")
        .IgnoreCase = True
        .Global = True
        .Pattern = "[^0-9]"
        If .Test(strText) Then
            CleanNumber = WorksheetFunction.Trim(.Replace(strText, vbNullString))
        Else
            CleanNumber = strText
        End If
    End With
End Function

至于powershell文件,这些是内容

$image=$args[0]
$desktop= (Join-Path $env:USERPROFILE 'Desktop')
$imagefile=(Join-Path $desktop 'NumberNew.png')
$textfile=(Join-Path $desktop 'OutputNumber')

cd (Join-Path $desktop '\')
magick convert $image -resize 300x160 -density 300 -quality 100 $imagefile
magick convert $imagefile -negate -lat 300x160+40% -negate $imagefile
tesseract.exe $imagefile $textfile -l eng

当然,代码需要安装 tesseract 和 imagemagick 来处理和操作图像。该代码在 VBA 中工作,但我想使用 python 来提高我的技能。现在我被卡住了,没有更多的成功点。感谢您的帮助。

0 个答案:

没有答案