• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

Исходник [SSL]Получение On-Line Date, Time, IP

Energy Reload
Забаненный
Забаненный
Статус
Оффлайн
Регистрация
20 Авг 2017
Сообщения
1,206
Реакции
330
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Тут будет черная пречёрная магия.....
Кто ей не владеет, проходим мимо.


Обращаться будем к worldtimeapi.org
Создаем запрос к API для получения данных
C++:
Expand Collapse Copy
char buffer1[2000];
WSAStartup(MAKEWORD(2, 2), &wsa);
    SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    struct hostent* host;
    host = gethostbyname("worldtimeapi.org");
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port = htons(80);
    SockAddr.sin_family = AF_INET;
    SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);

    connect(Socket, (SOCKADDR*)(&SockAddr), sizeof(SockAddr));

    _send(Socket, "GET /api/timezone/Europe/Kiev.txt HTTP/1.1\r\nHost: worldtimeapi.org\r\nConnection: close\r\n\r\n");
    _recv(Socket, buffer1, 2000);

GET /api/timezone/Europe/Kiev.txt - это у нас часовой пояс.
Ответ в таком виде
Код:
Expand Collapse Copy
abbreviation: EEST
client_ip: 91.196.89.201
datetime: 2021-06-25T23:13:17.732622+03:00
day_of_week: 5
day_of_year: 176
dst: true
dst_from: 2021-03-28T01:00:00+00:00
dst_offset: 3600
dst_until: 2021-10-31T01:00:00+00:00
raw_offset: 7200
timezone: Europe/Zaporozhye
unixtime: 1624651997
utc_datetime: 2021-06-25T20:13:17.732622+00:00
utc_offset: +03:00
week_number: 25
Весь список часовых поясов
Пожалуйста, авторизуйтесь для просмотра ссылки.


Мы получили эти данные в buffer1 (_recv(Socket, buffer1, 2000);)
Далее нужно разделить ответ на строки
C++:
Expand Collapse Copy
    strcpy(buffer4, strstr(buffer1, "\r\n\r\n") + 4);
    const char* delims = "\n";
    char** words = split_string(buffer4, delims);

C++:
Expand Collapse Copy
char ** split_string(const char *str, const char *delims)
{
 
    size_t str_len = strlen(str);
    size_t words_cntr = 1;
    char **words;
    size_t i, j;
    size_t w;

    for (i = 0; i < str_len; ++i)
        if (strchr(delims, str[i]) != NULL)
            ++words_cntr;

    words = (char **)malloc((words_cntr + 1) * sizeof(char *));
    words[words_cntr] = NULL;
    for (i = 0, w = 0; i < str_len + 1; ++i)
    {
        j = i;
        while (str[j] != '\0' && strchr(delims, str[j]) == NULL)
            ++j;
        words[w] = (char *)malloc((j - i + 1) * sizeof(char));
        strncpy(words[w], str + i, j - i);
        words[w++][j - i] = '\0';
        i = j;
    }
 
    return words;
}

и далее в нашем массиве будет отдельная строка.
C++:
Expand Collapse Copy
words[0] - abbreviation: EEST
words[1] - client_ip: 91.196.89.201
words[2] - datetime: 2021-06-25T23:13:17.732622+03:00
words[3] - day_of_week: 5
words[4] - day_of_year: 176
words[5] - dst: true
words[6] - dst_from: 2021-03-28T01:00:00+00:00
words[8] - dst_offset: 3600
words[9] - dst_until: 2021-10-31T01:00:00+00:00
words[10] - raw_offset: 7200
words[11] - timezone: Europe/Zaporozhye
words[12] - unixtime: 1624651997
words[13] - utc_datetime: 2021-06-25T20:13:17.732622+00:00
words[14] - utc_offset: +03:00
words[15] - week_number: 25

Что бы правильно воспользоваться этими данными, нужно воспользоваться черной магией.....
Давайте заведем некий клас данных, в которую будем писать данные, а после их использовать:

Код:
Expand Collapse Copy
class cUser
{
public:
    string client_ip;
    string Web_date;
    string time;
    string timezone;
    string utc_datetime;
    string utc_offset;
};
extern cUser pUser;

создаем переменную типа string
C++:
Expand Collapse Copy
string::size_type start_posn;
string::size_type end_posn;

Для получения IP:
C++:
Expand Collapse Copy
string client_ip = words[1]; //- под массивом 1 у нас IP
start_posn = client_ip.find("client_ip: ");
    if (start_posn != string::npos)
    {
        start_posn += strlen("client_ip: ");
    }
    end_posn = client_ip.find(" ", start_posn);
    length = end_posn - start_posn;
    pUser.client_ip = client_ip.substr(start_posn, length);

Для получения текущей даты:
C++:
Expand Collapse Copy
string datetime = words[2];
start_posn = datetime.find(":");
    if (start_posn != string::npos)
    {
        start_posn += strlen(":") + 1;
    }
    end_posn = datetime.find("T", start_posn);
    length = end_posn - start_posn;
    pUser.Web_date = datetime.substr(start_posn, length);

Для получения текущего времени:
C++:
Expand Collapse Copy
start_posn = datetime.find("T");
    if (start_posn != string::npos)
    {
        start_posn += strlen("T");
    }
    end_posn = datetime.find(".", start_posn);
    length = end_posn - start_posn;
    pUser.time = datetime.substr(start_posn, length);
Мы получили:
- IP
- Date
- Time


Для тех, кто не понял:
Имея строку "words[2] - datetime: 2021-06-25T23:13:17.732622+03:00"
Мы с помощью библиотеки string делаем поиск по данной строке, с лево на право.
Для получения даты находим символ (:) и читаем строку до символа (Т) и записываем в таблицу ( pUser.Web_date = datetime.substr(start_posn, length);)
Для получения времени находим символ (Т) и читаем строку до символа (.) и записываем в таблицу ( pUser.time = datetime.substr(start_posn, length);)

На последок:
Хотим получить часовой пояс (words[11] - timezone:)
это у нас 11 массив в строке
создаем переменную
string timezone= words[11]; //- под массивом 1 у нас timezone
И все по старому примеру
Строка имеет следующий вид: timezone: бла-бла-бла
C++:
Expand Collapse Copy
[CODE=cpp]
start_posn = client_ip.find("timezone: ");
if (start_posn != string::npos)
    {
        start_posn += strlen("timezone: ");
    }
    end_posn = client_ip.find(" ", start_posn);
    length = end_posn - start_posn;
    pUser.timezone= datetime.substr(start_posn, length);
[/CODE]
в итоге в наш класс\структуру pUser.timezone мы записали - Europe/Zaporozhye
Где-то что-то упустил.
 
Последнее редактирование модератором:
Обращаться будем к worldtimeapi.org
Что-то тут перемудрено.
1. gethostbyname шагает в etc/hosts, это значит все это разом можно подменить
2. при парсинге нельзя полагаться на никакие индексы, нужно точно искать по строкам, гораздо проще найти "client_ip: " и от позиции + длину этого тега и парсить до конца строки/текста.
3. всю эту инфу должен возвращать сервер p2c в своем зашифрованном протоколе (не http/s) и даже парсить ничего не придется.

Где-то что-то упустил.
Похоже сам [SSL]Получение On-Line Date, Time, IP, здесь нет никакого https, это обычный сырой http без какого либо шифрования.
 
Последнее редактирование:

Похожие темы

Ответы
13
Просмотры
6K
Назад
Сверху Снизу