@ainur2015
Программист PHP, КиберСпортсмен

C++ VK API пытаюсь отправить сообщение с фото?

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"
Что в таком случае делать?
  • Вопрос задан
  • 28 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы