Уважаемые пользователи форума, убедительно просим вас переходить в телеграмм продавца, исключительно по предоставленной ссылке. Проверяйте продавца, отправив сообщение на электронную почту, чтобы убедиться в том, что вы общаетесь действительно с ним.

Простой метод работы qiwi + libcurl в языке си

Тема в разделе "Хакинг. Программирование", создана пользователем stayprimitive, 30 мар 2018.

  1. stayprimitive

    stayprimitive New Member

    Сообщения:
    9
    Симпатии:
    0
    Приветствую, в данной статье хочу описать метод, как работать с платежной системой киви используя си.
    Не претендую на звание мастера, всего-лишь делюсь своим опытом, надеюсь кому-нибудь будет полезно. Так же буду рад конструктивной критике.

    Приступим к первой части.
    Теорию опишу очень поверхнастно так как этой воды можно везде найти.
    Мы имеем пару логин:пасс, далее мы формируем json запрос для проверки валидности пары, в случае успеха получаем тг-тикет. Далее берем тг-тикет и по нему получаем стс-тике с которым уже производим авторизацию. После авторизации можно будет при помощи парсера получать различную информацию с аккаунта киви, например балан, транзакции и прочее.

    Файл main.c
    Code:
    //Статическая функция, возвращающая ответ с сервера
    static size_t CallBack(void *contents, size_t size, size_t nmemb, void *userp)
    {
    size_t realsize = size * nmemb;
    curl_data_t *cdt = (curl_data_t*)userp;

    cdt-resp_data = realloc(cdt-resp_data, cdt-resp_size + realsize + 1);
    if(cdt-resp_data == NULL)
    {
    printf("-- not enough memory (realloc returned NULL)
    ");
    return 0;
    }

    memcpy(&(cdt-resp_data[cdt-resp_size]), contents, realsize);
    cdt-resp_size += realsize;
    cdt-resp_data[cdt-resp_size] = 0;

    return realsize;
    }

    //Функция проверяет правильность пары логин:пасс и получает тг-тикет и записывает куки
    qiwi_t QiwiGetTgstByClient(char *request)
    {
    printf("- QiwiGetTgstByClient
    ");

    CURL *curl = curl_easy_init();
    CURLcode res;

    curl_data_t cdt;
    cdt.resp_data = malloc(1);
    cdt.resp_size = 0;

    if(curl == NULL)
    exit(1);

    struct curl_slist *slist = NULL;

    slist = curl_slist_append(slist, "Accept: application/vnd.qiwi.sso-v1+json");
    slist = curl_slist_append(slist, "Accept-Language: ru;q=0.8,en-US;q=0.6,en;q=0.4");
    slist = curl_slist_append(slist, "Content-Type: application/json; charset=UTF-8");
    slist = curl_slist_append(slist, "Accept-Encoding: gzip, deflate");
    slist = curl_slist_append(slist, "X-Requested-With: XMLHttpRequest");

    curl_easy_setopt(curl, CURLOPT_URL, "https://auth.qiwi.com/cas/tgts");
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request);
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
    curl_easy_setopt(curl, CURLOPT_HEADER, 0);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CallBack);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&cdt);
    curl_easy_setopt(curl, CURLOPT_POST, 1);
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60L);
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt");
    curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt");

    curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");

    //Цикл используется для того чтобы в случае высокой задержки програма не останавливалась
    do
    {
    printf("-- Sending curl request
    ");
    res = curl_easy_perform(curl);
    }while(res != CURLE_OK);

    //Формируем json для дальнейшего использования
    qiwi.json = strdup(cdt.resp_data);

    // slist лучше очистеть, бывали проблемы из-за этого
    if(slist != NULL)
    curl_slist_free_all(slist);

    //записываем куки файл
    curl_easy_cleanup(curl);

    return qiwi;
    }

    // Функция получает стс-тикет по тг-тикету
    qiwi_t QiwiGetStsByTgst(char *request)
    {
    printf("- QiwiGetStsByTgst
    ");

    CURL *curl = curl_easy_init();
    CURLcode res;

    curl_data_t cdt;
    cdt.resp_data = malloc(1);
    cdt.resp_size = 0;

    if(curl == NULL)
    exit(1);

    struct curl_slist *slist = NULL;

    slist = curl_slist_append(slist, "Accept: application/vnd.qiwi.sso-v1+json");
    slist = curl_slist_append(slist, "Accept-Language: ru;q=0.8,en-US;q=0.6,en;q=0.4");
    slist = curl_slist_append(slist, "Content-Type: application/json; charset=UTF-8");
    slist = curl_slist_append(slist, "Accept-Encoding: gzip, deflate");
    slist = curl_slist_append(slist, "X-Requested-With: XMLHttpRequest");

    curl_easy_setopt(curl, CURLOPT_URL, "https://auth.qiwi.com/cas/sts");
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, request);
    curl_easy_setopt(curl, CURLOPT_HTTPHEADER, slist);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CallBack);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&cdt);
    curl_easy_setopt(curl, CURLOPT_POST, 1);
    curl_easy_setopt(curl, CURLOPT_HEADER, 0);
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60L);
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt");
    curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt");

    curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");

    do
    {
    printf("-- Sending curl request
    ");
    res = curl_easy_perform(curl);
    }while(res != CURLE_OK);

    qiwi.answer = strdup(cdt.resp_data);

    if(slist != NULL)
    curl_slist_free_all(slist);

    curl_easy_cleanup(curl);

    return qiwi;
    }

    // Функция отправляет стс-тикет на сервер
    qiwi_t QiwiInputStsTicket(char *request)
    {
    printf("- QiwiInputStsTicket
    ");

    CURL *curl = curl_easy_init();
    CURLcode res;

    curl_data_t cdt;
    cdt.resp_data = malloc(1);
    cdt.resp_size = 0;

    if(curl == NULL)
    exit(0);

    char url[128];
    sprintf(url, "https://qiwi.com/j_spring_cas_security_check?ticket=%s", request);

    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CallBack);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&cdt);
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60L);
    curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt");
    curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt");

    curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");

    do
    {
    printf("-- Sending curl request
    ");
    res = curl_easy_perform(curl);
    }while(res != CURLE_OK);

    qiwi.answer = strdup(cdt.resp_data);

    curl_easy_cleanup(curl);

    return qiwi;
    }

    //Устанавливаем прокси и записываем куки
    qiwi_t QiwiSetProxy()
    {
    printf("- QiwiSetProxy
    ");

    CURL *curl = curl_easy_init();
    CURLcode res;

    curl_data_t cdt;
    cdt.resp_data = malloc(1);
    cdt.resp_size = 0;

    if(curl == NULL)
    exit(1);

    curl_easy_setopt(curl, CURLOPT_URL, "https://auth.qiwi.com/app/proxy?v=1");
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CallBack);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&cdt);
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60L);
    curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "cookies.txt");
    curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "cookies.txt");

    curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");

    do
    {
    printf("-- Sending curl request
    ");
    res = curl_easy_perform(curl);
    }while(res != CURLE_OK);

    qiwi.answer = strdup(cdt.resp_data);

    curl_easy_cleanup(curl);

    return qiwi;
    }

    // Функция осуществляет авторизацию
    qiwi_t QiwiAuthClient()
    {
    printf("- QiwiAuthClient
    ");

    //Эта функция не описывалась еще, она возвращает две переменные
    //db.qiwi.username || db.qiwi.password
    GetActivatedWallet();

    //Эта функция тоже не описывалась,
    // Она проверяет к какому из кошельков подключаться
    if(db.qiwi.username == NULL || db.qiwi.password == NULL)
    GetActivatedWallet();

    //Формируем запрос в формате json
    QiwiParseUserPass(db.qiwi.username, db.qiwi.password);
    //Получаем тикет из сформированного json запроса
    QiwiGetTgstByClient(qiwi.userpass);
    //Снова формируем json запрос с тикетом
    QiwiParseTgst(qiwi.json);

    //Функция сравнивает тикеты и пишит их в базу, чтобы по сто раз не обращаться к //серверам киви
    UpdateWalletTicket(qiwi.ticket, 1);

    //Формирование запроса в формате json
    QiwiParseTicketRequest(qiwi.ticket);
    //Получение стс-тикета
    QiwiGetStsByTgst(qiwi.request);
    //Подготовка запроса на авторизацию
    QiwiParseSts2(qiwi.answer);

    //Обновляем второй тикет
    UpdateWalletTicket(qiwi.ticket, 2);

    //Авторизируемся по стс-тикету
    QiwiInputStsTicket(qiwi.ticket);

    //Устанавливаем прокси для отправки запросов
    QiwiSetProxy();

    return qiwi;
    }​

    Я не стал весь процесс запихивать в одну функцию, ибо это крайне не читабельно.
    Кому интересно, могу написать вторую часть с более подробными описаниями.

    Также исправьте, если я где-то ошибся, буду очень признателен
  2. FAQ

    FAQ Member

    Сообщения:
    66
    Симпатии:
    0
    Баньте уёбка!
  3. stayprimitive

    stayprimitive New Member

    Сообщения:
    9
    Симпатии:
    0
    Причина?
  4. aka_k4

    aka_k4 Member

    Сообщения:
    338
    Симпатии:
    1
    это не статья а хуета из примеров в первой ссылке гугла иди нахуй лох)
  5. stayprimitive

    stayprimitive New Member

    Сообщения:
    9
    Симпатии:
    0
    Сделай лучше тогда.
  6. Mr.Medved

    Mr.Medved Member

    Сообщения:
    420
    Симпатии:
    0
    Мы будем помнить тебя, работник по ру. Аминь.

Поделиться этой страницей