Перевод текста через deepl.com на C# GET/POST

Регистрация
07.08.2019
Сообщения
91
Реакции
107
Баллы
43
Добрый день, может кому-то будет полезно.
Выкладываю небольшой шаблон для перевода текста на другие языки. Работает через 1 кубик C# через GET/POST.
На данный момент работает в одно-поток. Но всегда можно прикрутить финтифлюшки, если кому-то шаблон будет полезен и нужен.
Так-же буду рад услышать ваши предложения по обновлению, доработке и тд и тп.
Спасибо ^_^

Алярм! Актуальный код и шаблон в сообщении от 30.12.2022!

Код
C#:
Развернуть Свернуть Копировать
Random rand = new Random();

if (project.Variables["Source_language"].Value.Substring(0,2) == "US") project.Variables["Source_language"].Value = "en-US";
else if (project.Variables["Source_language"].Value.Substring(0,2) == "UK") project.Variables["Source_language"].Value = "en-GB";
else if (project.Variables["Source_language"].Value.Substring(0,2) == "PT") project.Variables["Source_language"].Value = "pt-PT";
else if (project.Variables["Source_language"].Value.Substring(0,2) == "BR") project.Variables["Source_language"].Value = "pt-BR";
else project.Variables["Source_language"].Value = project.Variables["Source_language"].Value.Substring(0,2);

if (project.Variables["Target_language"].Value.Substring(0,2) == "US") project.Variables["Target_language"].Value = "en-US";
else if (project.Variables["Target_language"].Value.Substring(0,2) == "UK") project.Variables["Target_language"].Value = "en-GB";
else if (project.Variables["Target_language"].Value.Substring(0,2) == "PT") project.Variables["Target_language"].Value = "pt-PT";
else if (project.Variables["Target_language"].Value.Substring(0,2) == "BR") project.Variables["Target_language"].Value = "pt-BR";
else project.Variables["Target_language"].Value = project.Variables["Target_language"].Value.Substring(0,2);

project.SendInfoToLog("Начали работу. Всего строк: " + project.Lists["Ваш текст"].Count.ToString() + ". Всего прокси: " + project.Lists["Прокси"].Count.ToString() + ".", true);

if (project.Lists["Прокси"].Count != 0)
{
    lock (SyncObjects.ListSyncer)
    {
        project.SendInfoToLog("Меняем прокси", true);
        project.Variables["Proxy"].Value = project.Lists["Прокси"][0].Trim();
        project.Lists["Прокси"].RemoveAt(0);
    }
}

for (int i = 0; i < project.Lists["Ваш текст"].Count; i++)
{
    int mark = 0;
    for (int j = 0; j < Convert.ToInt32(project.Variables["Counter_Global_Error"].Value); j++)
    {
        if (mark != 0) break;

        for (int k = 0; k < Convert.ToInt32(project.Variables["Counter_Error"].Value); k++)
        {
            if (mark != 0) break;
            var secret_id = ((long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds).ToString();
            var number = rand.Next(10000000, 99999999).ToString();
            var response = ZennoPoster.HttpPost("https://www2.deepl.com/jsonrpc", "{\"jsonrpc\":\"2.0\",\"method\": \"LMT_handle_jobs\",\"params\":{\"jobs\":[{\"kind\":\"default\",\"raw_en_sentence\":\"" + project.Lists["Ваш текст"][i] + "\",\"raw_en_context_before\":[],\"raw_en_context_after\":[],\"preferred_num_beams\":1}],\"lang\":{\"user_preferred_langs\":[\"" + project.Variables["Source_language"].Value + "\",\"" + project.Variables["Target_language"].Value + "\"],\"source_lang_computed\":\"" + project.Variables["Source_language"].Value + "\",\"target_lang\":\"" + project.Variables["Target_language"].Value + "\"},\"priority\":1,\"commonJobParams\":{},\"timestamp\":" + secret_id + "},\"id\":" + number + "}", "application/json;", project.Variables["Proxy_Kind"].Value + "://" + project.Variables["Proxy"].Value, "UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody, 5000, "", "", true, 5);
            if (!string.IsNullOrEmpty(response))
            {
                if (response.Contains(",\"message\":\"Too many requests.\"}}"))
                {
                    Thread.Sleep(rand.Next(Convert.ToInt32(project.Variables["Delay_LL"].Value), Convert.ToInt32(project.Variables["Delay_HH"].Value)));
                    break;
                }
                else
                {
                    string message = Macros.TextProcessing.Regex(response, "(?<=\"postprocessed_sentence\":\").*?(?=\")", "0")[0].FirstOrDefault();
                    project.Lists["Результат"].Add(System.Text.RegularExpressions.Regex.Unescape(message));
                    mark++;
                    project.SendInfoToLog("Успешно перевели строку #" + i, true);
                    Thread.Sleep(rand.Next(Convert.ToInt32(project.Variables["Delay_L"].Value), Convert.ToInt32(project.Variables["Delay_H"].Value)));
                    break;
                }
            }
        }

        if ((mark == 0) && (project.Lists["Прокси"].Count != 0))
        {
            lock (SyncObjects.ListSyncer)
            {
                project.SendInfoToLog("Меняем прокси", true);
                project.Variables["Proxy"].Value = project.Lists["Прокси"][0].Trim();
                project.Lists["Прокси"].RemoveAt(0);
            }
        }
        else if ((mark == 0) && (project.Lists["Прокси"].Count == 0))
        {
            project.SendErrorToLog("Кончились прокси", true);
            return null;
        }
    }

    if (mark == 0)
    {
        project.SendErrorToLog("Лимит по количеству неудач для проекта", true);
        return null;
    }
}

project.SendInfoToLog("Работа выполнена", true);

Добавил шаблон в формате .xmlz
 

Вложения

  • Deepl.zp
    Deepl.zp
    11,8 KB · Просмотры: 415
  • Deepl.xmlz
    Deepl.xmlz
    22,8 KB · Просмотры: 383
Последнее редактирование:
ставь версию пониже не у всех последняя версия , ну какбы так , а лучше еще с 5,16 поддержку так как много кто сидит еще на ней.
 
  • Спасибо
Реакции: AlisaZ
ставь версию пониже не у всех последняя версия , ну какбы так , а лучше еще с 5,16 поддержку так как много кто сидит еще на ней.

Ох, ок, не подумал. Сейчас поищу как сделать это.
Кто-то знает как сделать? В шифровании минимальная версия все еще высокая(

Нужно накатить старый зеннопостер отдельно?
 
Последнее редактирование:
Вишь сколько неизведанного , если ты и делаешь это в сниппете , то проще его и выкладывать в сниппете , но учитывать что поддержка ЯП в старых версиях 5я а в новых с 7,2+ идет уже 7я , поэтому и снипет нужнописать на 5й версии шарпа. Но это чисто мое видение , а там каждый себе прикрутит куда нужно.
вот пример
 
Последнее редактирование:
Вишь сколько неизведанного , если ты и делаешь это в сниппете , то проще его и выкладывать в сниппете , но учитывать что поддержка ЯП в старых версиях 5я а в новых с 7,2+ идет уже 7я , поэтому и снипет нужнописать на 5й версии шарпа. Но это чисто мое видение , а там каждый себе прикрутит куда нужно.

Конечно много неизвестного)) Всему никогда не научишься)))
Я просто стараюсь всегда обновляться))

Но хочу заметить что я и сам код выложил отдельно)) Да и не сложный код должен заработать на старой версии тоже, 99.99%
 
Ну ты молодчина , все верно сделал.
 
  • Спасибо
Реакции: FantomaSkaRus1
А как он с переводом html тегов?
 
  • Спасибо
Реакции: Zoron
Это скорее-всего человек подумал, что тут аналог моего платного шаблона c возможностью перевода HTML-файлов с сохранением верстки (без затрагивания технического кода). Нет, здесь просто ТС поделился чистой схемой перевода на C#-запросах.
Я вначале года проводил тесты, но пришлось отказаться от подобной схемы, поскольку прокси слишком часто в бан уходили на запросах. А вот на старом FireFox45 движке живучесть устраивала. Поэтому если политика дипла не сменилась, то схема с запросами подойдет оптимальнее если у вас в наличии хороший пул прокси, либо с ротацией частой. Учитывайте, что в отличии от гугл-переводчика здесь ipv6 прокси не подходят.
 
Это скорее-всего человек подумал, что тут аналог моего платного шаблона c возможностью перевода HTML-файлов с сохранением верстки (без затрагивания технического кода). Нет, здесь просто ТС поделился чистой схемой перевода на C#-запросах.
Я вначале года проводил тесты, но пришлось отказаться от подобной схемы, поскольку прокси слишком часто в бан уходили на запросах. А вот на старом FireFox45 движке живучесть устраивала. Поэтому если политика дипла не сменилась, то схема с запросами подойдет оптимальнее если у вас в наличии хороший пул прокси, либо с ротацией частой. Учитывайте, что в отличии от гугл-переводчика здесь ipv6 прокси не подходят.

Да, думаю вы правы) Тут простая и чистая схема на C#

Я пока только FireFox пользуюсь в своей работе, он меня устраивает всем.
Пока тестировал - баны были, но в небольших количествах, и не сказалось на работе. Хотя наверное еще важен объем текста, который нужно перевести...
 
C#:
Развернуть Свернуть Копировать
Random rand = new Random();

project.Variables["Source_language"].Value = project.Variables["Source_language"].Value.Substring(0,2);
project.Variables["Target_language"].Value = project.Variables["Target_language"].Value.Substring(0,2);

project.SendInfoToLog("Начали работу. Всего строк: " + project.Lists["Ваш текст"].Count.ToString() + ". Всего прокси: " + project.Lists["Прокси"].Count.ToString() + ".", true);

if (project.Lists["Прокси"].Count != 0)
{
    lock (SyncObjects.ListSyncer)
    {
        project.SendInfoToLog("Меняем прокси", true);
        project.Variables["Proxy"].Value = project.Lists["Прокси"][0].Trim();
        project.Lists["Прокси"].RemoveAt(0);
    }
}

for (int i = 0; i < project.Lists["Ваш текст"].Count; i++)
{
    int mark = 0;
    for (int j = 0; j < Convert.ToInt32(project.Variables["Counter_Global_Error"].Value); j++)
    {
        if (mark != 0) break;

        for (int k = 0; k < Convert.ToInt32(project.Variables["Counter_Error"].Value); k++)
        {
            if (mark != 0) break;
            var secret_id = ((long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds).ToString();
            var number = rand.Next(10000000, 99999999).ToString();
            var response = ZennoPoster.HttpPost("https://www2.deepl.com/jsonrpc", "{\"jsonrpc\":\"2.0\",\"method\": \"LMT_handle_jobs\",\"params\":{\"jobs\":[{\"kind\":\"default\",\"raw_en_sentence\":\"" + project.Lists["Ваш текст"][i] + "\",\"raw_en_context_before\":[],\"raw_en_context_after\":[],\"preferred_num_beams\":1}],\"lang\":{\"user_preferred_langs\":[\"" + project.Variables["Source_language"].Value + "\",\"" + project.Variables["Target_language"].Value + "\"],\"source_lang_computed\":\"" + project.Variables["Source_language"].Value + "\",\"target_lang\":\"" + project.Variables["Target_language"].Value + "\"},\"priority\":1,\"commonJobParams\":{},\"timestamp\":" + secret_id + "},\"id\":" + number + "}", "application/json;", project.Variables["Proxy_Kind"].Value + "://" + project.Variables["Proxy"].Value, "UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody, 5000, "", "", true, 5);
            if (!string.IsNullOrEmpty(response))
            {
                if (response.Contains(",\"message\":\"Too many requests.\"}}"))
                {
                    Thread.Sleep(rand.Next(Convert.ToInt32(project.Variables["Delay_LL"].Value), Convert.ToInt32(project.Variables["Delay_HH"].Value)));
                    break;
                }
                else
                {
                    string message = Macros.TextProcessing.Regex(response, "(?<=\"postprocessed_sentence\":\").*?(?=\")", "0")[0].FirstOrDefault();
                    project.Lists["Результат"].Add(System.Text.RegularExpressions.Regex.Unescape(message));
                    mark++;
                    project.SendInfoToLog("Успешно перевели строку #" + i, true);
                    Thread.Sleep(rand.Next(Convert.ToInt32(project.Variables["Delay_L"].Value), Convert.ToInt32(project.Variables["Delay_H"].Value)));
                    break;
                }
            }
        }

        if ((mark == 0) && (project.Lists["Прокси"].Count != 0))
        {
            lock (SyncObjects.ListSyncer)
            {
                project.SendInfoToLog("Меняем прокси", true);
                project.Variables["Proxy"].Value = project.Lists["Прокси"][0].Trim();
                project.Lists["Прокси"].RemoveAt(0);
            }
        }
        else if ((mark == 0) && (project.Lists["Прокси"].Count == 0))
        {
            project.SendErrorToLog("Кончились прокси", true);
            return null;
        }
    }

    if (mark == 0)
    {
        project.SendErrorToLog("Лимит по количеству неудач для проекта", true);
        return null;
    }
}

project.SendInfoToLog("Работа выполнена", true);

Обновил немного. Из-за языков не работала прога. Удалил US-UK разновидности, сделал только EN.
Ну и PT-BR тоже.

67906
 

Вложения

  • Deepl.xmlz
    Deepl.xmlz
    21,5 KB · Просмотры: 360
  • Deepl.zp
    Deepl.zp
    11,8 KB · Просмотры: 372
Можно краткую инструкцию для новичков?
 
У меня пишет:

Выполнение действия CSharp OwnCode: Translation. Ссылка на объект не указывает на экземпляр объекта.
Сбойное действие: Translation

Поломался? Или я где-то накосячил?
 
У меня пишет:

Выполнение действия CSharp OwnCode: Translation. Ссылка на объект не указывает на экземпляр объекта.
Сбойное действие: Translation

Поломался? Или я где-то накосячил?
Привет. В логе только это? Пиши в телегу лучше, разберемся и объясню где что)
 
А как переводить? Пишу текст в переменную text_dir, результата нет.
 
  • Спасибо
Реакции: Atlas
Вопрос: прокси в каком формате прописывать? Не получилось перевести текст...
 
логин:пароль@ip:port -у меня так на других сайтах работает норм. тут что-то не пошло...
 
и сразу еще 1 вопрос - как сделать запрос без прокси?
 
Выполнение действия CSharp OwnCode: translation. Ссылка на объект не указывает на экземпляр объекта.
 
логин:пароль@ip:port -у меня так на других сайтах работает норм. тут что-то не пошло...
Привет. У меня таких проксей не было. Нужно тестировать. Не могу ответить так сходу)

и сразу еще 1 вопрос - как сделать запрос без прокси?
В коде запросов нужно очистить поле где используется прокси. Пиши лучше в телегу, там и скриншоты можно приложить.

Выполнение действия CSharp OwnCode: translation. Ссылка на объект не указывает на экземпляр объекта.
Нужно капать глубже(. Эта ошибка много не говорит, увы(
 
Он продолжает показывать эту ошибку. Пробовал несколько прокси, первый раз заработало. На короткое предложение, но во второй раз он провалился, и продолжил тест, все провалилось.

Выполнение действия CSharp OwnCode: Translation.id: 1e41edf6-01db-4e28-b84e-5bebe18ac80c Ссылка на объект не соответствует экземпляру объекта.

Вы недавно проверяли этот сценарий?
Может ли он перевести всю статью?
 
Огромное спасибо за помощь.
 
Понимаю, что тема старая и ни кем не поддерживается, но всё-таки, хотелось бы узнать: данный способ не справляется с большими объёмами текста? Я погонял его, ну, если символов по 50-100 отправлять на текст, то вроде переводит, а больше - не хочет, постоянно меняет прокси, потому-что в ответе есть "Too many requests", причем, даже не незаспамленном ip.

Еще такой момент, там есть строка с regex обработкой:
C#:
Развернуть Свернуть Копировать
if (response.Contains(",\"message\":\"Too many requests.\"}}"))
В ответе из deepl точка не всегда есть после "Too many requests". И из-за того, что этот regex неправильно отрабатывает, там через очень неочевидные ходы это в итоге приводит к проблеме, что индекс выходит за пределы списка.

Поэтому, лучше, наверное, обрезать всё что до точки:
C#:
Развернуть Свернуть Копировать
if (response.Contains(",\"message\":\"Too many requests"))
 
  • Спасибо
Реакции: FantomaSkaRus1
Понимаю, что тема старая и ни кем не поддерживается, но всё-таки, хотелось бы узнать: данный способ не справляется с большими объёмами текста? Я погонял его, ну, если символов по 50-100 отправлять на текст, то вроде переводит, а больше - не хочет, постоянно меняет прокси, потому-что в ответе есть "Too many requests", причем, даже не незаспамленном ip.

Еще такой момент, там есть строка с regex обработкой:
C#:
Развернуть Свернуть Копировать
if (response.Contains(",\"message\":\"Too many requests.\"}}"))
В ответе из deepl точка не всегда есть после "Too many requests". И из-за того, что этот regex неправильно отрабатывает, там через очень неочевидные ходы это в итоге приводит к проблеме, что индекс выходит за пределы списка.

Поэтому, лучше, наверное, обрезать всё что до точки:
C#:
Развернуть Свернуть Копировать
if (response.Contains(",\"message\":\"Too many requests"))

Наверное стоит задаться вопросом почему сайт возвращает Too many requests при запросе где >100 символов.
И если эта проблема нерешаема то можно дробить текст на части

Но честно говоря, думаю что код работает не идеально (ибо я тогда был молод) и можно переписать на лучший лад, и это позволит писать больше 100 символов за раз, просто надо этим заняться, но лень...
А так, спасибо что отписались за ошибки)
 
  • Спасибо
Реакции: fireballpro100
Вишь сколько неизведанного , если ты и делаешь это в сниппете , то проще его и выкладывать в сниппете , но учитывать что поддержка ЯП в старых версиях 5я а в новых с 7,2+ идет уже 7я , поэтому и снипет нужнописать на 5й версии шарпа. Но это чисто мое видение , а там каждый себе прикрутит куда нужно.
вот пример
дай тебе бог здоровья) такая огромная коллекция всего полезного!
 
Но честно говоря, думаю что код работает не идеально (ибо я тогда был молод) и можно переписать на лучший лад, и это позволит писать больше 100 символов за раз, просто надо этим заняться, но лень...
Ваш скрипт единственный на post-запросах для Deepl'а из всех что я видел. Было полезно посмотреть как он работает. Спасибо!

И если эта проблема нерешаема то можно дробить текст на части

Можно, но качество перевода пострадает. Deepl умеет искать взаимосвязи между предложениями. Например, без взаимосвязи будет так (пример притянут за уши):

Оригинал: There was a nightstand in the room. It was black.

Перевод:
Часть 1: В комнате стояла тумбочка.
Часть 2: Он был черным.

К тому же, одно предложение может быть длиннее 100 символов, и если его не перенести целиком, то смысл станет другим.
 
  • Спасибо
Реакции: todayer

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)