json upload_image_to_vk(const std::string& upload_url, const std::string& image_filename) {
CURL *curl = curl_easy_init();
CURLcode res;
json result;
if (curl) {
curl_mime *mime = curl_mime_init(curl);
curl_mimepart *part = curl_mime_addpart(mime);
curl_mime_name(part, "photo");
curl_mime_filedata(part, image_filename.c_str()); // Убедитесь, что этот файл существует
curl_easy_setopt(curl, CURLOPT_URL, upload_url.c_str());
curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); // Включаем детализированный вывод
std::string response_string;
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response_string);
// Отправка запроса
res = curl_easy_perform(curl);
if (res != CURLE_OK) {
std::cerr << "Ошибка при загрузке изображения: " << curl_easy_strerror(res) << std::endl;
} else {
std::cout << "Ответ от сервера загрузки изображения: " << response_string << std::endl;
try {
result = json::parse(response_string);
// Проверка на наличие необходимых полей
if (!result.contains("server") || !result.contains("photo") || !result.contains("hash")) {
std::cerr << "Ошибка: отсутствуют необходимые поля в ответе: " << result.dump(4) << std::endl;
} else {
std::cout << "Успешная загрузка изображения!" << std::endl;
}
} catch (json::parse_error& e) {
std::cerr << "Ошибка парсинга JSON: " << e.what() << std::endl;
}
}
curl_mime_free(mime);
curl_easy_cleanup(curl);
} else {
std::cerr << "Ошибка инициализации CURL!" << std::endl;
}
return result;
}
// Функция для отправки сообщения с изображением
std::future<void> send_message_with_image(int peer_id, const std::string& message, const std::string& image_filename) {
return std::async(std::launch::async, [peer_id, message, image_filename]() {
CURL* curl = curl_easy_init();
if (!curl) {
std::cerr << "Ошибка инициализации CURL!" << std::endl;
return;
}
// Получаем upload_url для отправки изображения в VK
std::string upload_url = "https://api.vk.com/method/photos.getMessagesUploadServer";
upload_url += "?access_token=" + config.token;
upload_url += "&v=" + config.api_version;
json upload_response = send_request(upload_url);
if (upload_response.contains("error")) {
std::cerr << "Ошибка получения upload_url: " << upload_response["error"]["error_msg"] << std::endl;
return;
}
// Загружаем изображение на сервер загрузки VK
json image_response = upload_image_to_vk(upload_response["response"]["upload_url"], image_filename);
if (!image_response.contains("server") || !image_response.contains("photo") || !image_response.contains("hash")) {
std::cerr << "Ошибка: не найдены необходимые данные в ответе загрузки изображения." << std::endl;
return;
}
// Получаем данные для сохранения изображения
int server = image_response["server"].get<int>();
std::string photo_data = image_response["photo"].get<std::string>();
std::string hash = image_response["hash"].get<std::string>();
// Формируем строку для сохранения изображения
std::string save_url = "https://api.vk.com/method/photos.saveMessagesPhoto";
save_url += "?server=" + std::to_string(server);
save_url += "&photo=" + photo_data;
save_url += "&hash=" + hash;
save_url += "&access_token=" + config.token;
save_url += "&v=" + config.api_version;
json save_response = send_request(save_url);
if (save_response.contains("error")) {
std::cerr << "Ошибка при сохранении изображения: " << save_response["error"]["error_msg"] << std::endl;
return;
}
// Получаем ID фотографии
int owner_id = save_response["response"]["owner_id"].get<int>();
int photo_id = save_response["response"]["id"].get<int>();
// Формируем URL для отправки сообщения
std::string send_message_url = "https://api.vk.com/method/messages.send";
send_message_url += "?peer_id=" + std::to_string(peer_id);
send_message_url += "&message=" + std::string(curl_easy_escape(curl, message.c_str(), message.size()));
send_message_url += "&random_id=" + std::to_string(std::chrono::system_clock::now().time_since_epoch().count());
send_message_url += "&attachment=photo" + std::to_string(owner_id) + "_" + std::to_string(photo_id);
send_message_url += "&access_token=" + config.token;
send_message_url += "&v=" + config.api_version;
json response = send_request(send_message_url);
if (response.contains("error")) {
std::cerr << "Ошибка при отправке сообщения: " << response["error"]["error_msg"] << std::endl;
} else {
std::cout << "Сообщение успешно отправлено пользователю " << peer_id << " с изображением." << std::endl;
}
curl_easy_cleanup(curl);
});
}
Пытаюсь отправить фото в сообщение и получаю следующее:
Ответ от сервера загрузки изображения:
{"server":849424,"photo":"","hash":"1081300cb345a621f1899ffa9a7da846"}
Успешная загрузка изображения!
Ошибка при сохранении изображения: "One of the parameters specified was missing or invalid: photo is undefined".
Что в таком случае делать?