Google Translate через настройку VBA для accept-кодирования - PullRequest
1 голос
/ 27 мая 2020

Я пытаюсь использовать API Google Translate через VBA (пока работает в 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

Когда я изменил кодировку accept на «gzip, deflate» в python, произошел сбой, поэтому я решил, что это может быть проблемой. Любая помощь приветствуется

1 Ответ

2 голосов
/ 28 мая 2020

У меня был некоторый успех с Google Translate и Excel VBA с использованием объекта MSXML2.ServerXMLHTTP. Замечу, что вы используете MSXML2.XMLHTTP. Решение, похоже, работает хорошо только с установкой заголовка запроса User-Agent, поэтому я не углублялся в accept-encoding et c.

Различия между MSXML2.ServerXMLHTTP и MSXML2.XMLHTTP затронуты в этом вопрос , который может быть вам полезен.

Рабочий код с использованием 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 не печатает кириллицы c или китайские символы, но вы можете увидеть, как эта функция работает, выводя в ячейку:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...