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

Регистрация
07.08.2019
Сообщения
75
Благодарностей
78
Баллы
18
Ваш скрипт единственный на post-запросах для Deepl'а из всех что я видел. Было полезно посмотреть как он работает. Спасибо!



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



К тому же, одно предложение может быть длиннее 100 символов, и если его не перенести целиком, то смысл станет другим.
Ладно, я поковыряюсь, думаю что-нибудь получится скоро)
 
Регистрация
07.08.2019
Сообщения
75
Благодарностей
78
Баллы
18
Обновляйтесь! Все работает)

Что было? Поменяли очень сильно запросы! Но я починил)
Ну и куки еще добавили, тоже починил)
Все желающие говорить спасибо - не стесняйтесь!
Будут вопросы - задавайте) :bd:

101858
101859
101866
101867
101867
101868
101860

C#:
Random rand = new Random();

var input_list = project.Lists["Ваш текст"];
var output_list = project.Lists["Результат"];
var proxy_list = project.Lists["Прокси"];

string proxy = project.Variables["Proxy"].Value;
string proxy_kind = project.Variables["Proxy_Kind"].Value;
string source_language = project.Variables["Source_language"].Value;
string target_language = project.Variables["Target_language"].Value;
string regional_language = string.Empty;

int l_delay = Convert.ToInt32(project.Variables["Delay_L"].Value);
int h_delay = Convert.ToInt32(project.Variables["Delay_H"].Value);

int global_error_counter = Convert.ToInt32(project.Variables["Global_Error_Counter"].Value);
int error_counter = Convert.ToInt32(project.Variables["Error_Counter"].Value);
int num_beams = 1;

source_language = source_language.Substring(0,2);
target_language = target_language.Substring(0,2);

if (target_language.Substring(0,2) == "EN")
{
    regional_language = "en-GB";
}
else if (target_language.Substring(0,2) == "PT")
{
    regional_language = "pt-PT";
}
else if (target_language.Substring(0,2) == "US")
{
    regional_language = "en-US";
    target_language = "EN";
}
else if (target_language.Substring(0,2) == "BR")
{
    regional_language = "pt-BR";
    target_language = "PT";
}

project.SendInfoToLog($"Начали работу. Всего строк: {input_list.Count()}. Всего прокси: {proxy_list.Count()}.", true);

for (int i = 0; i < input_list.Count; i++)
{
    if (string.IsNullOrWhiteSpace(input_list[i].Trim()))
    {
        project.SendInfoToLog($"Строка {i} пустая, пропускаем!", true);
        output_list.Add("\r\n");

        continue;
    }

    var sentence_parts = input_list[i].Split(new string[] { ".", "?", "!" }, StringSplitOptions.None);
    project.SendInfoToLog($"В строкe {i} имеем {sentence_parts.Count()} предложений!", true);

    bool success = false;
    for (int j = 0; j < global_error_counter; j++)
    {
        if (success) break;

        for (int k = 0; k < error_counter; k++)
        {
            if (success) break;

            var secret_id = ((long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds).ToString();
            var number = rand.Next(10000000, 99999999).ToString();

            string tail = string.Empty;
            string head = $"{{\"jsonrpc\":\"2.0\",\"method\": \"LMT_handle_jobs\",\"params\":{{\"jobs\":[";

            if (string.IsNullOrWhiteSpace(regional_language))
            {
                tail = $"],\"lang\":{{\"preference\":{{\"weight\":{{}},\"default\":\"default\"}},\"source_lang_user_selected\":\"{source_language}\",\"target_lang\":\"{target_language}\"}},\"priority\":1,\"commonJobParams\":{{\"mode\":\"translate\",\"browserType\":1}},\"timestamp\":{secret_id}}},\"id\":{number}}}";
            }
            else
            {
                tail = $"],\"lang\":{{\"preference\":{{\"weight\":{{}},\"default\":\"default\"}},\"source_lang_user_selected\":\"{source_language}\",\"target_lang\":\"{target_language}\"}},\"priority\":1,\"commonJobParams\":{{\"regionalVariant\":\"{regional_language}\",\"mode\":\"translate\",\"browserType\":1,\"formality\":null}},\"timestamp\":{secret_id}}},\"id\":{number}}}";
            }
           
            string fullBody = string.Empty;
            string rowsBefore = string.Empty;
            for (int m = 0; m < sentence_parts.Count(); m++)
            {
                string sentence = sentence_parts[m].Trim();

                if (string.IsNullOrWhiteSpace(sentence)) continue;
                sentence += ".";

                if (m == 0)
                {
                    if (sentence_parts.Count() > 1)
                    {
                        string next_sentence = sentence_parts[m+1].Trim();

                        if (!string.IsNullOrWhiteSpace(next_sentence))
                        {
                            next_sentence += ".";
                            fullBody += $"{{\"kind\":\"default\",\"sentences\":[{{\"text\":\"{sentence}\",\"id\":{m},\"prefix\":\"\"}}],\"raw_en_context_before\":[],\"raw_en_context_after\":[\"{next_sentence}\"],\"preferred_num_beams\":{num_beams}}}";
                        }
                        else
                        {
                            fullBody += $"{{\"kind\":\"default\",\"sentences\":[{{\"text\":\"{sentence}\",\"id\":{m},\"prefix\":\"\"}}],\"raw_en_context_before\":[],\"raw_en_context_after\":[],\"preferred_num_beams\":{num_beams}}}";
                        }
                    }
                    else
                    {   
                        fullBody += $"{{\"kind\":\"default\",\"sentences\":[{{\"text\":\"{sentence}\",\"id\":{m},\"prefix\":\"\"}}],\"raw_en_context_before\":[],\"raw_en_context_after\":[],\"preferred_num_beams\":{num_beams}}}";
                    }
                }
                else if (m == sentence_parts.Count()-1)
                {
                    fullBody += $",{{\"kind\":\"default\",\"sentences\":[{{\"text\":\"{sentence}\",\"id\":{m},\"prefix\":\"\"}}],\"raw_en_context_before\":[{rowsBefore}],\"raw_en_context_after\":[],\"preferred_num_beams\":{num_beams}}}";
                }
                else
                {
                    string next_sentence = sentence_parts[m+1].Trim();

                    if (!string.IsNullOrWhiteSpace(next_sentence))
                    {
                        next_sentence += ".";
                        fullBody += $",{{\"kind\":\"default\",\"sentences\":[{{\"text\":\"{sentence}\",\"id\":{m},\"prefix\":\"\"}}],\"raw_en_context_before\":[{rowsBefore}],\"raw_en_context_after\":[\"{next_sentence}\"],\"preferred_num_beams\":{num_beams}}}";   
                    }
                    else
                    {
                        fullBody += $",{{\"kind\":\"default\",\"sentences\":[{{\"text\":\"{sentence}\",\"id\":{m},\"prefix\":\"\"}}],\"raw_en_context_before\":[{rowsBefore}],\"raw_en_context_after\":[],\"preferred_num_beams\":{num_beams}}}";
                    }
                }

                if (string.IsNullOrWhiteSpace(rowsBefore)) rowsBefore += $"\"{sentence}\"";
                else rowsBefore += $",\"{sentence}\"";
            }

            if (string.IsNullOrWhiteSpace(proxy))
            for (int p = proxy_list.Count-1; p >= 0; p--)
            {
                lock (SyncObjects.ListSyncer)
                {
                    project.SendInfoToLog("Меняем прокси", true);
                    proxy = proxy_list[p].Trim();
                    proxy_list.RemoveAt(p);

                    if (string.IsNullOrWhiteSpace(proxy)) continue;
                }

                string firstResponse = ZennoPoster.HTTP.Request(
                    InterfacesLibrary.Enums.Http.HttpMethod.GET,
                    "https://www.deepl.com/translator",
                    string.Empty,
                    string.Empty,
                    $"{proxy_kind}://{proxy}",
                    "UTF-8",
                    ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody,
                    5000,
                    string.Empty,
                    project.Profile.UserAgent,
                    true,
                    5,
                    new[] {string.Empty},
                    string.Empty,
                    true,
                    true,
                    project.Profile.CookieContainer
                );

                if (!string.IsNullOrWhiteSpace(firstResponse))
                {
                    string cookie = Encoding.UTF8.GetString(project.Profile.CookieContainer.Export());
                    cookie = cookie.Replace(".deepl.com", "www2.deepl.com");
                    byte[] cookieBytes = System.Text.Encoding.UTF8.GetBytes(cookie);
                    project.Profile.CookieContainer.Import(cookieBytes);

                    break;
                }
            }

            if (string.IsNullOrWhiteSpace(proxy))
            {
                project.SendErrorToLog("Закончились прокси! Несите новые!", true);

                return "0";
            }

            string mainResponse = ZennoPoster.HTTP.Request(
                InterfacesLibrary.Enums.Http.HttpMethod.POST,
                "https://www2.deepl.com/jsonrpc?method=LMT_handle_jobs",
                $"{head}{fullBody}{tail}",
                "application/json",
                $"{proxy_kind}://{proxy}",
                "UTF-8",
                ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody,
                5000,
                string.Empty,
                project.Profile.UserAgent,
                true,
                5,
                new[] {string.Empty},
                string.Empty,
                true,
                true,
                project.Profile.CookieContainer
            );

            if (!string.IsNullOrWhiteSpace(mainResponse) && !mainResponse.Contains("Too many requests"))
            {
                var regex = new Regex("(?<=\"text\":\")[\\w\\W]*?(?=\")");
                var resultList = regex.Matches(mainResponse).Cast<Match>().ToList();

                string resultRow = string.Empty;
                for (int m = 0; m < resultList.Count; m++) resultRow += resultList[m].Value;
                resultRow = System.Text.RegularExpressions.Regex.Unescape(resultRow);

                success = true;
                output_list.Add(resultRow);
                project.SendInfoToLog($"Успешно перевели строку #{i}", true);
                Thread.Sleep(rand.Next(l_delay, h_delay));

                break;
            }
            else if (!string.IsNullOrWhiteSpace(mainResponse) && mainResponse.Contains("Invalid Request") && mainResponse.Contains("Invalid commonJobParams"))
            {
                project.SendErrorToLog("Алярм! Все сломалось!");

                return "0";
            }
            else
            {
                proxy = string.Empty;
            }
        }
    }

    if (!success)
    {
        project.SendErrorToLog("Лимит по количеству неудач для проекта! Помянем!", true);

        return "0";
    }
}

project.SendInfoToLog("Работа выполнена! Ничегосебе! Ура!", true);

return "1";
Баг с лишними точками исправил.
Исправил еще ряд багов

Вроде все языки работают хорошо
Тестил в разные стороны
 

Вложения

  • 12,5 КБ Просмотры: 132
Последнее редактирование:
Регистрация
25.12.2021
Сообщения
23
Благодарностей
16
Баллы
3
Обновляйтесь! Все работает)

Что было? Поменяли очень сильно запросы! Но я починил)
Ну и куки еще добавили, тоже починил)
Все желающие говорить спасибо - не стесняйтесь!
Будут вопросы - задавайте) :bd:


C#:
Random rand = new Random();

var input_list = project.Lists["Ваш текст"];
var output_list = project.Lists["Результат"];
var proxy_list = project.Lists["Прокси"];

string proxy = project.Variables["Proxy"].Value;
string proxy_kind = project.Variables["Proxy_Kind"].Value;
string source_language = project.Variables["Source_language"].Value;
string target_language = project.Variables["Target_language"].Value;
string regional_language = string.Empty;

int l_delay = Convert.ToInt32(project.Variables["Delay_L"].Value);
int h_delay = Convert.ToInt32(project.Variables["Delay_H"].Value);

int global_error_counter = Convert.ToInt32(project.Variables["Global_Error_Counter"].Value);
int error_counter = Convert.ToInt32(project.Variables["Error_Counter"].Value);
int num_beams = 1;

source_language = source_language.Substring(0,2);
target_language = target_language.Substring(0,2);

if (target_language.Substring(0,2) == "EN")
{
    regional_language = "en-GB";
}
else if (target_language.Substring(0,2) == "PT")
{
    regional_language = "pt-PT";
}
else if (target_language.Substring(0,2) == "US")
{
    regional_language = "en-US";
    target_language = "EN";
}
else if (target_language.Substring(0,2) == "BR")
{
    regional_language = "pt-BR";
    target_language = "PT";
}

project.SendInfoToLog($"Начали работу. Всего строк: {input_list.Count()}. Всего прокси: {proxy_list.Count()}.", true);

for (int i = 0; i < input_list.Count; i++)
{
    if (string.IsNullOrWhiteSpace(input_list[i].Trim()))
    {
        project.SendInfoToLog($"Строка {i} пустая, пропускаем!", true);
        output_list.Add("\r\n");

        continue;
    }

    var sentence_parts = input_list[i].Split(new string[] { ".", "?", "!" }, StringSplitOptions.None);
    project.SendInfoToLog($"В строкe {i} имеем {sentence_parts.Count()} предложений!", true);

    bool success = false;
    for (int j = 0; j < global_error_counter; j++)
    {
        if (success) break;

        for (int k = 0; k < error_counter; k++)
        {
            if (success) break;

            var secret_id = ((long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalMilliseconds).ToString();
            var number = rand.Next(10000000, 99999999).ToString();

            string tail = string.Empty;
            string head = $"{{\"jsonrpc\":\"2.0\",\"method\": \"LMT_handle_jobs\",\"params\":{{\"jobs\":[";

            if (string.IsNullOrWhiteSpace(regional_language))
            {
                tail = $"],\"lang\":{{\"preference\":{{\"weight\":{{}},\"default\":\"default\"}},\"source_lang_user_selected\":\"{source_language}\",\"target_lang\":\"{target_language}\"}},\"priority\":1,\"commonJobParams\":{{\"mode\":\"translate\",\"browserType\":1}},\"timestamp\":{secret_id}}},\"id\":{number}}}";
            }
            else
            {
                tail = $"],\"lang\":{{\"preference\":{{\"weight\":{{}},\"default\":\"default\"}},\"source_lang_user_selected\":\"{source_language}\",\"target_lang\":\"{target_language}\"}},\"priority\":1,\"commonJobParams\":{{\"regionalVariant\":\"{regional_language}\",\"mode\":\"translate\",\"browserType\":1,\"formality\":null}},\"timestamp\":{secret_id}}},\"id\":{number}}}";
            }
       
            string fullBody = string.Empty;
            string rowsBefore = string.Empty;
            for (int m = 0; m < sentence_parts.Count(); m++)
            {
                string sentence = sentence_parts[m].Trim();

                if (string.IsNullOrWhiteSpace(sentence)) continue;
                sentence += ".";

                if (m == 0)
                {
                    if (sentence_parts.Count() > 1)
                    {
                        string next_sentence = sentence_parts[m+1].Trim();

                        if (!string.IsNullOrWhiteSpace(next_sentence))
                        {
                            next_sentence += ".";
                            fullBody += $"{{\"kind\":\"default\",\"sentences\":[{{\"text\":\"{sentence}\",\"id\":{m},\"prefix\":\"\"}}],\"raw_en_context_before\":[],\"raw_en_context_after\":[\"{next_sentence}\"],\"preferred_num_beams\":{num_beams}}}";
                        }
                        else
                        {
                            fullBody += $"{{\"kind\":\"default\",\"sentences\":[{{\"text\":\"{sentence}\",\"id\":{m},\"prefix\":\"\"}}],\"raw_en_context_before\":[],\"raw_en_context_after\":[],\"preferred_num_beams\":{num_beams}}}";
                        }
                    }
                    else
                    {
                        fullBody += $"{{\"kind\":\"default\",\"sentences\":[{{\"text\":\"{sentence}\",\"id\":{m},\"prefix\":\"\"}}],\"raw_en_context_before\":[],\"raw_en_context_after\":[],\"preferred_num_beams\":{num_beams}}}";
                    }
                }
                else if (m == sentence_parts.Count()-1)
                {
                    fullBody += $",{{\"kind\":\"default\",\"sentences\":[{{\"text\":\"{sentence}\",\"id\":{m},\"prefix\":\"\"}}],\"raw_en_context_before\":[{rowsBefore}],\"raw_en_context_after\":[],\"preferred_num_beams\":{num_beams}}}";
                }
                else
                {
                    string next_sentence = sentence_parts[m+1].Trim();

                    if (!string.IsNullOrWhiteSpace(next_sentence))
                    {
                        next_sentence += ".";
                        fullBody += $",{{\"kind\":\"default\",\"sentences\":[{{\"text\":\"{sentence}\",\"id\":{m},\"prefix\":\"\"}}],\"raw_en_context_before\":[{rowsBefore}],\"raw_en_context_after\":[\"{next_sentence}\"],\"preferred_num_beams\":{num_beams}}}";
                    }
                    else
                    {
                        fullBody += $",{{\"kind\":\"default\",\"sentences\":[{{\"text\":\"{sentence}\",\"id\":{m},\"prefix\":\"\"}}],\"raw_en_context_before\":[{rowsBefore}],\"raw_en_context_after\":[],\"preferred_num_beams\":{num_beams}}}";
                    }
                }

                if (string.IsNullOrWhiteSpace(rowsBefore)) rowsBefore += $"\"{sentence}\"";
                else rowsBefore += $",\"{sentence}\"";
            }

            if (string.IsNullOrWhiteSpace(proxy))
            for (int p = proxy_list.Count-1; p >= 0; p--)
            {
                lock (SyncObjects.ListSyncer)
                {
                    project.SendInfoToLog("Меняем прокси", true);
                    proxy = proxy_list[p].Trim();
                    proxy_list.RemoveAt(p);

                    if (string.IsNullOrWhiteSpace(proxy)) continue;
                }

                string firstResponse = ZennoPoster.HTTP.Request(
                    InterfacesLibrary.Enums.Http.HttpMethod.GET,
                    "https://www.deepl.com/translator",
                    string.Empty,
                    string.Empty,
                    $"{proxy_kind}://{proxy}",
                    "UTF-8",
                    ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody,
                    5000,
                    string.Empty,
                    project.Profile.UserAgent,
                    true,
                    5,
                    new[] {string.Empty},
                    string.Empty,
                    true,
                    true,
                    project.Profile.CookieContainer
                );

                if (!string.IsNullOrWhiteSpace(firstResponse))
                {
                    string cookie = Encoding.UTF8.GetString(project.Profile.CookieContainer.Export());
                    cookie = cookie.Replace(".deepl.com", "www2.deepl.com");
                    byte[] cookieBytes = System.Text.Encoding.UTF8.GetBytes(cookie);
                    project.Profile.CookieContainer.Import(cookieBytes);

                    break;
                }
            }

            if (string.IsNullOrWhiteSpace(proxy))
            {
                project.SendErrorToLog("Закончились прокси! Несите новые!", true);

                return "0";
            }

            string mainResponse = ZennoPoster.HTTP.Request(
                InterfacesLibrary.Enums.Http.HttpMethod.POST,
                "https://www2.deepl.com/jsonrpc?method=LMT_handle_jobs",
                $"{head}{fullBody}{tail}",
                "application/json",
                $"{proxy_kind}://{proxy}",
                "UTF-8",
                ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody,
                5000,
                string.Empty,
                project.Profile.UserAgent,
                true,
                5,
                new[] {string.Empty},
                string.Empty,
                true,
                true,
                project.Profile.CookieContainer
            );

            if (!string.IsNullOrWhiteSpace(mainResponse) && !mainResponse.Contains("Too many requests"))
            {
                var regex = new Regex("(?<=\"text\":\")[\\w\\W]*?(?=\")");
                var resultList = regex.Matches(mainResponse).Cast<Match>().ToList();

                string resultRow = string.Empty;
                for (int m = 0; m < resultList.Count; m++) resultRow += resultList[m].Value;
                resultRow = System.Text.RegularExpressions.Regex.Unescape(resultRow);

                success = true;
                output_list.Add(resultRow);
                project.SendInfoToLog($"Успешно перевели строку #{i}", true);
                Thread.Sleep(rand.Next(l_delay, h_delay));

                break;
            }
            else if (!string.IsNullOrWhiteSpace(mainResponse) && mainResponse.Contains("Invalid Request") && mainResponse.Contains("Invalid commonJobParams"))
            {
                project.SendErrorToLog("Алярм! Все сломалось!");

                return "0";
            }
            else
            {
                proxy = string.Empty;
            }
        }
    }

    if (!success)
    {
        project.SendErrorToLog("Лимит по количеству неудач для проекта! Помянем!", true);

        return "0";
    }
}

project.SendInfoToLog("Работа выполнена! Ничегосебе! Ура!", true);

return "1";
Баг с лишними точками исправил.
Исправил еще ряд багов

Вроде все языки работают хорошо
Тестил в разные стороны
Здравствуйте, подскажите в каком формате запароленые прокси прописывать и если такой возможности нет, то подскажите пожалуйста где брали прокси.
 
Последнее редактирование:

one

Client
Регистрация
22.09.2015
Сообщения
6 792
Благодарностей
1 264
Баллы
113
Здравствуйте, подскажите в каком формате запароленые прокси прописывать и если такой возможности нет, то подскажите пожалуйста где брали прокси.
Прокси прописываются стандартно:

TYPE://USER:PASS@PROXY_IP:PROXY_PORT
Пример:
socks5://myname:[email protected]:2233
 
Регистрация
25.12.2021
Сообщения
23
Благодарностей
16
Баллы
3
Последнее редактирование:

sps75

Client
Регистрация
13.12.2020
Сообщения
70
Благодарностей
8
Баллы
8
Я так и прописал, всё время меняет прокси на новую

UPD: Решил проблему, платная прокся подошла
А у меня что то не хочет работать. во входных ставлю сокс5, в файле прописываю как надо, в итоге скрин 2. Пробовал хттп, тот же результат
Прокси платные, астропрокси. ip4
 

Вложения

Регистрация
07.08.2019
Сообщения
75
Благодарностей
78
Баллы
18
А у меня что то не хочет работать. во входных ставлю сокс5, в файле прописываю как надо, в итоге скрин 2. Пробовал хттп, тот же результат
Прокси платные, астропрокси. ip4
В вашем списке проксей удалите socks5://
(Просто прокси должны быть в формате myname:[email protected]:2233)
Это прописывается программой самО, поэтому в вашем случае получается socks5://socks5://..., тоесть дублируются, и не работают
 

sps75

Client
Регистрация
13.12.2020
Сообщения
70
Благодарностей
8
Баллы
8
Это я уже потом поправил, в списке просто стоит сейчас myname:[email protected]:2233, переводит 1 строку, и все...
далее меняет прокси пока они не кончатся....
Я думаю дело в прокси все-таки. Один порт, со сменой внешнего ip по каждому запросу стоит настройка порта, но почему то не переводит, меняет прокси, возможно не работает эта смена по каждому запросу...
 

Вложения

Регистрация
08.05.2018
Сообщения
66
Благодарностей
7
Баллы
8
FantomaSkaRus1 Приветствую а в чем может быть причина , вылетает постоянно Too many requests
 
Регистрация
07.08.2019
Сообщения
75
Благодарностей
78
Баллы
18
Привет, знаю о проблеме, но пока не решил это, времени нет совсем :(
Рандомно то работает то нет... Либо все валит в Too many requests, хз
 
Регистрация
08.05.2018
Сообщения
66
Благодарностей
7
Баллы
8

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