我正在尝试通过VBA使用谷歌翻译API(到目前为止在python中工作),我发现python请求和VBA请求之间的唯一区别在于标题“accept-encoding”,即python一种使用“application/gzip”并且可以工作,但是即使我通过代码更改它,VBA 也会自动更改为“gzip,deflate”。这是代码:
Function Test_GoogleTranslate()
Dim strTranslate As String
Dim objRequest As Object
Dim strUrl As String
Dim blnAsync As Boolean
Dim strResponse As String
Dim strWeather As String
Dim payload As String
Set objRequest = CreateObject("MSXML2.XMLHTTP")
payload = "target=es&q=something&source=en"
strTranslate = "https://google-translate1.p.rapidapi.com/language/translate/v2"
strTranslate = strTranslate & "?" & payload
With objRequest
.Open "POST", strTranslate, True
.setRequestHeader "host", "google-translate1.p.rapidapi.com"
.setRequestHeader "x-forwarded-port", "443"
.setRequestHeader "x-forwarded-proto", "https"
.setRequestHeader "connection", "keep-alive"
.setRequestHeader "content-type", "application/x-www-form-urlencoded"
.setRequestHeader "accept-encoding", "application/gzip"
.setRequestHeader "x-rapidapi-host", "google-translate1.p.rapidapi.com"
.setRequestHeader "x-rapidapi-key", "856e8ba78dmsh443766612c5a923p14f661jsn72323e803261"
.Send
While objRequest.readyState <> 4
DoEvents
Wend
strResponse = .ResponseText
End With
MsgBox (strResponse)
End Function
当我在 python 中将接受编码更改为“gzip, deflate”时,它崩溃了,所以我认为这可能是问题所在。 非常感谢任何帮助
最佳答案
我在 Google Translate and Excel VBA 方面取得了一些成功使用 MSXML2.ServerXMLHTTP
对象。我注意到您正在使用 MSXML2.XMLHTTP
。该解决方案似乎仅设置 User-Agent
请求 header 就可以很好地工作,因此我没有深入研究 accept-encoding
等。
MSXML2.ServerXMLHTTP
和 MSXML2.XMLHTTP
之间的差异在 question 中有所涉及。这可能对你有用。
使用MSXML2.ServerXMLHTTP
的工作代码:
Option Explicit
Sub Test()
Debug.Print Translate("Hello", "en", "fr", True) ' french
Debug.Print Translate("Hello", "en", "de", True) ' german
Debug.Print Translate("Hello", "en", "pt", True) ' portuguese
Debug.Print Translate("Hello", "en", "ru", False) ' russian - use romanised alphabet
Debug.Print Translate("Hello", "en", "ru", True) ' russian - use cyrillic
' ThisWorkbook.Sheets(1).Range("A1").Value = Translate("Hello", "en", "ru", True)
Debug.Print Translate("Hello", "en", "zh-CN", False) ' chinese simplified - use romanised alphabet
Debug.Print Translate("Hello", "en", "zh-CN", True) ' chinese simplified - use chinese script
' ThisWorkbook.Sheets(1).Range("B1").Value = Translate("Hello", "en", "zh-CN", True)
End Sub
Public Function Translate(strInput As String, strFromLanguageCode As String, strToLanguageCode As String, blnTargetAlphabet As Boolean) As String
Dim strURL As String
Dim objHTTP As Object
Dim objHTML As Object
Dim objDivs As Object, objDiv
Dim strTranslatedT0 As String
Dim strTranslatedO1 As String
' send query to web page
strURL = "https://translate.google.com/m?hl=" & strFromLanguageCode & _
"&sl=" & strFromLanguageCode & _
"&tl=" & strToLanguageCode & _
"&ie=UTF-8&prev=_m&q=" & strInput
Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
objHTTP.Open "GET", strURL, False
objHTTP.setRequestHeader "User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
objHTTP.send ""
' create a html document
Set objHTML = CreateObject("htmlfile")
With objHTML
.Open
.Write objHTTP.responseText
.Close
End With
' o1 has Anglicised translation, t0 as tranlsation in target language
Set objDivs = objHTML.getElementsByTagName("div")
For Each objDiv In objDivs
If objDiv.className = "o1" Then
strTranslatedO1 = objDiv.innerText
End If
If objDiv.className = "t0" Then
strTranslatedT0 = objDiv.innerText
End If
Next objDiv
' choose which to return
If blnTargetAlphabet Then
Translate = strTranslatedT0
Else
Translate = strTranslatedO1
End If
CleanUp:
Set objHTML = Nothing
Set objHTTP = Nothing
End Function
结果:
Bonjour
Hallo
Olá
Privet
??????
Ni hao
??
VBA 立即窗口不打印西里尔文或中文字符,但您可以通过输出到单元格来查看此功能的工作原理:
2020 年 12 月更新
看起来这个方法可能到 11 月中旬就不再有效。
查看回复
div
类名已更改为更晦涩的内容- 有一些深奥的
c-wiz
元素正在做一些奇妙的事情...... - 此外,我怀疑某些客户端脚本在检索文档后调用实际翻译
选项:Selenium、Microsoft Translate、Google 翻译 API 的免费和付费套餐;)
关于excel - Google Translate 通过 VBA 设置接受编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62048706/