Для отправки сообщения с фотографией через VK API на C++ необходимо выполнить несколько шагов, включая загрузку изображения на сервер ВКонтакте, получение сервера загрузки, а затем отправку сообщения с вложенной фотографией.
Вот основная структура функции `upload_image_to_vk`, которая будет загружать изображение на сервер ВКонтакте:
1. **Получение URL для загрузки изображения**:
Вам нужно сделать запрос к API ВКонтакте для получения адреса сервера загрузки изображений.
2. **Загрузка изображения**:
После получения URL необходимо отправить изображение на этот сервер.
3. **Получение ID загруженной фотографии**:
После успешной загрузки изображения необходимо извлечь идентификатор загруженной фотографии.
4. **Отправка сообщения с фотографией**:
Как только вы получили ID фотографии, выполните запрос на отправку сообщения, в котором укажите ID фотографии.
Вот примерный алгоритм выполнения этих шагов:
```cpp
#include <iostream>
#include <string>
#include <curl/curl.h> // для выполнения HTTP-запросов
#include <nlohmann/json.hpp> // для работы с JSON (нужно подключить библиотеку)
// Функция для отправки запросов к API ВКонтакте
std::string vk_api_request(const std::string& url) {
CURL* curl;
CURLcode res;
std::string readBuffer;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
return readBuffer;
}
// Функция для загрузки изображения на ВКонтакте
std::string upload_image_to_vk(const std::string& access_token, const std::string& user_id, const std::string& image_path) {
// 1. Получаем сервер для загрузки изображений
std::string get_upload_url = "https://api.vk.com/method/photos.getWallUploadServer?access_token=" + access_token + "&v=5.130";
std::string response = vk_api_request(get_upload_url);
auto json_response = nlohmann::json::parse(response);
std::string upload_url = json_response["response"]["upload_url"];
// 2. Загружаем изображение
CURL* curl;
CURLcode res;
curl_mime* mime;
curl_mimepart* part;
curl = curl_easy_init();
if(curl) {
mime = curl_mime_init(curl);
part = curl_mime_addpart(mime);
curl_mime_name(part, "photo"); // имя параметра
curl_mime_filedata(part, image_path.c_str()); // путь к изображению
curl_easy_setopt(curl, CURLOPT_URL, upload_url.c_str());
curl_easy_setopt(curl, CURLOPT_MIMEPOST, mime);
// Отправка запроса
res = curl_easy_perform(curl);
// Получаем ответ от сервера
std::string readBuffer;
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &readBuffer);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, NULL);
curl_easy_cleanup(curl);
// Анализируем ответ для получения id фотографии
auto upload_response = nlohmann::json::parse(readBuffer);
std::string server = upload_response["server"];
std::string photo = upload_response["photo"];
std::string hash = upload_response["hash"];
// 3. Сохраняем фотографию
std::string save_url = "https://api.vk.com/method/photos.saveWallPhoto?access_token=" + access_token +
"&user_id=" + user_id + "&server=" + server + "&photo=" + photo + "&hash=" + hash + "&v=5.130";
std::string save_response = vk_api_request(save_url);
auto save_json_response = nlohmann::json::parse(save_response);
// Получаем id загруженной фотографии
std::string photo_id = save_json_response["response"][0]["id"];
return photo_id; // Возвращаем ID фотографии
}
return "";
}
// Пример функции основного потока
void send_message_with_photo(const std::string& access_token, const std::string& user_id, const std::string& image_path, const std::string& message) {
// Загружаем изображение и получаем его ID
std::string photo_id = upload_image_to_vk(access_token