我之前说过我还是一名新的C / C ++程序员,所以请原谅我可能是一个多余的问题。
我用C / C ++编写程序来与本网站进行交互:http://www.youtube-mp3.org/。
根据我的理解,要让我的程序为我下载链接,我必须向包含我要转换的URL的服务器发送POST请求,然后找到一种方法让它跟随生成的URL允许我下载文件。我也明白libcurl是用C / C ++做这种事情的好方法。
我已尝试在libcurl网站(http://curl.haxx.se/libcurl/c/simplepost.html和另一个网站上)使用POST示例,但似乎都不起作用。另外,我不知道如何让我的程序按照显示'下载' 的链接。我已经尝试发送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);
}
答案 0 :(得分:0)
您的代码不起作用,因为您假设错误的逻辑开始。
http://www.youtube-mp3.org
不使用POST
,实际上它的下载表格根本不提交到服务器端网址。当您点击"转换视频"按钮,调用客户端JavaScript以处理输入URL,从YouTube下载相关信息,以及修改呼叫页面的HTML以显示实际下载链接和视频预览图像。这就是为什么当您只是检索HTML时没有看到下载链接的原因 - 您没有调用执行准备下载链接的实际工作的JavaScript。而且你无法从一个应用程序中做到这一点(没有很多额外的工作),它必须在一个Web浏览器中完成,它有一个真正的JavaScript引擎和一个真正的DOM供脚本操作。