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

Регистрация
07.08.2019
Сообщения
75
Благодарностей
78
Баллы
18
Добрый день, может кому-то будет полезно.
Выкладываю небольшой шаблон для перевода текста на другие языки. Работает через 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
 

Вложения

Для запуска проектов требуется программа ZennoPoster.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте программу ZennoPoster. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

Последнее редактирование:

AZANIR

Client
Регистрация
09.06.2014
Сообщения
405
Благодарностей
196
Баллы
43
ставь версию пониже не у всех последняя версия , ну какбы так , а лучше еще с 5,16 поддержку так как много кто сидит еще на ней.
 
  • Спасибо
Реакции: AlisaZ
Регистрация
07.08.2019
Сообщения
75
Благодарностей
78
Баллы
18
ставь версию пониже не у всех последняя версия , ну какбы так , а лучше еще с 5,16 поддержку так как много кто сидит еще на ней.
Ох, ок, не подумал. Сейчас поищу как сделать это.
Кто-то знает как сделать? В шифровании минимальная версия все еще высокая(

Нужно накатить старый зеннопостер отдельно?
 
Последнее редактирование:

AZANIR

Client
Регистрация
09.06.2014
Сообщения
405
Благодарностей
196
Баллы
43
Вишь сколько неизведанного , если ты и делаешь это в сниппете , то проще его и выкладывать в сниппете , но учитывать что поддержка ЯП в старых версиях 5я а в новых с 7,2+ идет уже 7я , поэтому и снипет нужнописать на 5й версии шарпа. Но это чисто мое видение , а там каждый себе прикрутит куда нужно.
вот пример
 
Последнее редактирование:
Регистрация
07.08.2019
Сообщения
75
Благодарностей
78
Баллы
18
Вишь сколько неизведанного , если ты и делаешь это в сниппете , то проще его и выкладывать в сниппете , но учитывать что поддержка ЯП в старых версиях 5я а в новых с 7,2+ идет уже 7я , поэтому и снипет нужнописать на 5й версии шарпа. Но это чисто мое видение , а там каждый себе прикрутит куда нужно.
Конечно много неизвестного)) Всему никогда не научишься)))
Я просто стараюсь всегда обновляться))

Но хочу заметить что я и сам код выложил отдельно)) Да и не сложный код должен заработать на старой версии тоже, 99.99%
 

AZANIR

Client
Регистрация
09.06.2014
Сообщения
405
Благодарностей
196
Баллы
43
Ну ты молодчина , все верно сделал.
 
  • Спасибо
Реакции: FantomaSkaRus1

ivan_777

Client
Регистрация
17.04.2020
Сообщения
7
Благодарностей
1
Баллы
3
А как он с переводом html тегов?
 
Регистрация
07.08.2019
Сообщения
75
Благодарностей
78
Баллы
18
  • Спасибо
Реакции: Zoron

orka13

Client
Регистрация
07.05.2015
Сообщения
2 159
Благодарностей
2 159
Баллы
113
Это скорее-всего человек подумал, что тут аналог моего платного шаблона c возможностью перевода HTML-файлов с сохранением верстки (без затрагивания технического кода). Нет, здесь просто ТС поделился чистой схемой перевода на C#-запросах.
Я вначале года проводил тесты, но пришлось отказаться от подобной схемы, поскольку прокси слишком часто в бан уходили на запросах. А вот на старом FireFox45 движке живучесть устраивала. Поэтому если политика дипла не сменилась, то схема с запросами подойдет оптимальнее если у вас в наличии хороший пул прокси, либо с ротацией частой. Учитывайте, что в отличии от гугл-переводчика здесь ipv6 прокси не подходят.
 
Регистрация
07.08.2019
Сообщения
75
Благодарностей
78
Баллы
18
Это скорее-всего человек подумал, что тут аналог моего платного шаблона c возможностью перевода HTML-файлов с сохранением верстки (без затрагивания технического кода). Нет, здесь просто ТС поделился чистой схемой перевода на C#-запросах.
Я вначале года проводил тесты, но пришлось отказаться от подобной схемы, поскольку прокси слишком часто в бан уходили на запросах. А вот на старом FireFox45 движке живучесть устраивала. Поэтому если политика дипла не сменилась, то схема с запросами подойдет оптимальнее если у вас в наличии хороший пул прокси, либо с ротацией частой. Учитывайте, что в отличии от гугл-переводчика здесь ipv6 прокси не подходят.
Да, думаю вы правы) Тут простая и чистая схема на C#

Я пока только FireFox пользуюсь в своей работе, он меня устраивает всем.
Пока тестировал - баны были, но в небольших количествах, и не сказалось на работе. Хотя наверное еще важен объем текста, который нужно перевести...
 
Регистрация
07.08.2019
Сообщения
75
Благодарностей
78
Баллы
18
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
 

Вложения

sagnio

Client
Регистрация
14.01.2016
Сообщения
10
Благодарностей
0
Баллы
1
Можно краткую инструкцию для новичков?
 
Регистрация
07.08.2019
Сообщения
75
Благодарностей
78
Баллы
18

pavko

Новичок
Регистрация
18.05.2015
Сообщения
2
Благодарностей
0
Баллы
1
У меня пишет:

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

Поломался? Или я где-то накосячил?
 
Регистрация
07.08.2019
Сообщения
75
Благодарностей
78
Баллы
18
У меня пишет:

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

Поломался? Или я где-то накосячил?
Привет. В логе только это? Пиши в телегу лучше, разберемся и объясню где что)
 

Atlas

Client
Регистрация
16.02.2014
Сообщения
131
Благодарностей
7
Баллы
18
А как переводить? Пишу текст в переменную text_dir, результата нет.
 
Регистрация
07.08.2019
Сообщения
75
Благодарностей
78
Баллы
18
  • Спасибо
Реакции: Atlas

artur23

Client
Регистрация
14.04.2014
Сообщения
205
Благодарностей
15
Баллы
18
Вопрос: прокси в каком формате прописывать? Не получилось перевести текст...
 
Регистрация
07.08.2019
Сообщения
75
Благодарностей
78
Баллы
18

artur23

Client
Регистрация
14.04.2014
Сообщения
205
Благодарностей
15
Баллы
18

artur23

Client
Регистрация
14.04.2014
Сообщения
205
Благодарностей
15
Баллы
18
логин:пароль@ip:port -у меня так на других сайтах работает норм. тут что-то не пошло...
 

artur23

Client
Регистрация
14.04.2014
Сообщения
205
Благодарностей
15
Баллы
18
и сразу еще 1 вопрос - как сделать запрос без прокси?
 

artur23

Client
Регистрация
14.04.2014
Сообщения
205
Благодарностей
15
Баллы
18
Выполнение действия CSharp OwnCode: translation. Ссылка на объект не указывает на экземпляр объекта.
 
Регистрация
07.08.2019
Сообщения
75
Благодарностей
78
Баллы
18
логин:пароль@ip:port -у меня так на других сайтах работает норм. тут что-то не пошло...
Привет. У меня таких проксей не было. Нужно тестировать. Не могу ответить так сходу)

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

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

zmike

Client
Регистрация
24.10.2019
Сообщения
120
Благодарностей
7
Баллы
18
Он продолжает показывать эту ошибку. Пробовал несколько прокси, первый раз заработало. На короткое предложение, но во второй раз он провалился, и продолжил тест, все провалилось.

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

Вы недавно проверяли этот сценарий?
Может ли он перевести всю статью?
 

Ttangasan

Новичок
Регистрация
09.08.2021
Сообщения
8
Благодарностей
0
Баллы
1
Огромное спасибо за помощь.
 

fireballpro100

Новичок
Регистрация
10.03.2022
Сообщения
3
Благодарностей
2
Баллы
3
Понимаю, что тема старая и ни кем не поддерживается, но всё-таки, хотелось бы узнать: данный способ не справляется с большими объёмами текста? Я погонял его, ну, если символов по 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
Регистрация
07.08.2019
Сообщения
75
Благодарностей
78
Баллы
18
Понимаю, что тема старая и ни кем не поддерживается, но всё-таки, хотелось бы узнать: данный способ не справляется с большими объёмами текста? Я погонял его, ну, если символов по 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

Castaneda

Client
Регистрация
24.05.2019
Сообщения
815
Благодарностей
275
Баллы
63
Вишь сколько неизведанного , если ты и делаешь это в сниппете , то проще его и выкладывать в сниппете , но учитывать что поддержка ЯП в старых версиях 5я а в новых с 7,2+ идет уже 7я , поэтому и снипет нужнописать на 5й версии шарпа. Но это чисто мое видение , а там каждый себе прикрутит куда нужно.
вот пример
дай тебе бог здоровья) такая огромная коллекция всего полезного!
 

fireballpro100

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

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

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

Перевод:
Часть 1: В комнате стояла тумбочка.
Часть 2: Он был черным.
К тому же, одно предложение может быть длиннее 100 символов, и если его не перенести целиком, то смысл станет другим.
 
  • Спасибо
Реакции: todayer

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