1 (изменено: DD, 2020-05-06 06:37:37)

Тема: AHK: Онлайн перевод текста с тегами

Воспроизвел в POST-запросе результат перевода страницы из браузера, но почему-то любое изменение отправляемого текста (даже с соблюдением формата URI), не возвращает его перевод, а без изменений — переводится только содержимое тегов TITLE. Как отправлять на перевод вписанный в Send произвольный текст?


WinHTTP := ComObjCreate("Msxml2.XMLHTTP.6.0")
url := "https://translate.googleapis.com/translate_a/t?anno=3&client=te_lib&format=html&v=1.0&sl=auto&tl=ru&sp=nmt&tc=1&sr=1&tk=811838.710888&mode=1"
WinHTTP.Open("POST", url, 0)
WinHTTP.SetRequestHeader("authority", "translate.googleapis.com")
WinHTTP.SetRequestHeader("user-agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36")
WinHTTP.SetRequestHeader("content-type", "application/x-www-form-urlencoded")
WinHTTP.SetRequestHeader("accept", "*/*")
WinHTTP.SetRequestHeader("origin", "null")
WinHTTP.SetRequestHeader("sec-fetch-site", "cross-site")
WinHTTP.SetRequestHeader("sec-fetch-mode", "cors")
WinHTTP.SetRequestHeader("accept-encoding", "gzip, deflate, br")
WinHTTP.SetRequestHeader("accept-language", "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7")

WinHTTP.Send("q=%3Ca%20i%3D0%3Epor%20Mikhail%20Khazin%20%E2%80%93%20%3C%2Fa%3E%3Ca%20i%3D1%3E25%20de%20agosto%20de%202012%2C%20%3C%2Fa%3E%3Ca%20i%3D2%3EOdnako.org%3C%2Fa%3E%3Ca%20i%3D3%3E%20%E2%80%93%20%3C%2Fa%3E%3Ca%20i%3D4%3EPublicado%20en%20el%20sitio%20web%20de%20Mikhail%20Khazin%20%3C%2Fa%3E%3Ca%20i%3D5%3Eworldcrisis.ru%3C%2Fa%3E%3Ca%20i%3D6%3E.%3C%2Fa%3E&q=La%20guerra%20de%20las%20%C3%A9lites.%20Sobre%20la%20creaci%C3%B3n%20de%20las%20alternativas%20al%20d%C3%B3lar%20%7C%20P%C3%A1gina%20transversal")
RTxt := WinHTTP.ResponseText

RTxt := JavaEscapedToHtml(RTxt)

   match := "", Pos := 1
   While Pos := RegExMatch(RTxt, "s)<b>(.*?)</b>",match,Pos+StrLen(match))
      Dest .= match1 " "

MsgBox % Dest

JavaEscapedToHtml(s) {
    i := 1
    while j := RegExMatch(s, "\\u[A-Fa-f0-9]{1,4}", m, i)
        e .= SubStr(s, i, j-i) Chr("0x" SubStr(m, 3)), i := j + StrLen(m)
    return e . SubStr(s, i)
}

2

Re: AHK: Онлайн перевод текста с тегами

Неправильный post запрос.
Смотрите алгоритм его построения у teadrinkerа.

3 (изменено: DD, 2020-05-07 00:11:19)

Re: AHK: Онлайн перевод текста с тегами

Что-то не идёт — вписываю отличия,


https://translate.googleapis.com/translate_a/t?anno=3&client=te_lib&format=html&v=1.0&sl=auto&tl=ru&sp=nmt&tc=1&sr=1&tk=811838.710888&mode=1

но возвращается пустой результат:

html = 
( 
q=<a i=0>por Mikhail Khazin – </a><a i=1>25 de agosto de 2012, </a><a i=2>Odnako.org</a><a i=3> – </a><a i=4>Publicado en el sitio web de Mikhail Khazin </a><a i=5>worldcrisis.ru</a><a i=6>.</a>

)
MsgBox % html := GoogleTranslate(html, "auto", "ru")
ExitApp

GoogleTranslate(str, from := "auto", to := "en")  {
   static JS := CreateScriptObj(), _ := JS.( GetJScript() ) := JS.("delete ActiveXObject; delete GetObject;")
   
   json := SendRequest(JS, str, to, from, proxy := "")
   oJSON := JS.("(" . json . ")")

   if !IsObject(oJSON[1])  {
      Loop % oJSON[0].length
         trans .= oJSON[0][A_Index - 1][0]
   }
   else  {
      MainTransText := oJSON[0][0][0]
      Loop % oJSON[1].length  {
         trans .= "`n+"
         obj := oJSON[1][A_Index-1][1]
         Loop % obj.length  {
            txt := obj[A_Index - 1]
            trans .= (MainTransText = txt ? "" : "`n" txt)
         }
      }
   }
   if !IsObject(oJSON[1])
      MainTransText := trans := Trim(trans, ",+`n ")
   else
      trans := MainTransText . "`n+`n" . Trim(trans, ",+`n ")

   from := oJSON[2]
   trans := Trim(trans, ",+`n ")
   Return trans
}

;https://translate.googleapis.com/translate_a/t?anno=3&client=te_lib&format=html&v=1.0&sl=auto&tl=ru&sp=nmt&tc=1&sr=1&tk=811838.710888&mode=1

SendRequest(JS, str, tl, sl, proxy) {
   ComObjError(false)
   http := ComObjCreate("WinHttp.WinHttpRequest.5.1")
   ( proxy && http.SetProxy(2, proxy) )
   http.open( "POST", "https://translate.google.com/translate_a/single?client=webapp&sl="
      . sl . "&tl=" . tl . "&hl=" . tl
      . "&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&otf=0&ssel=0&tsel=0&pc=1&kc=1"
      . "&tk=" . JS.("tk").(str), 1 )

   http.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
   http.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
   http.send("q=" . URIEncode(str))
   http.WaitForResponse(-1)
   Return http.responsetext
}

URIEncode(str, encoding := "UTF-8")  {
   VarSetCapacity(var, StrPut(str, encoding))
   StrPut(str, &var, encoding)

   While code := NumGet(Var, A_Index - 1, "UChar")  {
      bool := (code > 0x7F || code < 0x30 || code = 0x3D)
      UrlStr .= bool ? "%" . Format("{:02X}", code) : Chr(code)
   }
   Return UrlStr
}

GetJScript()
{
   script =
   (
      var TKK = ((function() {
        var a = 561666268;
        var b = 1526272306;
        return 406398 + '.' + (a + b);
      })());

      function b(a, b) {
        for (var d = 0; d < b.length - 2; d += 3) {
            var c = b.charAt(d + 2),
                c = "a" <= c ? c.charCodeAt(0) - 87 : Number(c),
                c = "+" == b.charAt(d + 1) ? a >>> c : a << c;
            a = "+" == b.charAt(d) ? a + c & 4294967295 : a ^ c
        }
        return a
      }

      function tk(a) {
          for (var e = TKK.split("."), h = Number(e[0]) || 0, g = [], d = 0, f = 0; f < a.length; f++) {
              var c = a.charCodeAt(f);
              128 > c ? g[d++] = c : (2048 > c ? g[d++] = c >> 6 | 192 : (55296 == (c & 64512) && f + 1 < a.length && 56320 == (a.charCodeAt(f + 1) & 64512) ?
              (c = 65536 + ((c & 1023) << 10) + (a.charCodeAt(++f) & 1023), g[d++] = c >> 18 | 240,
              g[d++] = c >> 12 & 63 | 128) : g[d++] = c >> 12 | 224, g[d++] = c >> 6 & 63 | 128), g[d++] = c & 63 | 128)
          }
          a = h;
          for (d = 0; d < g.length; d++) a += g[d], a = b(a, "+-a^+6");
          a = b(a, "+-3^+b+-f");
          a ^= Number(e[1]) || 0;
          0 > a && (a = (a & 2147483647) + 2147483648);
          a `%= 1E6;
          return a.toString() + "." + (a ^ h)
      }
   )
   Return script
}

CreateScriptObj() {
   static doc
   doc := ComObjCreate("htmlfile")
   doc.write("<meta http-equiv='X-UA-Compatible' content='IE=9'>")
   Return ObjBindMethod(doc.parentWindow, "eval")
}

4

Re: AHK: Онлайн перевод текста с тегами

У меня этот скрипт работает. Пустого результата не может быть. Смотрите, что именно возвращает сам запрос.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

5 (изменено: DD, 2020-05-07 01:17:03)

Re: AHK: Онлайн перевод текста с тегами

Работает в результате того, что вы правильно вписали данные из этой ссылки?

https://translate.googleapis.com/translate_a/t?anno=3&client=te_lib&format=html&v=1.0&sl=auto&tl=ru&sp=nmt&tc=1&sr=1&tk=811838.710888&mode=1

6

Re: AHK: Онлайн перевод текста с тегами

Нет, ничего не менял, запустил, как есть.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

7 (изменено: DD, 2020-05-07 20:59:05)

Re: AHK: Онлайн перевод текста с тегами

Текст конечно же переводится, но это не формат для веб-страниц, так как при этом затрагивается содержимое тегов (могут удаляться, меняться и тп). То есть, в Онлайн-переводчике вы используете вроде бы вариант гугловского переводчика для неформатированного текста (см. "client=webapp" в запросе), а в данном случае хотелось бы воспроизвести поведение для веб-страниц (см. "client=te_lib" в примере для запроса), при котором теги сохраняются нетронутыми.

8

Re: AHK: Онлайн перевод текста с тегами

Для перевода неформатированного варианта я пробовал подыскать символ, который бы при переводе не затрагивался (перед этим все теги заменялись на этот символ), но надёжного нет — после перевода некоторые условные символы удаляются. Поэтому хотелось бы задействовать формат переводчика для веб страниц.

9 (изменено: Malcev, 2020-05-08 16:18:29)

Re: AHK: Онлайн перевод текста с тегами

А с чего вы взяли, что за это отвечает параметр client=webapp?
Чтобы понимать, что для чего посылается, а не тыкать пальцем в небо нужно читать АПИ (хотя оно тут и немного другое).
https://cloud.google.com/translate/docs … /translate
https://cloud.google.com/translate/docs/how-to
Если же найти нужного не удастся, то искать решения на других языках (питон, джаваскрипт, си-шарп) - в гугле, stackoverflow, гитхабе, после чего переводить найденные алгоритмы на автохотки.

10 (изменено: serzh82saratov, 2020-05-08 18:54:06)

Re: AHK: Онлайн перевод текста с тегами

Как вариант, а может оно так и сделано судя по последовательной замене текста на странице, можно из html создать объект, и далее перебирать все элементы на наличие innerText, переводить, вставлять этим же методом, и забирать document.innerHTML.
Насчёт АПИ не знаю, нигде не встречал, только в браузерном расширении.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

11

Re: AHK: Онлайн перевод текста с тегами

Malcev пишет:

А с чего вы взяли, что за это отвечает параметр client=webapp?

Так ведь в запросе это прописано.

12

Re: AHK: Онлайн перевод текста с тегами

serzh82saratov пишет:

Насчёт АПИ не знаю, нигде не встречал, только в браузерном расширении.

Так я же ссылку скинул.
За формат отвечает:

format

string

The format of the source text, in either HTML (default) or plain-text. A value of html indicates HTML and a value of text indicates plain-text.

Что там непонятного?

13

Re: AHK: Онлайн перевод текста с тегами

Получается, недостаточно правильно прописать элементы из ссылки? —

https://translate.googleapis.com/translate_a/t?anno=3&client=te_lib&format=html&v=1.0&sl=auto&tl=ru&sp=nmt&tc=1&sr=1&tk=811838.710888&mode=1

14

Re: AHK: Онлайн перевод текста с тегами

Если вы вобъете в поисковик client=te_lib, то первая ссылка приведет вас к:
https://github.com/ssut/py-googletrans/issues/146
Откуда уже можно сделать выводы, что этот параметр означает и для чего используется.

DD пишет:

Получается, недостаточно правильно прописать элементы из ссылки? —

Я не копался в параметрах. Вы прекрасно сами можете их загуглить.
Но за параметр формата отвечает format.
Пробуйте отправить 2 запроса с разным format и сравните ответы.

+ DD

15

Re: AHK: Онлайн перевод текста с тегами

Значит, достаточно просто в скрипт teadrinkerа прописать &format=text) Спасибо!

16 (изменено: DD, 2020-05-08 20:54:51)

Re: AHK: Онлайн перевод текста с тегами

Всё-таки нет, иногда съедаются теги. Видимо, еще чего-то не хватает, помимо указания формата.

17

Re: AHK: Онлайн перевод текста с тегами

Вы же html отправляете, а пишите почему-то text.

18

Re: AHK: Онлайн перевод текста с тегами

Malcev пишет:

Так я же ссылку скинул.

Исходя из обсуждения выше, решил что всё сложнее, и не посмотрел.

DD пишет:

Всё-таки нет, иногда съедаются теги.

А пример есть, какие то определённые теги?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64 v2004, AutoHotkey_L v1.1.33.02 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

19 (изменено: DD, 2020-05-08 22:47:53)

Re: AHK: Онлайн перевод текста с тегами

Malcev пишет:

Вы же html отправляете, а пишите почему-то text.

Если вписать &format=html — теги вообще зачищаются.

20 (изменено: DD, 2020-05-08 23:15:13)

Re: AHK: Онлайн перевод текста с тегами

serzh82saratov пишет:

А пример есть, какие то определённые теги?

В коде ниже пример такого текста. Сразу перед переводом сами теги заменяются на тег <█>. Потому что во-первых текст отправляется более короткий, а во-вторых, в основном скрипте перед этим они привязываются к последовательным номерам, так что после перевода, первый тег <█> будет соответствовать первому тегу из оригинального текста, второй — второму и тд. Тут результат работы этого скрипта — https://yadi.sk/d/eaupSva91y79eQ — вставляет параллельный перевод к иностранному тексту.
https://i111.fastpic.ru/thumb/2020/0508/a7/_252f4a7b742180af3ae74ddb4c3dbea7.jpeg

html = 
( 
<p style="text-align:justify;">Es bien conocido que en Bengazi existen numerosos grupos particularmente reaccionarios y racistas. Basta con recordar el ataque de grupos de salafistas contra el consulado de Dinamarca, cuando se registró <a href="http://www.voltairenet.org/La-historia-oculta-de-las">el caso de las caricaturas de Mahoma</a>. En aquel momento, y en aplicación de la Convención de Ginebra, el gobierno libio de Muammar el-Khadafi se vio obligado a utilizar el ejército para garantizar la protección de aquella sede diplomática, lo cual dejó un importante número de víctimas. Posteriormente, los países occidentales que querían derrocar el régimen libio <a href="http://www.voltairenet.org/Matar-al-libio">financiaron publicaciones salafistas que acusaron al coronel Khadafi</a> de haber protegido el consulado de Dinamarca porque él mismo había ordenado la publicación de las caricaturas.</p>

)
html := RegExReplace(html, "is)</?[A-Z][A-Z0-9]*\b[^>]*>", "<█>")
MsgBox % html := GoogleTranslate(html, "auto", "ru")
ExitApp

GoogleTranslate(str, from := "auto", to := "en")  {
   static JS := CreateScriptObj(), _ := JS.( GetJScript() ) := JS.("delete ActiveXObject; delete GetObject;")
   
   json := SendRequest(JS, str, to, from, proxy := "")
   oJSON := JS.("(" . json . ")")

   if !IsObject(oJSON[1])  {
      Loop % oJSON[0].length
         trans .= oJSON[0][A_Index - 1][0]
   }
   else  {
      MainTransText := oJSON[0][0][0]
      Loop % oJSON[1].length  {
         trans .= "`n+"
         obj := oJSON[1][A_Index-1][1]
         Loop % obj.length  {
            txt := obj[A_Index - 1]
            trans .= (MainTransText = txt ? "" : "`n" txt)
         }
      }
   }
   if !IsObject(oJSON[1])
      MainTransText := trans := Trim(trans, ",+`n ")
   else
      trans := MainTransText . "`n+`n" . Trim(trans, ",+`n ")

   from := oJSON[2]
   trans := Trim(trans, ",+`n ")
   Return trans
}

;https://translate.googleapis.com/translate_a/t?anno=3&client=te_lib&format=html&v=1.0&sl=auto&tl=ru&sp=nmt&tc=1&sr=1&tk=811838.710888&mode=1

SendRequest(JS, str, tl, sl, proxy) {
   ComObjError(false)
   http := ComObjCreate("WinHttp.WinHttpRequest.5.1")
   ( proxy && http.SetProxy(2, proxy) )
   http.open( "POST", "https://translate.google.com/translate_a/single?client=webapp&format=text&sl="
      . sl . "&tl=" . tl . "&hl=" . tl
      . "&dt=at&dt=bd&dt=ex&dt=ld&dt=md&dt=qca&dt=rw&dt=rm&dt=ss&dt=t&ie=UTF-8&oe=UTF-8&otf=0&ssel=0&tsel=0&pc=1&kc=1"
      . "&tk=" . JS.("tk").(str), 1 )

   http.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
   http.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
   http.send("q=" . URIEncode(str))
   http.WaitForResponse(-1)
   Return http.responsetext
}

URIEncode(str, encoding := "UTF-8")  {
   VarSetCapacity(var, StrPut(str, encoding))
   StrPut(str, &var, encoding)

   While code := NumGet(Var, A_Index - 1, "UChar")  {
      bool := (code > 0x7F || code < 0x30 || code = 0x3D)
      UrlStr .= bool ? "%" . Format("{:02X}", code) : Chr(code)
   }
StringReplace, UrlStr, UrlStr, <, `%3C, All
StringReplace, UrlStr, UrlStr, >, `%3E, All
;msgbox % UrlStr
   Return UrlStr
}

GetJScript()
{
   script =
   (
      var TKK = ((function() {
        var a = 561666268;
        var b = 1526272306;
        return 406398 + '.' + (a + b);
      })());

      function b(a, b) {
        for (var d = 0; d < b.length - 2; d += 3) {
            var c = b.charAt(d + 2),
                c = "a" <= c ? c.charCodeAt(0) - 87 : Number(c),
                c = "+" == b.charAt(d + 1) ? a >>> c : a << c;
            a = "+" == b.charAt(d) ? a + c & 4294967295 : a ^ c
        }
        return a
      }

      function tk(a) {
          for (var e = TKK.split("."), h = Number(e[0]) || 0, g = [], d = 0, f = 0; f < a.length; f++) {
              var c = a.charCodeAt(f);
              128 > c ? g[d++] = c : (2048 > c ? g[d++] = c >> 6 | 192 : (55296 == (c & 64512) && f + 1 < a.length && 56320 == (a.charCodeAt(f + 1) & 64512) ?
              (c = 65536 + ((c & 1023) << 10) + (a.charCodeAt(++f) & 1023), g[d++] = c >> 18 | 240,
              g[d++] = c >> 12 & 63 | 128) : g[d++] = c >> 12 | 224, g[d++] = c >> 6 & 63 | 128), g[d++] = c & 63 | 128)
          }
          a = h;
          for (d = 0; d < g.length; d++) a += g[d], a = b(a, "+-a^+6");
          a = b(a, "+-3^+b+-f");
          a ^= Number(e[1]) || 0;
          0 > a && (a = (a & 2147483647) + 2147483648);
          a `%= 1E6;
          return a.toString() + "." + (a ^ h)
      }
   )
   Return script
}

CreateScriptObj() {
   static doc
   doc := ComObjCreate("htmlfile")
   doc.write("<meta http-equiv='X-UA-Compatible' content='IE=9'>")
   Return ObjBindMethod(doc.parentWindow, "eval")
}

21

Re: AHK: Онлайн перевод текста с тегами

DD пишет:

Если вписать &format=html — теги вообще зачищаются.

С чего вы это взяли?

22

Re: AHK: Онлайн перевод текста с тегами

Дык пробовал). Вписывал &format=html в код из 3-го поста после client=webapp — и перевод приходит без тегов.

23 (изменено: Malcev, 2020-05-08 23:21:09)

Re: AHK: Онлайн перевод текста с тегами

Лично у у меня он приходит с тегами.
Не знаю почему у вас теги теряются.
Вы вообще понимаете как алгоритм скрипта работает?
Вам надо смотреть, что отправляет в ответ сервер, а не распарсенный джсон.

24

Re: AHK: Онлайн перевод текста с тегами

А если как есть запускаете? У меня теги остаются, но между некоторыми пробелы вклиниваются.

25

Re: AHK: Онлайн перевод текста с тегами

Есть представление).

26

Re: AHK: Онлайн перевод текста с тегами

Malcev пишет:

Вам надо смотреть, что отправляет в ответ сервер, а не распарсенный джсон.

Там вроде то же самое, те же теги с пробелами.

27

Re: AHK: Онлайн перевод текста с тегами

У меня такого нету.
Посмотрел, что отправляет хром:

html=
(
<!DOCTYPE html>
<html>
<body>

<p><b>This text is bold</b></p>
<p><i>This text is italic</i></p>
<p>This is<sub> subscript</sub> and <sup>superscript</sup></p>

</body>
</html>
)


GoogleTranslate(html, "en", "ru")





GoogleTranslate(str, from := "auto", to := "en")  {
   static JS := CreateScriptObj(), _ := JS.( GetJScript() ) := JS.("delete ActiveXObject; delete GetObject;")
   
   msgbox % clipboard := json := SendRequest(JS, str, to, from, proxy := "")
   oJSON := JS.("(" . json . ")")

   if !IsObject(oJSON[1])  {
      Loop % oJSON[0].length
         trans .= oJSON[0][A_Index - 1][0]
   }
   else  {
      MainTransText := oJSON[0][0][0]
      Loop % oJSON[1].length  {
         trans .= "`n+"
         obj := oJSON[1][A_Index-1][1]
         Loop % obj.length  {
            txt := obj[A_Index - 1]
            trans .= (MainTransText = txt ? "" : "`n" txt)
         }
      }
   }
   if !IsObject(oJSON[1])
      MainTransText := trans := Trim(trans, ",+`n ")
   else
      trans := MainTransText . "`n+`n" . Trim(trans, ",+`n ")

   from := oJSON[2]
   trans := Trim(trans, ",+`n ")
   Return trans
}

SendRequest(JS, str, tl, sl, proxy) {
   static http
   ComObjError(false)
   if !http
   {
      http := ComObjCreate("WinHttp.WinHttpRequest.5.1")
      ( proxy && http.SetProxy(2, proxy) )
      http.open( "get", "https://translate.google.com", 1 )
      http.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
      http.send()
      http.WaitForResponse(-1)
   }
   http.open( "POST", "https://translate.googleapis.com/translate_a/t?anno=3&client=wt_lib&format=html&v=1.0&key&logld=vTE_20200210_00&sl=en&tl=ru&sp=nmt&tc=1&sr=1&mode=1&tk=" JS.("tk").(str), 1 )

   http.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
   http.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
   http.send("q=" . URIEncode(str))
   http.WaitForResponse(-1)
   Return http.responsetext
}

URIEncode(str, encoding := "UTF-8")  {
   VarSetCapacity(var, StrPut(str, encoding))
   StrPut(str, &var, encoding)

   While code := NumGet(Var, A_Index - 1, "UChar")  {
      bool := (code > 0x7F || code < 0x30 || code = 0x3D)
      UrlStr .= bool ? "%" . Format("{:02X}", code) : Chr(code)
   }
   Return UrlStr
}

GetJScript()
{
   script =
   (
      var TKK = ((function() {
        var a = 561666268;
        var b = 1526272306;
        return 406398 + '.' + (a + b);
      })());

      function b(a, b) {
        for (var d = 0; d < b.length - 2; d += 3) {
            var c = b.charAt(d + 2),
                c = "a" <= c ? c.charCodeAt(0) - 87 : Number(c),
                c = "+" == b.charAt(d + 1) ? a >>> c : a << c;
            a = "+" == b.charAt(d) ? a + c & 4294967295 : a ^ c
        }
        return a
      }

      function tk(a) {
          for (var e = TKK.split("."), h = Number(e[0]) || 0, g = [], d = 0, f = 0; f < a.length; f++) {
              var c = a.charCodeAt(f);
              128 > c ? g[d++] = c : (2048 > c ? g[d++] = c >> 6 | 192 : (55296 == (c & 64512) && f + 1 < a.length && 56320 == (a.charCodeAt(f + 1) & 64512) ?
              (c = 65536 + ((c & 1023) << 10) + (a.charCodeAt(++f) & 1023), g[d++] = c >> 18 | 240,
              g[d++] = c >> 12 & 63 | 128) : g[d++] = c >> 12 | 224, g[d++] = c >> 6 & 63 | 128), g[d++] = c & 63 | 128)
          }
          a = h;
          for (d = 0; d < g.length; d++) a += g[d], a = b(a, "+-a^+6");
          a = b(a, "+-3^+b+-f");
          a ^= Number(e[1]) || 0;
          0 > a && (a = (a & 2147483647) + 2147483648);
          a `%= 1E6;
          return a.toString() + "." + (a ^ h)
      }
   )
   Return script
}

CreateScriptObj() {
   static doc
   doc := ComObjCreate("htmlfile")
   doc.write("<meta http-equiv='X-UA-Compatible' content='IE=9'>")
   Return ObjBindMethod(doc.parentWindow, "eval")
}

Ну и для ликбеза.
https://vielhuber.de/ru/blog/google-perevod-api-vzlom/

+ DD

28 (изменено: DD, 2020-05-09 04:52:19)

Re: AHK: Онлайн перевод текста с тегами

Если смотреть со следующим примером текста на перевод — почему-то добавляются лишние теги, плюс перевод какой-то странный —

+ открыть спойлер

https://i.imgur.com/bWyYeNF.png


html=
(
<p style="text-align:justify;"> Es bien conocido que en Bengazi existen numerosos grupos particularmente reaccionarios y racistas. Basta con recordar el ataque de grupos de salafistas contra el consulado de Dinamarca, cuando se registró <a href="http://www.voltairenet.org/La-historia-oculta-de-las">el caso de las caricaturas de Mahoma</a>. En aquel momento, y en aplicación de la Convención de Ginebra, el gobierno libio de Muammar el-Khadafi se vio obligado a utilizar el ejército para garantizar la protección de aquella sede diplomática, lo cual dejó un importante número de víctimas. Posteriormente, los países occidentales que querían derrocar el régimen libio <a href="http://www.voltairenet.org/Matar-al-libio">financiaron publicaciones salafistas que acusaron al coronel Khadafi</a> de haber protegido el consulado de Dinamarca porque él mismo había ordenado la publicación de las caricaturas.</p>
)
;html := RegExReplace(html, "is)</?[A-Z][A-Z0-9]*\b[^>]*>", "<a>")

GoogleTranslate(html, "en", "ru")

GoogleTranslate(str, from := "auto", to := "en")  {
   static JS := CreateScriptObj(), _ := JS.( GetJScript() ) := JS.("delete ActiveXObject; delete GetObject;")
   
   RTxt := clipboard := json := SendRequest(JS, str, to, from, proxy := "")
   RTxt := JavaEscapedToHtml(RTxt)
   msgbox % RTxt

   oJSON := JS.("(" . json . ")")

   if !IsObject(oJSON[1])  {
      Loop % oJSON[0].length
         trans .= oJSON[0][A_Index - 1][0]
   }
   else  {
      MainTransText := oJSON[0][0][0]
      Loop % oJSON[1].length  {
         trans .= "`n+"
         obj := oJSON[1][A_Index-1][1]
         Loop % obj.length  {
            txt := obj[A_Index - 1]
            trans .= (MainTransText = txt ? "" : "`n" txt)
         }
      }
   }
   if !IsObject(oJSON[1])
      MainTransText := trans := Trim(trans, ",+`n ")
   else
      trans := MainTransText . "`n+`n" . Trim(trans, ",+`n ")

   from := oJSON[2]
   trans := Trim(trans, ",+`n ")
   Return trans
}

SendRequest(JS, str, tl, sl, proxy) {
   static http
   ComObjError(false)
   if !http
   {
      http := ComObjCreate("WinHttp.WinHttpRequest.5.1")
      ( proxy && http.SetProxy(2, proxy) )
      http.open( "get", "https://translate.google.com", 1 )
      http.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
      http.send()
      http.WaitForResponse(-1)
   }
   http.open( "POST", "https://translate.googleapis.com/translate_a/t?anno=3&client=wt_lib&format=html&v=1.0&key&logld=vTE_20200210_00&sl=en&tl=ru&sp=nmt&tc=1&sr=1&mode=1&tk=" JS.("tk").(str), 1 )

   http.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8")
   http.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
   http.send("q=" . URIEncode(str))
   http.WaitForResponse(-1)
   Return http.responsetext
}

URIEncode(str, encoding := "UTF-8")  {
   VarSetCapacity(var, StrPut(str, encoding))
   StrPut(str, &var, encoding)

   While code := NumGet(Var, A_Index - 1, "UChar")  {
      bool := (code > 0x7F || code < 0x30 || code = 0x3D)
      UrlStr .= bool ? "%" . Format("{:02X}", code) : Chr(code)
   }
   Return UrlStr
}

GetJScript()
{
   script =
   (
      var TKK = ((function() {
        var a = 561666268;
        var b = 1526272306;
        return 406398 + '.' + (a + b);
      })());

      function b(a, b) {
        for (var d = 0; d < b.length - 2; d += 3) {
            var c = b.charAt(d + 2),
                c = "a" <= c ? c.charCodeAt(0) - 87 : Number(c),
                c = "+" == b.charAt(d + 1) ? a >>> c : a << c;
            a = "+" == b.charAt(d) ? a + c & 4294967295 : a ^ c
        }
        return a
      }

      function tk(a) {
          for (var e = TKK.split("."), h = Number(e[0]) || 0, g = [], d = 0, f = 0; f < a.length; f++) {
              var c = a.charCodeAt(f);
              128 > c ? g[d++] = c : (2048 > c ? g[d++] = c >> 6 | 192 : (55296 == (c & 64512) && f + 1 < a.length && 56320 == (a.charCodeAt(f + 1) & 64512) ?
              (c = 65536 + ((c & 1023) << 10) + (a.charCodeAt(++f) & 1023), g[d++] = c >> 18 | 240,
              g[d++] = c >> 12 & 63 | 128) : g[d++] = c >> 12 | 224, g[d++] = c >> 6 & 63 | 128), g[d++] = c & 63 | 128)
          }
          a = h;
          for (d = 0; d < g.length; d++) a += g[d], a = b(a, "+-a^+6");
          a = b(a, "+-3^+b+-f");
          a ^= Number(e[1]) || 0;
          0 > a && (a = (a & 2147483647) + 2147483648);
          a `%= 1E6;
          return a.toString() + "." + (a ^ h)
      }
   )
   Return script
}

CreateScriptObj() {
   static doc
   doc := ComObjCreate("htmlfile")
   doc.write("<meta http-equiv='X-UA-Compatible' content='IE=9'>")
   Return ObjBindMethod(doc.parentWindow, "eval")
}


JavaEscapedToHtml(s) {
    i := 1
    while j := RegExMatch(s, "\\u[A-Fa-f0-9]{1,4}", m, i)
        e .= SubStr(s, i, j-i) Chr("0x" SubStr(m, 3)), i := j + StrLen(m)
    return e . SubStr(s, i)
}

29

Re: AHK: Онлайн перевод текста с тегами

Вот тут пишут, что перевод «te_lib» точнее, чем «webapp».

30 (изменено: Malcev, 2020-05-09 05:12:59)

Re: AHK: Онлайн перевод текста с тегами

Я привел пример постзапроса, который отправляется хромом при переводе сайта.
В нем уже прописаны языки.
И я бы ориентировался на чувака по последней ссылке (взломал он их капитально, аж до ключа добрался).

Проблема, однако, заключается в том, что вы сталкиваетесь с ограничением скорости намного раньше, чем через te_lib (для сравнения: с помощью webapp вы можете достичь этого уже после40 000 символов, а в te_lib ограничения скорости нет)

Ну а вообще надо тестировать. У меня хром вообще client=wt_lib отправляет.

31

Re: AHK: Онлайн перевод текста с тегами

В цитате имеется в виду ограничение по скорости или количеству символов?

32 (изменено: DD, 2020-05-09 13:48:28)

Re: AHK: Онлайн перевод текста с тегами

А в последнем вашем коде всё-таки теги не затрагиваются. Но в отличие от перевода в браузере, почему-то некоторые точки и символы заменяются на запятые или удаляются (для перевода следующего отрывка, в трёх местах язык перевода в коде надо заменить на "es" — испанский):

<p style="text-align:justify;">Esta vez, el 11 de septiembre de 2012, la nueva manipulación de la multitud en Bengazi tuvo como objetivo específico asesinar al embajador de Estados Unidos en Libia, lo cual constituye un acto de guerra sin precedente desde que la marina de guerra israelí cañoneó el <em>USS Liberty</em>, en 1967 [<a href="#nb1">1</a>]. Se trata, por demás, del primer asesinato, desde 1979, de un embajador de Estados Unidos en funciones. La gravedad del incidente se ve acentuada por el hecho que, en un país cuyo gobierno no pasa de ser una mera ficción política, el embajador estadounidense, lejos de ser un diplomático más, es en realidad una especie de gobernador, un jefe de Estado <em>de facto</em>.</p>

33 (изменено: DD, 2020-05-09 07:34:32)

Re: AHK: Онлайн перевод текста с тегами

DD пишет:

Но в отличие от перевода в браузере, почему-то некоторые точки и символы заменяются на запятые или удаляются

Это видимо связано с тем, что URIEncode не меняет квадратные скобки (гугл их кодирует), а точку меняет (гугл её не кодирует).

34

Re: AHK: Онлайн перевод текста с тегами

Приведите короткий пример и описание где, чего пропадает.

DD пишет:

В цитате имеется в виду ограничение по скорости или количеству символов?

Я так понимаю, что после перевода 40000 символов скорость уменьшается.

+ DD

35

Re: AHK: Онлайн перевод текста с тегами

Насчёт пропадает — ошибка вышла, всё норм).