This commit is contained in:
oct 2025-03-20 00:25:12 +00:00
parent 2b228a5e68
commit 791d4f763f
2 changed files with 95 additions and 0 deletions

View File

@ -169,6 +169,101 @@ void my_msg()
printf("end my_msg");
}
// Функция для экранирования спецсимволов в JSON
std::string escape_json(const std::string& s) {
std::string result;
for (char c : s) {
switch (c) {
case '"': result += "\\\""; break;
case '\\': result += "\\\\"; break;
case '\b': result += "\\b"; break;
case '\f': result += "\\f"; break;
case '\n': result += "\\n"; break;
case '\r': result += "\\r"; break;
case '\t': result += "\\t"; break;
default: result += c; break;
}
}
return result;
}
// Проверка, является ли строка числом (включая отрицательные)
bool is_numeric(const std::string& s) {
if (s.empty()) return false;
size_t start = 0;
if (s[0] == '-') {
if (s.size() == 1) return false;
start = 1;
}
for (size_t i = start; i < s.size(); ++i) {
if (!isdigit(s[i])) return false;
}
return true;
}
int my_msg(const std::string& msg) {
std::cout << msg << std::endl;
if (telegram_token.empty() || telegram_id.empty()) {
return 0; // Интеграция не настроена
}
CURL* curl = curl_easy_init();
if (!curl) return 6; // Ошибка инициализации CURL
// Экранируем сообщение
std::string escaped_msg;
escaped_msg = escape_json(msg);
// Формируем поле chat_id
std::string chat_id_field;
if (is_numeric(telegram_id)) {
chat_id_field = "\"chat_id\": " + telegram_id;
} else {
chat_id_field = "\"chat_id\": \"" + telegram_id + "\"";
}
// Формируем JSON
std::string json_data = "{" + chat_id_field + ", \"text\": \"" + escaped_msg + "\"}";
// Настраиваем заголовоки
struct curl_slist* headers = nullptr;
headers = curl_slist_append(headers, "Content-Type: application/json");
// Настраиваем параметры CURL
curl_easy_setopt(curl, CURLOPT_URL, ("https://api.telegram.org/bot" + telegram_token + "/sendMessage").c_str());
curl_easy_setopt(curl, CURLOPT_POST, 1L);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, json_data.c_str());
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl/7.68.0");
// Игнорируем вывод ответа
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, [](void*, size_t size, size_t nmemb, void*) -> size_t {
return size * nmemb;
});
// Выполняем запрос
CURLcode res = curl_easy_perform(curl);
long http_code = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
// Освобождаем ресурсы
curl_slist_free_all(headers);
curl_easy_cleanup(curl);
if (res != CURLE_OK) return 5;
switch (http_code) {
case 200: return 0;
case 401: return 1;
case 400: return 2;
case 404: return 3;
default:
if (http_code >= 500) return 4;
return 4;
}
}
// Данная функция записывает в файл лога сообщение
int my_log()
{

BIN
src/a.out Executable file

Binary file not shown.