【问题标题】:Save image using cURL使用 cURL 保存图像
【发布时间】:2020-04-16 09:03:45
【问题描述】:

这是一个指向图片的 URL:

https://www.somesite.com/some/dir/jsp/data.jsp?KEY=12155&TYPE=jpg&qi=R7SWtM5F5PL4cDDFfdfpIrqIWSY3gr2XGQg=

如果我在 CLI 中使用 cURL 作为这个命令,我会得到图像:

/usr/bin/curl -o 1234.jpg 'the_url_to_image'

我需要在 PHP 中使用带有参数的 cURL。 试了几个参数来获取图片,总是报403错误

对指定资源的访问已被禁止。 Apache Tomcat

我的参数(只有cURL参数,这里没有写图片到文件的代码):

 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL, $img_url);
 curl_setopt($ch, CURLOPT_VERBOSE, 1);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_AUTOREFERER, false);
 curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
 curl_setopt($ch, CURLOPT_HEADER, 0);
 curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36');
 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
 curl_setopt($ch, CURLOPT_COOKIEJAR,$cookie_filename);
 curl_setopt($ch, CURLOPT_COOKIEFILE,$cookie_filename);
 $page_content  = curl_exec($ch);
 curl_close($ch);

编辑

如果我将图像 URL 提供给此页面:

onlinecurl.com

我得到了图像二进制文件,但没有错误消息。

所以图片可以用cURL保存,我只需要把curl_setopt设置好就行了。

编辑

通过在 CLI 中运行 a 命令将图像保存到本地路径

/usr/bin/curl -o 1234.jpg 'the_url_to_image'

使用

运行相同的命令时

shell_exec("/usr/bin/curl -o 1234.jpg 'the_url_to_image'")

错误信息保存在 1234.jpg 文件中。

同一命令的命令行和代码执行有什么区别?

【问题讨论】:

  • 可能类似于file_put_contents('save path here', file_get_contents('url here', 'create curl stream context here'))
  • @user3783243 对于file_get_contents('image_url'),我得到了同样的 403 错误
  • 使用 curl_file_create 函数php.net/manual/en/curlfile.construct.php

标签: php curl libcurl


【解决方案1】:

你可以试试添加

curl_setopt($ch, CURLOPT_POST, 0);

如果这不起作用,您必须添加 Apache Tomcat 在您的 web.xml 中:

<login-config>
  <auth-method>BASIC</auth-method>
</login-config>

【讨论】:

  • 服务器使用java,我够不着,我用php,没有web.xml文件。
【解决方案2】:

同一命令的命令行和代码执行有什么区别?

您的用户代理甚至还没有关闭:

curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36');

尝试将其设置为真正的 curl-cli 用户代理,例如

curl_setopt($ch,CURLOPT_USERAGENT,'curl/7.63.0');

curl_setopt($ch,CURLOPT_USERAGENT,'curl/'.(curl_version()['version']));

这种情况很少见,但有可能(甚至有证据表明)他们正在使用用户代理白名单,而 Google Chrome(或者是 Safari?)不在他们的白名单上,但 curl-cli 是。 ..

另一种可能的解释是,他们试图检测并阻止在他们的用户代理上撒谎的人,并且很容易检测到您在撒谎:您(错误地)说你是 Safari 或 Chrome,它们总是发送Acccept-Encoding: gzip/deflate/whatever,但你的 curl 请求没有(因为你没有使用 CURLOPT_ENCODING),因此很容易检测到你的用户代理是假的,也许这就是导致堵塞。无论哪种方式,请尝试使用真正的 curl 用户代理。

【讨论】:

  • 我尝试将 CURLOPT_USERAGENT 设置为 curl 或 Mozzila 并设置 CURLOPT_ENCODING 但仍然无法正常工作。可能他们对解析有一些保护,但是命令行版本正在运行,所以我一定缺少一些设置。
  • @Szekelygobe 不要设置为 mozilla,设置为 curl/7.63.0
  • @Szekelygobe ... 在这种情况下,像stackoverflow.com/a/55829622/1067003 中解释的那样设置一个netcat服务器并比较curl cli程序和php脚本之间的区别,它们有什么区别?
  • 我尝试用shell_exec()执行/usr/bin/curl -o 1234.jpg 'the_url_to_image'命令,保存图片失败,返回同样的错误。
  • 我用netcat 测试了浏览器请求,并重组了cURL 请求以完全模仿浏览器的请求,但仍然没有成功...
【解决方案3】:

401 未经授权

403 被禁止

这些描述得很糟糕。

401 真的意味着没有认证

403 真的意味着没有授权

如果这确实是一个受保护的资源,需要登录才能获取它,那么这意味着是的,服务器识别你(你没有得到 401),但你没有所需的权限(403 )。

另一方面,如果图像确实是公开的,则实际粘贴链接可以帮助我们为您提供帮助。

【讨论】:

  • 确保包含查询参数,如果从 url 中删除最后一个参数,则会得到 403
  • 你保存了图片?我对 cURL 使用与上一条评论中相同的 url。我每次都得到 403。
【解决方案4】:

事实证明问题很简单。

-第一个线索是终端中的命令正在运行,但与 shell_exec() 相同的命令返回错误。

-第二条线索是 delboy1978uk 提到的错误不是 401 未验证,而是 403 未授权

所以 URL 或参数肯定有问题。 我打印了网址,但没有发现错误...... 长话短说,问题出在 URL 中的特殊字符上。当我打印 URL 时,浏览器正确地显示了 &amp;amp; 字符,而不是函数将它作为参数 &amp;amp;

因此,如果我在运行命令之前将 URL 提供给 htmlspecialchars_decode(),那么它可以完美运行。

所以要注意网址中的特殊字符!

【讨论】:

    猜你喜欢
    • 2015-06-13
    • 2011-09-22
    • 1970-01-01
    • 2022-10-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多