2015-04-21 2 views
0

Я пытаюсь использовать cURL, чтобы одновременно сохранять изображение в файл, а также возвращать заголовки, которые были возвращены при загрузке этого файла для сохранения.PHP cURL для одновременного сохранения изображения и получения ответа заголовка

Причина в том, что существует уникальный cookie, который создается каждый раз, когда изображение загружается и/или сохраняется, поэтому, если я сохраню файл и затем сделаю другой запрос на тот же URL-адрес изображения, чтобы получить файл cookie, cookie не будет надлежащим образом сопряжен с изображением, которое было сохранено (это изображение captcha).

Изображение может быть загружен только один раз, и на этой одной загрузке изображения он должен быть сохранен (без повторного запроса изображения с сервера) и одновременно показать заголовки, так что я могу получить печенье который был создан при загрузке &, сохраняя изображение.

Это то, что у меня есть до сих пор, которое возвращает заголовок и сохраняет файл, но файл поврежден, если рассматривать его как .jpg. если я изменил filetype на .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, который «привязан» к тексту внутри изображения. Если вы перезагрузите изображение или сделаете новый запрос на тот же URL-адрес, создайте новый файл cookie & «пара».

Так что мне нужно загрузить это изображение один раз и сохранить его в файл, одновременно захватив заголовки (так как именно тот файл cookie, который «привязан» к этому конкретному изображению), при этом обязательно запрашивать только изображение время.

+0

Ответ, который я написал ранее, не работал, я все еще пытаюсь понять это, просто чтобы убедиться, что вы хотите сохранить заголовки RESPONSE в файл, не так ли? по этому пути, вы знаете этот сайт https://anti-captcha.com/? Я использую его, и он работает. –

+0

Нет, я хочу сохранить изображение в файл, одновременно создавая заголовки, которые были возвращены при загрузке этого изображения, доступного для остальной части скрипта. Это изображение, которое нужно сохранить в файле. – Learning

+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);, то нам просто нужно расколоть header и body, сделать preg_match, чтобы найти cookie в header и очистить и сохранить body (изображение) в файл.

+0

добро пожаловать! –

Смежные вопросы