找回密码
 加入
搜索
查看: 8971|回复: 31

[AU3基础] 【已解决】发帖求指导,关于base64编码和urlencode编码

[复制链接]
发表于 2020-4-2 15:03:38 | 显示全部楼层 |阅读模式
本帖最后由 niqindong 于 2020-4-4 19:12 编辑

今天想要尝试使用*度云服务中心提供的通用文字识别功能,该功能对于上传的数据要求如下:
问题如下:
1、首先au3自带的base64encode命令在我电脑上无法使用,无任何报错直接退出(软件自带、论坛下载、群文件三个都试过了);
2、我在百度上找到一个可以使用的base64位编码的库,目前可以完成base64编码了,但是我现在无法完成urlencode编码,请教一下大家该如何完成。

声明:
目前数据的上传和获取应该是正确了,问题应该就是出在编码上,因为从返回值可以看出,是数据格式不正确而不是没有数据。另外png、jpg、bmp三种格式我都尝试过了,都是同样的错误码。





本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2020-4-2 23:01:53 | 显示全部楼层
niqindong 发表于 2020-4-2 22:55
没啥好说的,刚才被限制发言了,不是笔误是我SB,路径是我发帖的时候改的,改的时候忘了加&了,43的行的 ...

就是原始代码+我增加的那一行就行,你可以直接用我上面的图片测试
发表于 2020-4-2 22:26:59 | 显示全部楼层
对了,我没有你要识别的照片,随便找了个jpg图片试了下,不过这识别率也不是很高啊

评分

参与人数 1金钱 +20 收起 理由
niqindong + 20

查看全部评分

 楼主| 发表于 2020-4-2 15:13:08 | 显示全部楼层
帖子发错版块的话,麻烦管理员移一下,谢谢!
 楼主| 发表于 2020-4-2 15:20:36 | 显示全部楼层
我想把我的代码放到帖子里,但是放不进去,我就以回复的形式发出来了。
#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
 楼主| 发表于 2020-4-2 15:21:18 | 显示全部楼层
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
发表于 2020-4-2 19:42:18 | 显示全部楼层
看看这个对你是否有帮助
https://www.autoitx.com/thread-35935-1-1.html

评分

参与人数 1金钱 +20 收起 理由
niqindong + 20 赞一个!

查看全部评分

 楼主| 发表于 2020-4-2 20:23:08 | 显示全部楼层
chishingchan 发表于 2020-4-2 19:42
看看这个对你是否有帮助
https://www.autoitx.com/thread-35935-1-1.html

我之前就看过您的帖子了,并且也测试了过了,编码是没有问题的,并且我使用的base64的库和您的应该是同一种方法,但是现在我弄不清的是那个【urlencode】是咋回事,是不是我理解错了?这两个本来就是一回事吗?
发表于 2020-4-2 21:39:46 | 显示全部楼层
代入前插入一行,即第12行
$basestring = StringReplace(StringReplace($basestring, '+', '%2b'), '/', '%2f')
 楼主| 发表于 2020-4-2 21:52:03 | 显示全部楼层
afan 发表于 2020-4-2 21:39
代入前插入一行,即第12行
$basestring = StringReplace(StringReplace($basestring, '+', '%2b'), '/', ' ...

谢谢A大,按您说的我把这行代码加进去了,把+和/替换了,但是返回的错误码还是那样,会不会是我post函数的问题呢
发表于 2020-4-2 21:53:54 | 显示全部楼层
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

 楼主| 发表于 2020-4-2 21:53:57 | 显示全部楼层
niqindong 发表于 2020-4-2 21:52
谢谢A大,按您说的我把这行代码加进去了,把+和/替换了,但是返回的错误码还是那样,会不会是我post函数 ...

不过我的post函数是能够正常获取token值的,只是不知道在上传图片的编码数据的时候有没有改动,我觉得没有动我的数据。
 楼主| 发表于 2020-4-2 22:01:57 | 显示全部楼层
sh1536 发表于 2020-4-2 21:53
那你就加个UrlEncode编码试试

[au3]Func _URLEncode($urlText)

谢谢大佬,我刚试过了,返回值还是那样,我真的开始既然我base64编码也有了,urlecode也有了,可是还是不行,我真的怀疑是我的post函数的问题。
 楼主| 发表于 2020-4-2 22:10:07 | 显示全部楼层
其实就用了三个函数,base64编码、urlecode编码还有个post函数,
1、base64函数不是官方自带的,因为自带的用不了,不知道为啥,都不报错的(#Include <ACN_HASH.au3>)我刚测试了一下,用我的笔记本和台式机都不行,都是win10
2、urlecode函数是刚给的,用没用之前都存在这样的问题
3、post函数也是我自己忘了从哪弄来的,虽然能获取token,但是不知道会不会有其他的问题。

我在想能不能手动编码进行请求,以此来一步一步判断问题出在哪。用了Chishingchan的编码工具,但是不知道该怎么把存下来的编码后的文档再通过post发出去,还是技术太差啊
发表于 2020-4-2 22:10:12 | 显示全部楼层
niqindong 发表于 2020-4-2 21:52
谢谢A大,按您说的我把这行代码加进去了,把+和/替换了,但是返回的错误码还是那样,会不会是我post函数 ...

$basestring = StringReplace(StringReplace(StringReplace($basestring, '=', '%3d'), '+', '%2b'), '/', '%2f')
 楼主| 发表于 2020-4-2 22:14:49 | 显示全部楼层
afan 发表于 2020-4-2 22:10
$basestring = StringReplace(StringReplace(StringReplace($basestring, '=', '%3d'), '+', '%2b'), '/' ...

试过了,A大,谢谢了!我不问了,我自己再去研究研究,有点伸手要饭的感觉,您忙去吧;不过如果有类似的帖子的可以推荐给我,我今天翻了翻论坛没找到,您待的时间长应该知道。我自己再研究研究,谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 2020-4-2 22:20:25 | 显示全部楼层
本帖最后由 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

您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-19 08:27 , Processed in 0.093403 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表