【问题标题】:Google Translate via VBA setting for accept-encoding谷歌翻译通过 VBA 设置接受编码
【发布时间】:2020-09-14 19:46:48
【问题描述】:

我正在尝试通过 VBA 使用谷歌翻译 API(目前在 python 中工作),我发现 python 请求和 VBA 之间的唯一区别在于标题“accept-encoding”,python一个使用“应用程序/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”时它崩溃了,所以我认为这可能是问题所在。 非常感谢任何帮助

【问题讨论】:

    标签: excel vba api request


    【解决方案1】:

    我使用MSXML2.ServerXMLHTTP 对象在Google Translate and Excel VBA 上取得了一些成功。我注意到您使用的是MSXML2.XMLHTTP。该解决方案似乎只设置了User-Agent 请求标头,所以我没有深入研究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 即时窗口不打印西里尔文或中文字符,但您可以通过输出到单元格来查看此功能:

    2020 年 12 月更新

    看起来这种方法在 11 月中旬之前将不再有效。

    查看响应

    • div 类名称已更改为更晦涩的名称
    • 有一些深奥的 c-wiz 元素正在做一些很棒的事情......
    • 另外,我怀疑某些客户端脚本在检索文档后要求进行实际翻译

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

    【讨论】:

    • 谢谢!我设法通过使用 MSXML2.ServerXMLHTTP 并在 Send 语句中传递有效负载(而不是将其添加到 URL)来使其工作。
    猜你喜欢
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 2016-08-09
    相关资源
    最近更新 更多