Как отправить сообщение с фотографией через VK API на C++?

Какова структура и логика функции `upload_image_to_vk`, которая загружает изображение на сервер ВКонтакте, и какие основные шаги необходимо выполнить для её корректной работы?
  • 20 октября 2024 г. 22:22
Ответы на вопрос 1
Для отправки сообщения с фотографией через 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
Похожие вопросы