2014-09-30 112 views
-2

我会在前言中说我仍然是一名新的C/C++程序员,请原谅我可能是一个多余的问题。使用libcurl进行POST请求

我正在用C/C++编写程序来与本网站进行交互:http://www.youtube-mp3.org/

根据我的理解,为了让我的程序为我下载一个链接,我将不得不向包含我想要转换的URL的服务器发送一个POST请求,然后找到让它跟随URL的方式这是生成的,允许我下载文件。我也明白,libcurl是在C/C++中做这种事情的好方法。

我试过在libcurl网站上使用POST示例(http://curl.haxx.se/libcurl/c/simplepost.html和另一个),但似乎都没有工作。另外,我不确定如何让我的程序按照出现的说法链接'下载'。我试着发送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

您的问题的问题是,它最有可能与网络/ http问题有关。它不是关于C++和libcurl。我们没有机会帮助您提供所提供的信息。 – 2014-09-30 18:38:12

+0

嗨,欢迎来到SO,请客气一点,请阅读[本指南](http://stackoverflow.com/help/mcve)?在你的问题中加入相关的代码和信息,很可能你会得到满意的答案和很好的答案。 – 2014-09-30 18:38:52

+0

源代码中没有下载链接,但DOM树中有一个。结果部分是通过使用JavaScript操作DOM树(现在越来越少的网页是静态HTML)创建的。编写浏览器插件可能会更容易。 – molbdnilo 2014-09-30 18:59:44

回答

0

您的代码不工作,因为我们假定你是错误的逻辑首先。

http://www.youtube-mp3.org不使用POST,实际上它的下载表单甚至不提交给服务器端的URL。当您点击“转换视频”按钮时,会调用客户端JavaScript来处理输入URL,从YouTube下载相关信息并修改调用页面的HTML以显示实际的下载链接和视频预览图像。这就是为什么当你简单地检索HTML时你没有看到下载链接的原因 - 你没有调用执行准备下载链接的实际工作的JavaScript。而且你将无法通过应用程序(无需额外的工作)来完成该任务,它必须在具有真实JavaScript引擎和脚本操作的真实DOM的Web浏览器内部完成。

+0

非常感谢您的意见和指出我出错的地方。我一定会进一步研究这一点;我对这个网站的工作方式并不了解,所以我很想了解更多。 – darkefyre 2014-10-01 08:22:31