Request post方法未返回有效响应

2024-06-26 00:07:24 发布

您现在位置:Python中文网/ 问答频道 /正文

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

步骤:

一个人应该键入一个案例编号,例如200078510,然后在验证码中键入编号,然后单击Search按钮

进度:

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

问题:

90%的时间myCaptcha是正确的,所以我认为问题在于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)

简单地说,我需要能够使用requests包的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来提高我的技能。现在我陷入困境,没有更多的成功点。谢谢你的帮助


Tags: 代码httpsstringifasservicewithrequests