【已解决】发帖求指导,关于base64编码和urlencode编码
本帖最后由 niqindong 于 2020-4-4 19:12 编辑今天想要尝试使用*度云服务中心提供的通用文字识别功能,该功能对于上传的数据要求如下:
问题如下:
1、首先au3自带的base64encode命令在我电脑上无法使用,无任何报错直接退出(软件自带、论坛下载、群文件三个都试过了);
2、我在百度上找到一个可以使用的base64位编码的库,目前可以完成base64编码了,但是我现在无法完成urlencode编码,请教一下大家该如何完成。
声明:
目前数据的上传和获取应该是正确了,问题应该就是出在编码上,因为从返回值可以看出,是数据格式不正确而不是没有数据。另外png、jpg、bmp三种格式我都尝试过了,都是同样的错误码。
niqindong 发表于 2020-4-2 22:55
没啥好说的,刚才被限制发言了,不是笔误是我SB,路径是我发帖的时候改的,改的时候忘了加&了,43的行的 ...
就是原始代码+我增加的那一行就行,你可以直接用我上面的图片测试 对了,我没有你要识别的照片,随便找了个jpg图片试了下,不过这识别率也不是很高啊 帖子发错版块的话,麻烦管理员移一下,谢谢! 我想把我的代码放到帖子里,但是放不进去,我就以回复的形式发出来了。
#RequireAdmin
#include <String.au3>
#include <base64.au3>
#include<bug.au3>
$file = FileOpen(@ScriptDir"\nihao.bmp")
$filestring = FileRead($file)
$basestring = _Base64Encode($filestring)
MsgBox(0, 0, $basestring & @CRLF)
$return = _XmlHttp("https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=24.121752deff4d80a5854a872aa7d8e86a.2592000.1588397555.282335-10725585", "image=" & $basestring, "", "UTF-8", "")
MsgBox(0, 0, $return & @CRLF)
Func _XmlHttp($httpurl, $data = "", $type = "", $charset = "", $ContentType = "")
$oHTTP = ObjCreate("WinHttp.WinHttpRequest.5.1")
If $type = "" Or $type = "POST" Then
$stype = "POST"
Else
$stype = "GET"
EndIf
$oHTTP.Open($stype, $httpurl, True)
$oHTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/17.17134")
$oHTTP.SetRequestHeader("Accept-Language", "zh-CN,zh;q=0.8")
$oHTTP.SetRequestHeader("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
$oHTTP.SetRequestHeader("Connection", "Close")
If $ContentType = "json" Then
$ContentTypes = "application/json"
ElseIf $ContentType = "xml" Then
$ContentTypes = "text/xml"
ElseIf $ContentType = "formdata" Then
$ContentTypes = "multipart/form-data"
ElseIf $ContentType = "" Then
$ContentTypes = "application/x-www-form-urlencoded"
EndIf
If $charset = "" Or $charset = "UTF-8" Then
$charsets = "UTF-8"
Else
$charsets = "GBK"
EndIf
$oHTTP.SetRequestHeader("Content-Type:", $ContentTypes & '; charset=' & $charsets)
$oHTTP.SetRequestHeader("Cache-Control", "no-cache")
$oHTTP.Send($data)
$oHTTP.WaitForResponse()
$oReturnWebS = BinaryToString($oHTTP.ResponseBody, 4)
Return $oReturnWebS
EndFunc ;==>_XmlHttp
base64.au3如下:
; #FUNCTION# ;===============================================================================
;
; Name...........: _Base64Encode
; Description ...: Returns the given strinng encoded as a Base64 string.
; Syntax.........: _Base64Encode($sData)
; Parameters ....: $sData
; Return values .: Success - Base64 encoded string.
; Failure - Returns 0 and Sets @Error:
; |0 - No error.
; |1 - Could not create DOMDocument
; |2 - Could not create Element
; |3 - No string to return
; Author ........: Andrew
; Modified.......:
; Remarks .......:
; Related .......: _Base64Decode
; Link ..........;
; Example .......; Yes
;
; ;==========================================================================================
Func _Base64Encode($sData)
Local $oXml = ObjCreate("Msxml2.DOMDocument")
If Not IsObj($oXml) Then
SetError(1, 1, 0)
EndIf
Local $oElement = $oXml.createElement("b64")
If Not IsObj($oElement) Then
SetError(2, 2, 0)
EndIf
$oElement.dataType = "bin.base64"
$oElement.nodeTypedValue = Binary($sData)
Local $sReturn = $oElement.Text
If StringLen($sReturn) = 0 Then
SetError(3, 3, 0)
EndIf
Return $sReturn
EndFunc
; #FUNCTION# ;===============================================================================
;
; Name...........: _Base64Decode
; Description ...: Returns the strinng decoded from the provided Base64 string.
; Syntax.........: _Base64Decode($sData)
; Parameters ....: $sData
; Return values .: Success - String decoded from Base64.
; Failure - Returns 0 and Sets @Error:
; |0 - No error.
; |1 - Could not create DOMDocument
; |2 - Could not create Element
; |3 - No string to return
; Author ........: Andrew
; Modified.......:
; Remarks .......:
; Related .......: _Base64Encode
; Link ..........;
; Example .......; Yes
;
; ;==========================================================================================
Func _Base64Decode($sData)
Local $oXml = ObjCreate("Msxml2.DOMDocument")
If Not IsObj($oXml) Then
SetError(1, 1, 0)
EndIf
Local $oElement = $oXml.createElement("b64")
If Not IsObj($oElement) Then
SetError(2, 2, 0)
EndIf
$oElement.dataType = "bin.base64"
$oElement.Text = $sData
Local $sReturn = BinaryToString($oElement.nodeTypedValue, 4)
If StringLen($sReturn) = 0 Then
SetError(3, 3, 0)
EndIf
Return $sReturn
EndFunc 看看这个对你是否有帮助
https://www.autoitx.com/thread-35935-1-1.html chishingchan 发表于 2020-4-2 19:42
看看这个对你是否有帮助
https://www.autoitx.com/thread-35935-1-1.html
我之前就看过您的帖子了,并且也测试了过了,编码是没有问题的,并且我使用的base64的库和您的应该是同一种方法,但是现在我弄不清的是那个【urlencode】是咋回事,是不是我理解错了?这两个本来就是一回事吗?
代入前插入一行,即第12行
$basestring = StringReplace(StringReplace($basestring, '+', '%2b'), '/', '%2f') afan 发表于 2020-4-2 21:39
代入前插入一行,即第12行
$basestring = StringReplace(StringReplace($basestring, '+', '%2b'), '/', ' ...
谢谢A大,按您说的我把这行代码加进去了,把+和/替换了,但是返回的错误码还是那样,会不会是我post函数的问题呢 niqindong 发表于 2020-4-2 20:23
我之前就看过您的帖子了,并且也测试了过了,编码是没有问题的,并且我使用的base64的库和您的应该是同一 ...
那你就加个UrlEncode编码试试
$urlEnCode = _URLEncode($basestring)
$return = _XmlHttp("https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=24.121752deff4d80a5854a872aa7d8e86a.2592000.1588397555.282335-10725585", "image=" & $urlEnCode, "", "UTF-8", "")
Func _URLEncode($urlText)
Local $url = "", $acode
For $i = 1 To StringLen($urlText)
$acode = Asc(StringMid($urlText, $i, 1))
Select
Case ($acode >= 48 And $acode <= 57) Or _
($acode >= 65 And $acode <= 90) Or _
($acode >= 97 And $acode <= 122)
$url &= StringMid($urlText, $i, 1)
Case $acode = 32
$url &= "+"
Case Else
$url &= "%" & Hex($acode, 2)
EndSelect
Next
Return $url
EndFunc ;==>_URLEncode
niqindong 发表于 2020-4-2 21:52
谢谢A大,按您说的我把这行代码加进去了,把+和/替换了,但是返回的错误码还是那样,会不会是我post函数 ...
不过我的post函数是能够正常获取token值的,只是不知道在上传图片的编码数据的时候有没有改动,我觉得没有动我的数据。 sh1536 发表于 2020-4-2 21:53
那你就加个UrlEncode编码试试
Func _URLEncode($urlText)
谢谢大佬,我刚试过了,返回值还是那样,我真的开始既然我base64编码也有了,urlecode也有了,可是还是不行,我真的怀疑是我的post函数的问题。 其实就用了三个函数,base64编码、urlecode编码还有个post函数,
1、base64函数不是官方自带的,因为自带的用不了,不知道为啥,都不报错的(#Include <ACN_HASH.au3>)我刚测试了一下,用我的笔记本和台式机都不行,都是win10
2、urlecode函数是刚给的,用没用之前都存在这样的问题
3、post函数也是我自己忘了从哪弄来的,虽然能获取token,但是不知道会不会有其他的问题。
我在想能不能手动编码进行请求,以此来一步一步判断问题出在哪。用了Chishingchan的编码工具,但是不知道该怎么把存下来的编码后的文档再通过post发出去,还是技术太差啊 niqindong 发表于 2020-4-2 21:52
谢谢A大,按您说的我把这行代码加进去了,把+和/替换了,但是返回的错误码还是那样,会不会是我post函数 ...
$basestring = StringReplace(StringReplace(StringReplace($basestring, '=', '%3d'), '+', '%2b'), '/', '%2f') afan 发表于 2020-4-2 22:10
$basestring = StringReplace(StringReplace(StringReplace($basestring, '=', '%3d'), '+', '%2b'), '/' ...
试过了,A大,谢谢了!我不问了,我自己再去研究研究,有点伸手要饭的感觉,您忙去吧;不过如果有类似的帖子的可以推荐给我,我今天翻了翻论坛没找到,您待的时间长应该知道。我自己再研究研究,谢谢!
本帖最后由 sh1536 于 2020-4-2 22:22 编辑
niqindong 发表于 2020-4-2 22:14
试过了,A大,谢谢了!我不问了,我自己再去研究研究,有点伸手要饭的感觉,您忙去吧;不过如果有类似的 ...
应该是Post函数有点问题,找了下我的存货,试了下好像是可以的,给你参考下
$urlEnCode = URLEncode($basestring)
;~ MsgBox(0, 0, $urlEnCode & @CRLF)
;~ $return = _XmlHttp("https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=24.121752deff4d80a5854a872aa7d8e86a.2592000.1588397555.282335-10725585", "image=" & $urlEnCode, "", "UTF-8", "")
$return = _HTTP_Post("https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=24.121752deff4d80a5854a872aa7d8e86a.2592000.1588397555.282335-10725585", "image=" & $urlEnCode)
MsgBox(0, 0, $return & @CRLF)
Func _HTTP_Post($url, $postdata = '')
Local $oHTTP = ObjCreate("winhttp.winhttprequest.5.1")
$oHTTP.Open("POST", $url, False)
If @error Then Return SetError(1, 0, 0)
$oHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded")
$oHTTP.Send($postdata)
If @error Then Return SetError(2, 0, 0)
Local $sReceived = $oHTTP.ResponseText
Local $iStatus = $oHTTP.Status
If $iStatus = 200 Then Return $sReceived
Return SetError(3, $iStatus, $sReceived)
EndFunc ;==>_HTTP_Post