excel - Google Translate 通过 VBA 设置接受编码

标签 excel vba api request

我正在尝试通过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.ServerXMLHTTPMSXML2.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 立即窗口不打印西里尔文或中文字符,但您可以通过输出到单元格来查看此功能的工作原理:

enter image description here

2020 年 12 月更新

看起来这个方法可能到 11 月中旬就不再有效。

查看回复

  • div 类名已更改为更晦涩的内容
  • 有一些深奥的 c-wiz 元素正在做一些奇妙的事情......
  • 此外,我怀疑某些客户端脚本在检索文档后调用实际翻译

选项:Selenium、Microsoft Translate、Google 翻译 API 的免费和付费套餐;)

关于excel - Google Translate 通过 VBA 设置接受编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62048706/

相关文章:

excel - 更改 Excel 中 TODAY() 的格式

vba - LEN() 在 VBA 中返回错误值

php - Facebook Graph API PHP SDK 作为页面在页面上发布

javascript - 如何获得 Yelp Fusion API 访问 token ?

excel - 将多个 Excel 工作簿和工作表中的数据导入到单个工作簿/表中

laravel - 无法连接到GetCandy内的ElasticSearch

excel - 如何防止添加重复单元格

Excel - 从单列获取年份范围

vba - 以编程方式从 excel 文件中提取 excel vba 宏

excel - 如何从工具 --> 引用中自动检查 'Microsoft ActiveX Data Objects x.x Library'?