не удается скачать файл с помощью библиотеки curl, c++

я пытаюсь загрузить на компьютер фотографию, отправленную пользователем. Получаемая ссылка выходит рабочей. При открытии ее через браузер файл успешно скачивается, но при сохранении через код получаем файл с весом 0 КБ

часть кода, отвечающая за загрузку файла

// Функция для записи данных в файл
size_t write_data(void* ptr, size_t size, size_t nmemb, FILE* stream) {
    size_t written = fwrite(ptr, size, nmemb, stream);
    return written;
}

{
 userData.photoUrl = "https://api.telegram.org/file/bot" + bot.getToken() + "/" + filePath;
 std::cout << userData.photoUrl;

 CURL* curl = curl_easy_init();
 FILE* file = fopen("file.jpg", "wb");
 curl_easy_setopt(curl, CURLOPT_URL, userData.photoUrl);
 curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
 curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);

 curl_easy_perform(curl);
 curl_easy_cleanup(curl);
 fclose(file);
}

Ответы (2 шт):

Автор решения: S.H.

Думаю, что подводных камней - два:

Токен. Если Вы уверены в том, что токен - валидный, то можно этот пункт игнорировать.

HTTP - заголовки. Дело в том, что curl - штука довольно тупая, работающая по принципу "вот что мне сказали - то я и делаю".

Если Вы включите отладку в браузере, иил используете что то типа wireshark для того, чтобы увидеть обмен между клиентом и сервером - Вы увидите, что в HTTP - заголовке запроса отправляется множество полей. И что curl этого не делает.

А на стороне сервера есть фильтр: в запросе есть необходимый набор полей? - окей, вот тебе файл. Нет набора? Извини, гуляй дальше.

Мне кажется, что чтобы достичь успеха - надо сначала научиться курлом выкачивать картинку изх команднйо строки, а потом уже "запрограммировать" это процесс на C++.

Вот статья о добавлении заголовков к запросу.

Картинка, которая иллюстрирует мои доводы:

Пара HTTP заголовков, без которых практически не обходится

→ Ссылка
Автор решения: purple_dr1pp

Я нашел способ проще без использования библиотеки cURL, ограничившись возможностями библиотеки tgbotcpp.

if (message->photo.empty()) {
    // Если фото не было отправлено, ничего не делаем
    return;
}


// Получаем ID фотографии с максимальным разрешением
std::string photoId = message->photo.back()->fileId;

// Получаем объект TgBot::Api
TgBot::Api api = bot.getApi();

// Получаем объект TgBot::File с информацией о файле
TgBot::File::Ptr fileInfo = api.getFile(photoId);
std::string filePath = fileInfo->filePath;

// Скачивание файла с помощью downloadFile
std::string fileContent = bot.getApi().downloadFile(filePath);

// Сохранение файла 
std::ofstream outputFile(userData.name + ".png", std::ios::binary); 
outputFile << fileContent;
outputFile.close();
→ Ссылка