我会在开头说我仍然是一个新的 C/C++ 程序员,所以请原谅我提出的问题可能是多余的。
我正在用 C/C++ 编写一个程序来与此网站交互:http://www.youtube-mp3.org/ 。
据我了解,要让我的程序为我下载链接,我必须向包含我要转换的 URL 的服务器发送 POST 请求,然后找到一种方法让它遵循该 URL生成后允许我下载该文件。我还了解到 libcurl 是在 C/C++ 中执行此类操作的好方法。
我尝试使用 libcurl 网站上的 POST 示例(http://curl.haxx.se/libcurl/c/simplepost.html 和其他),但似乎都不起作用。此外,我不确定如何让我的程序跟随显示的链接 'Download' 。我尝试发送 POST 请求,然后告诉我的程序获取页面的 html 源并将其存储在文件中,但该文件似乎不包含任何下载链接。当通过浏览器完成此操作时,页面源肯定包含一个有效的下载链接。
非常感谢一些帮助,因为我不确定我是否有完全错误的想法!
编辑:我的问题根本不是很清楚。以下是我用于 POST 请求的相关代码:
static const char *postthis="http://www.youtube.com/watch?v=KMU0tzLwhbE";
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://www.youtube-mp3.org/");
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postthis);
curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, (long)strlen(postthis));
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res));
}
将 html 源写入文件:
static size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
{
int written = fwrite(ptr, size, nmemb, (FILE *)stream);
return written;
}
{
static const char *filename = "head.txt";
FILE *htmlfile;
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
// open the file
htmlfile = fopen(filename,"w");
if (htmlfile == NULL) {
curl_easy_cleanup(curl);
return -1;
}
curl_easy_setopt(curl,CURLOPT_WRITEDATA, htmlfile);
curl_easy_perform(curl);
/* close the header file */
fclose(htmlfile);
/* always clean up */
curl_easy_cleanup(curl);
}
最佳答案
您的代码不起作用,因为您一开始就假设了错误的逻辑。
http://www.youtube-mp3.org
不使用 POST
,事实上,它的下载表单甚至不提交到服务器端 URL全部。当您单击“转换视频”按钮时,将调用客户端 JavaScript 来处理输入的 URL、从 YouTube 下载相关信息,并修改调用页面的 HTML 以显示实际的下载链接和视频预览图像。这就是为什么当您仅检索 HTML 时看不到下载链接的原因 - 您没有调用执行准备下载链接的实际工作的 JavaScript。而且您将无法从应用程序中执行此操作(无需大量额外工作),它必须在具有真正的 JavaScript 引擎和用于脚本操作的真实 DOM 的 Web 浏览器内完成。
关于c++ - 使用 libcurl 进行 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26127707/