当前位置: 首页 > 知识库问答 >
问题:

使用cURL脚本(php)复制img时出错

姚星河
2023-03-14

我做了一个很简单的用户脚本:
当我浏览网页时,我可以在一次点击中“书签”任何图像
我的用户脚本

  1. 抓住img src
  2. 抓取网页的url
  3. 复制. jpg. png. gif到我的服务器

一切都很完美,但在某些情况下,脚本无法复制文件
实际上,该文件已创建,但不包含img数据,它仅包含错误网页的内容:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /data/x/xxx_xxx_x.jpg on this server.</p>
<p>Additionally, a 403 Forbidden
error was encountered while trying to use an ErrorDocument to handle the request.</p>
<hr>
<address>Apache Server at xxxxxxxx.net Port 80</address>
</body></html>

“复制”代码(php):

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, $urlimg); 
curl_setopt($ch, CURLOPT_HEADER, false); 
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
set_time_limit(300); # 5 minutes for PHP 
curl_setopt($ch, CURLOPT_TIMEOUT, 300); # and also for CURL 
$path = $dirpix.'/'.$aa.'/'.$mm;
if ( ! is_dir($path)) {
    mkdir($path);
}
$outfile = fopen($path.'/'.$id.'.'.$ext, 'wb'); 
curl_setopt($ch, CURLOPT_FILE, $outfile); 
curl_exec($ch); 
fclose($outfile); 
curl_close($ch); 

也许网站阻止了这种“复制”脚本?谢谢

共有3个答案

诸葛立果
2023-03-14

要获得正确的工作,请添加

$agent= 'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11';

curl_setopt($ch, CURLOPT_USERAGENT, $agent);
潘雅珺
2023-03-14

试试下面的代码它在我的服务器工作正常。

<?php

$img[]='http://i.indiafm.com/stills/celebrities/sada/thumb1.jpg';
$img[]='http://i.indiafm.com/stills/celebrities/sada/thumb5.jpg';

$path="images/";


foreach($img as $i){
    save_image($i, $path);
    if(getimagesize($path.basename($i))){
        echo '<h3 style="color: green;">Image ' . basename($i) . ' Downloaded OK</h3>';
    }else{
        echo '<h3 style="color: red;">Image ' . basename($i) . ' Download Failed</h3>';
    }
}

//Alternative Image Saving Using cURL seeing as allow_url_fopen is disabled - bummer
function save_image($img,$fullpath='basename'){
    if($fullpath!='basename'){
        $fullpath = $fullpath.basename($img);
    }
    $ch = curl_init ($img);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_BINARYTRANSFER,1);
    $rawdata=curl_exec($ch);
    curl_close ($ch);
    if(file_exists($fullpath)){
        unlink($fullpath);
    }
    $fp = fopen($fullpath,'x');
    fwrite($fp, $rawdata);
    fclose($fp);
}
长孙阳成
2023-03-14

我能想到的两件事是,

>

  • 将用户代理设置为curl请求。因为从您所说的,您可以查看图像,但是curl得到了403错误,很可能是服务器端的userAgent过滤。

    添加裁判到您的卷曲请求。您可以将用户脚本中的推荐人信息发送到php脚本。您必须发布或获取window.location.href的值。

  •  类似资料:
    • 嗯,我在linux系统上安装时遇到问题。我遵循了digital ocean的所有指示。之后,我在浏览器中验证它,然后它显示这种。我在安装过程中遗漏了什么吗?我的php版本是7,我使用的是ubuntu 14.04。

    • 当我试图使用执行PHP脚本时,它不起作用。 在错误日志文件中显示: PHP警告:shell_exec()[function.shell exec]:无法执行'PHP/home/snabsam/public_html/。。。。。 系统 Centos shell_exec与clamscan配合使用 与clamav的功能配合使用 但它没有执行PHP脚本 我检查过的东西: PHP是off 不存在于在php

    • 我有一个终端卷曲命令可以正常工作 curl-H“内容类型:application/json”--cert cert.p12:myPassword-X POST-d'myJsonData'https://api-applecareconnect-ept.apple.com/enroll-service/1.0/bulk-enroll-devices 我已将命令转换为如下所示: 但我收到错误“访问被拒

    • 我正在尝试将php与firebase结合使用 安装软件包“composer require kreait/firebase php^4.0”后 调整我的火力基地 它向我显示了错误: 致命错误:未捕获错误http\Exception\ConnectException:cURL错误35:OpenSSL SSL\u connect:SSL\u error\u连接到ff64t的系统调用。firebasei

    • 我已经在我的系统中安装了python、pip和selenium,我正在基本站点上测试一个示例代码。 代码: 如何解决此问题?

    • 问题内容: 我想知道是否有可能告诉bash 分别对stdout / stderr的所有调用或随后的后续调用? 一种快速而又肮脏的解决方案是编写自己的printf实现,并使用它代替内置的任何实现,但是在我看来,我可能不需要这样做。 我正在编写同时运行的多个构建脚本,出于调试的需要,我 确实 需要查看它们按顺序编写的消息。 问题答案: 如果命令使用stdio并连接到终端,则会按行刷新它们。否则,您需要