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

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



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



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

Что было? Поменяли очень сильно запросы! Но я починил)
Ну и куки еще добавили, тоже починил)
Все желающие говорить спасибо - не стесняйтесь!
Будут вопросы - задавайте) :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";

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

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

Вложения

  • Deepl.zp
    Deepl.zp
    12,5 KB · Просмотры: 266
Последнее редактирование:
Обновляйтесь! Все работает)

Что было? Поменяли очень сильно запросы! Но я починил)
Ну и куки еще добавили, тоже починил)
Все желающие говорить спасибо - не стесняйтесь!
Будут вопросы - задавайте) :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";

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

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

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

TYPE://USER:PASS@PROXY_IP:PROXY_PORT
Пример:
socks5://myname:mypass@1.2.3.4:2233
 
Прокси прописываются стандартно:

TYPE://USER:PASS@PROXY_IP:PROXY_PORT
Пример:
socks5://myname:mypass@1.2.3.4:2233
Я так и прописал, всё время меняет прокси на новую

UPD: Решил проблему, платная прокся подошла
 
Последнее редактирование:
Я так и прописал, всё время меняет прокси на новую

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

Вложения

  • Screenshot_1.png
    Screenshot_1.png
    1,6 KB · Просмотры: 192
  • Screenshot_11.png
    Screenshot_11.png
    18,2 KB · Просмотры: 198
  • Screenshot_2.png
    Screenshot_2.png
    22,7 KB · Просмотры: 205
А у меня что то не хочет работать. во входных ставлю сокс5, в файле прописываю как надо, в итоге скрин 2. Пробовал хттп, тот же результат
Прокси платные, астропрокси. ip4

В вашем списке проксей удалите socks5://
(Просто прокси должны быть в формате myname:mypass@1.2.3.4:2233)
Это прописывается программой самО, поэтому в вашем случае получается socks5://socks5://..., тоесть дублируются, и не работают
 
Это я уже потом поправил, в списке просто стоит сейчас myname:mypass@1.2.3.4:2233, переводит 1 строку, и все...
далее меняет прокси пока они не кончатся....
Я думаю дело в прокси все-таки. Один порт, со сменой внешнего ip по каждому запросу стоит настройка порта, но почему то не переводит, меняет прокси, возможно не работает эта смена по каждому запросу...
 

Вложения

  • Screenshot_3.png
    Screenshot_3.png
    18,2 KB · Просмотры: 181
  • Screenshot_4.png
    Screenshot_4.png
    13,6 KB · Просмотры: 189
FantomaSkaRus1 Приветствую а в чем может быть причина , вылетает постоянно Too many requests
 
Привет, знаю о проблеме, но пока не решил это, времени нет совсем :(
Рандомно то работает то нет... Либо все валит в Too many requests, хз
 

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