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

lbvf65

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

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

авторизация в почте mail.ru:
/*--------------------------------
        Данные для запроса
*///------------------------------
string _account = "[email protected];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 = "[email protected]";
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
 

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

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

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

fri-lancer

Client
Регистрация
01.10.2013
Сообщения
404
Благодарностей
155
Баллы
43
Подскажите как тут, сделать чтобы подставлялись данные из переменной
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;ответ_с _ошибкой_или_ок
 

fri-lancer

Client
Регистрация
01.10.2013
Сообщения
404
Благодарностей
155
Баллы
43
С первым разобрался, нужно сделать так
C#:
string _account = project.Variables["login_pass"].Value;
 
  • Спасибо
Реакции: lbvf65

lbvf65

Client
Регистрация
20.08.2020
Сообщения
438
Благодарностей
113
Баллы
43

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