c++ - 使用 libcurl 进行 POST 请求

标签 c++ c post libcurl

我会在开头说我仍然是一个新的 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/

相关文章:

jquery - Ajax 发布到 Controller 操作跨域

c++ - C++0x 中高阶函数和 lambda 的问题

c++ - C++ 的简单 JSON 字符串转义?

c++ - OpenCVs LineIterator 在 MATLAB 中的等价物

c - 对字符串进行最大和最小排序

c - 无法确定 C 代码输出的原因

c - MPI_Aint 的大小?

php - 使用 Luracast ReSTLer——在正文中将 POST 变量作为 JSON 传递

php - 使用jQuery发布时从函数获取数据

c++ - 如果类型在命名空间中,QMetaObject::newInstance 会失败