PHP cURL同时保存图像&获得标头响应

时间:2015-04-21 21:48:12

标签: php image curl cookies captcha

我正在尝试使用cURL同时将图像保存到文件,同时还返回加载该文件时要返回的标头以进行保存。

原因是因为每次加载和/或保存图像时都会生成一个唯一的cookie,所以如果我保存文件然后再向同一图像URL发出请求以获取cookie,则cookie将不会与保存的图像(它是验证码图像)进行适当的配对。

图片只能加载一次,并且在图片的单个加载中必须保存(而不从服务器重新请求图像)并同时显示标题,这样我就可以获得加载时生成的cookie。保存图像。

这是我到目前为止所做的,它会返回标题并保存文件,但是当查看为.jpg时文件已损坏。如果我将文件类型更改为.txt,我可以看到标题,但随后是一堆乱码,这些字符不是标题下面的图像。所以很明显,正在保存的文件是标题的组合,然后应该是图像,我只是无法单独获取它们,同时确保只有一个图像请求。

function getImageandCookie($ImageURL) {
    $rand = rand();
    $image_file = $_SERVER['DOCUMENT_ROOT'] . '/image/' . $GLOBALS['id'] . $rand . '.jpg';

    $fp = fopen ($image_file, 'w+');

    $ch = curl_init($ImageURL);

    curl_setopt($ch, CURLOPT_FILE, $fp);      
    curl_setopt($ch, CURLOPT_HEADER, 1);    
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);      
    curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36');

    $data = curl_exec($ch);

    curl_close($ch);
    fclose($fp); 
    return $data;
}

更多细节: 我正在尝试将图像保存到服务器上的文件中,同时制作在加载该图像时返回的标题,以便保存可用于我的其余脚本。

如果您加载此图片:http://ipv4.google.com/sorry/image?id=2125815723022350864&hl=en,您会看到创建的Cookie与图片中的文字“绑定”。如果您重新加载图片或向同一网址发出新请求,则需要新的Cookie和图像“对”已创建。

所以我需要一次加载该图像并将其保存到文件中,同时抓取标题(因为这是与该特定图像“绑定”的cookie),同时确保只请求图像一次

1 个答案:

答案 0 :(得分:1)

2小时后......

<?
//error_reporting(E_ALL);
//ini_set('display_errors', '1');

    $image_file = "captcha.jpg";
    //$cookie = "gcookie";

    $ch = curl_init("http://ipv4.google.com/sorry/image?id=2125815723022350864&hl=en");  
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    //curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
    //curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);      
    curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36');
    $data = curl_exec($ch);
    //split the header and body of request
    $matches = preg_split('/^\s*$/im', $data);
    $header = $matches[0];
    //extract cookie from header
    preg_match_all('/Set-Cookie: (.*?)\s+/i', $header, $gCookie, PREG_PATTERN_ORDER);
    $gCookie = $gCookie[1][0];
    echo $gCookie;
//GOOGLE_ABUSE_EXEMPTION=ID=a85908efa22e6f9b:TM=1429660423:C=c:IP=x.x.x.x-:S=APGng0vbHyNi1KCn9O1bnspO8BgF4LFEhQ;

    //The body is the image, we cleanup the header/body line break and save it
    $body = $matches[1] ;
    $body = implode("\n", array_slice(explode("\n", $body), 1));
    file_put_contents($image_file, $body);

curl_close($ch); 

理解当我们设置CURLOPT_HEADER, 1响应标头进入$data = curl_exec($ch);后,我们只需要拆分headerbody,这并不困难,执行preg_match查找cookie中的header并清理并将body(图片)保存到文件中。