Как легко сделать шаблон на гет пост (загрузка аватарки на почту mail.ru)

  • Автор темы Автор темы lbvf65
  • Дата начала Дата начала
  • Теги Теги
    mal.ru

lbvf65

Client
Регистрация
20.08.2020
Сообщения
468
Реакции
140
Баллы
43
Я долго не мог найти решение вопроса, который интересует тех,кто только начинает заниматься изучением гет поста.
На своём личном примере, хочу показать, что мне удалось найти за долгое время поисков. Представляю вашему внимаю загрузку аватарок на почту mail.ru

1.В первую очередь нужно авторизироваться

авторизация в почте mail.ru:
Развернуть Свернуть Копировать
/*--------------------------------
        Данные для запроса
*///------------------------------
string _account = "fluxtorconwa8yvb@mail.ru;spirampa-yo88ft"; // аккаунт через разделитель "login:pass" или "login;pass".
string _proxy = "";

/*----------------------------------------------------
        Авторизация майлру
*///---------------------------------------------------
string _login = String.Empty, _password = String.Empty;
try
{
    _login = _account.Split(':', ';')[0];
    _password = _account.Split(':', ';')[1];

    if (String.IsNullOrWhiteSpace(_login)) throw new Exception("Логин не указан");
    if (String.IsNullOrWhiteSpace(_password)) throw new Exception("Пароль не указан");

    project.Profile.CookieContainer.Clear(); // очистка контейнера куков.

    string HttpResponse = ZennoPoster.HTTP.Request
    (
        ZennoLab.InterfacesLibrary.Enums.Http.HttpMethod.GET, "https://mail.ru/", "", "", _proxy, "UTF-8",
        ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly, 20000, "", project.Profile.UserAgent, true, 5,
        new String[]{},  "", false, false, project.Profile.CookieContainer
    );

    if (String.IsNullOrWhiteSpace(HttpResponse)) throw new Exception("HttpResponse пуст");

    string token = Regex.Match(HttpResponse, "((?<=CSRF:\").*?(?=\")|(?<=CSRF:\\ \").*?(?=\"))").Value; // парсинг токена для авторизации.
// парсинг токена для авторизации.

    if (String.IsNullOrWhiteSpace(token)) throw new Exception("token для авторизации не найден");

    /*Авторизация*/
    HttpResponse = ZennoPoster.HTTP.Request
    (
        ZennoLab.InterfacesLibrary.Enums.Http.HttpMethod.POST, "https://auth.mail.ru/jsapi/auth",
        $"login={ZennoLab.Macros.TextProcessing.UrlEncode(_login)}&password={ZennoLab.Macros.TextProcessing.UrlEncode(_password)}&saveauth=1&token={token}&project=e.mail.ru&_="
        + Convert.ToString((DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds).Replace(",", "").Substring(0, 13),
        "application/x-www-form-urlencoded", _proxy, "UTF-8",
        ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody, 20000, "", project.Profile.UserAgent, true, 5,
        new String[]
        {
            "Accept: */*",
            "Origin: https://mail.ru",
            "Referer: https://mail.ru/",
            "Connection: keep-alive"
        },
        "", false, false, project.Profile.CookieContainer
    );
   if (Regex.IsMatch(HttpResponse, "{\"status\":\"ok\",\"code_number\":200}"))
    {
        project.Profile.Save($@"{project.Directory}\profiles\{_login}.zpprofile", true, true, true, true, true, true, true, true, true, new string[]{"PROXY"}); // сейв профиля.
        project.SendInfoToLog($"{_login} | Успешная авторизация", true); // лог для zp.
    }
    else
    {
        /*Определение ошибки, если не вышло авторизоваться*/
        if (!Regex.IsMatch(HttpResponse, "((?<=\\{\"status\":\")break.*?(?=\"})|(?<=\"status\":\")fail.*?(?=\"}))")) throw new Exception("Неизвестная ошибка авторизации");
        if (Regex.IsMatch(HttpResponse, "(?<=\\{\"status\":\")break.*?(?=\"})")) throw new Exception("Требуется SMS подтверждение/Восстановление доступа");
        if (Regex.IsMatch(HttpResponse, "(?<=\"status\":\")fail.*?(?=\"})")) throw new Exception("Не верный логин или пароль");
    }
}
catch (Exception ex)
{
    project.SendWarningToLog(!String.IsNullOrWhiteSpace(_login) ? $"{_login} | {ex.Message}" : $"{ex.Message}", true);
}

2. Генерируем токен для пост запроса.

код для генерирования токена generation_token:
Развернуть Свернуть Копировать
return string.Format(@"WebKitFormBoundary{0}",DateTime.Now.Ticks.ToString("x"));

ответ данного кода нужно добавить в переменную.

3.получаем token

Получить token:
Развернуть Свернуть Копировать
/*--------------------------------
        Данные для запроса
*///------------------------------
var email = "fluxtorconwa8yvb@mail.ru";
var proxy = "";

/*--------------------------------
        Перенос письма
*///------------------------------
var unixTime = ((DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds).ToString().Replace(".", "").Substring(0, 13);
project.Variables["unixTime"].Value = Convert.ToString(unixTime);
var httpResponse = ZennoPoster.HTTP.Request
(
    method: ZennoLab.InterfacesLibrary.Enums.Http.HttpMethod.GET,
    respType: ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly,
    url: "https://e.mail.ru/inbox/?filter_unread=1",
    UserAgent: project.Profile.UserAgent, proxy: proxy, Encoding: "utf-8", Timeout: 30000, UseRedirect: true, MaxRedirectCount: 5,
    cookieContainer: project.Profile.CookieContainer
);

if (Regex.IsMatch(httpResponse, @"(?<=')&afterReload=1.*?(?=';)"))
{
    httpResponse = ZennoPoster.HTTP.Request
    (
        method: ZennoLab.InterfacesLibrary.Enums.Http.HttpMethod.GET,
        respType: ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.BodyOnly,
        url: "https://e.mail.ru/inbox/?afterReload=1",
        UserAgent: project.Profile.UserAgent, proxy: proxy, Encoding: "utf-8", Timeout: 30000, UseRedirect: true, MaxRedirectCount: 5,
        cookieContainer: project.Profile.CookieContainer
    );
}

var token = Regex.Match(httpResponse, "(?<=\"token\":\").*?(?=\")|(?<=updateToken\\(\").*?(?=\")").Value;




project.Variables["token"].Value = Convert.ToString(token);

4. формирование пост запроса

4.1 указом UAL https://id.mail.ru/api/v1/user/avatars/add?token={-Variable.token-}

4.2 Referer https://id.mail.ru/profile?utm_campaign=mailid&utm_medium=ph&from=headline

4.3 кодировка utf-8

4.4 таймаут от 30 до 60 секунд

4.5 указываем generation_token

4.6 указываем почту от почтового ящика mail.ru

4.7 взял данную информацию semafor
Следующий стандартный макрос, о котором стоит сказать — {-TimeNow.UnixTime-}. Возвращает значение вида 1588674065.50537, где до точки указано количество целых секунд прошедших с наступления эпохи Unix(подробнее о ней ниже). UnixTime выводится по времени UTC. Для чего нужны милли или микросекунды (а может пико или нано, не вникал), следующие после запятой, мне не ясно — имхо это лишний кубик по их удалению, но может имеется и возможность задать формат вывода.

4.8 указываем прямой путь к аватарке на пк

4.9 тип данных не забываем поменять на multipart

4.10 только содержимое (чтобы проверить ответ об успешной загрузке)

4.11 теперь вы можете создать любую переменную,в которую можно добавить ответ.



86774


C#:
Развернуть Свернуть Копировать
------{-Variable.generation_token-}
Content-Disposition: form-data; name="email"

{-Variable.Email-}
------{-Variable.generation_token-}
Content-Disposition: form-data; name="htmlencoded"

false
------{-Variable.generation_token-}
Content-Disposition: form-data; name="_avatar"

{-Variable.unixTime-}.png.jpeg
------{-Variable.generation_token-}
Content-Disposition: form-data; name="_mainphoto"

{-Variable.unixTime-}.png.jpeg
------{-Variable.generation_token-}
Content-Disposition: form-data; name="avatar"; filename="{-Variable.unixTime-}.png.jpeg"
Content-Type: image/jpeg

C:\Users\lbvf-\OneDrive\Изображения\Feedback\{1A1254EC-8EA6-4949-BD31-C38D273D6F8D}\Capture001.png
 
Последнее редактирование:
Подскажите как тут, сделать чтобы подставлялись данные из переменной
C#:
Развернуть Свернуть Копировать
string _account = ""; // аккаунт через разделитель "login:pass" или "login;pass".
string _proxy = "";

Чтобы было так
C#:
Развернуть Свернуть Копировать
string _account = "{-Variable.login_pass-}"; // аккаунт через разделитель "login:pass" или "login;pass".
string _proxy = "{-Variable.proxy-}";

И в каком формате подставлять прокси? Пробую login:pass@ip:port не работает

И чтобы результат можно было записать в файл в формате
login;password;proxy;ответ_с _ошибкой_или_ок
 
С первым разобрался, нужно сделать так
C#:
Развернуть Свернуть Копировать
string _account = project.Variables["login_pass"].Value;
 
  • Спасибо
Реакции: lbvf65

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