2015-05-07 2 views
4

У меня довольно странная проблема. У меня есть доступ к сайту (электронная почта и пароль). Извините, но я не могу показать этот сайт вам. Мне нужно получить некоторую информацию из ее содержимого. Вместо этого я покажу вам свой код.Curl возвращает пустую строку

//I form string of post request 
$fields=array(
    'name_of_login_field' => urlencode('[email protected]'), 
    'name_of_password_field' => urlencode('pass') 
); 
foreach($fields as $key=>$value) 
{ 
    $fields_string .= $key.'='.$value.'&'; 
} 
$fields_string=rtrim($fields_string, '&'); 

Затем отправлю его через завиток.

$curlURL="URL"; 
if($curl = curl_init()) 
{ 
    curl_setopt($curl, CURLOPT_URL, $curlURL); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST"); 
    curl_setopt($curl, CURLOPT_TIMEOUT, 10); 
    curl_setopt($curl, CURLOPT_HEADER, false); 
    curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string); 
    curl_setopt($curl, CURLOPT_USERAGENT, "mozilla/5.0 (ipad; cpu os 7_0_4 like mac os x) applewebkit/537.51.1 (khtml, like gecko) version/7.0 mobile/11b554a safari/9537.53"); 

    $out = curl_exec($curl); 
    var_dump($out); 
    //var_dump($out); 
    curl_close($curl); 
} 

Сайт имеет форму с двумя входами (логин-пароль). Также у него есть кнопка отправки с именем и скрытым вводом с именем - перенаправление. Если я установил google.com или наш сайт как $curCURL, я получаю строку его содержимого. Если я использую URL-адрес сайта, мне нужно разобрать, я получаю пустую строку. Как это возможно. Я прошу предложения. Может быть, кто-то встретил что-нибудь подобное?
UPDATE Вот мой свежий завиток:

if($curl = curl_init()) 
{ 
    curl_setopt($curl, CURLOPT_URL, $curlURL); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST"); 
    curl_setopt($curl, CURLOPT_TIMEOUT, 10); 
    curl_setopt($curl, CURLOPT_HEADER, false); 
    curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string); 
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); 
    curl_setopt($curl, CURLOPT_USERAGENT, "mozilla/5.0 (ipad; cpu os 7_0_4 like mac os x) applewebkit/537.51.1 (khtml, like gecko) version/7.0 mobile/11b554a safari/9537.53"); 

    $out = curl_exec($curl); 
    var_dump($out); 
    //var_dump($out); 
    curl_close($curl); 
} 

С этим завитком $out является false. Если я удаляю строку с CURLOPT_FOLLOWLOCATION$out, это пустая строка.
Update1 Я проверил

curl -l desired-site.com 

он вернулся только содержимое без заголовков. Затем я проверил

curl -s -D - desired-site.com -o /dev/null 

Он вернулся этот заголовок.

HTTP/1.1 200 OK 
Server: nginx/1.2.1 
Date: Thu, 07 May 2015 08:20:23 GMT 
Content-Type: text/html 
Transfer-Encoding: chunked 
Connection: keep-alive 
X-Powered-By: PHP/5.4.4-14+deb7u11 
Set-Cookie: PHPSESSID=randon_number_of_letters; expires=Sat, 09-May-2015 12:07:03 GMT; path=/ 
Expires: Thu, 01 Jan 1970 00:00:01 GMT 
Cache-Control: no-cache 
Pragma: no-cache 
Cache-Control: private 
Cache-Control: no-store, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Last-Modified: Thu, 01 Jan 1970 00:00:01 GMT 

Может ли это как-то помочь?
UPDATE2CURLOPT_VERBOSE дает те же результаты. Но когда я установил CURLOPT_HEADER истинно, я могу видеть заголовки (без последующего места, с ним до сих пор возвращает ложь)
Update3 я делать такие вещи, чтобы установить печенье:

preg_match('/PHPSESSID=([A-Za-z0-9]+)/',$out, $matches); 
$cookie="Cookie: PHPSESSID=".$matches[1]; 

, а затем добавить к скручиванию :

curl_setopt($curl1, CURLOPT_COOKIEFILE, $cookie); 
    curl_setopt($curl1, CURLOPT_COOKIEJAR, $cookie); 

Я сделал еще одно соединение: $curl1=curl_init() и я var_dump из $cookie и заголовки Быстродействие. PHPSESSID отличается от других. Я должен сделать, что @baf сказал в комментариях каким-то другим способом? (вам нужно будет открыть страницу формы, хранить куки, а затем публиковать ее с помощью печеньков)

+0

Видя, как это сделать с различались 3 URLs (Google, ваш и желанной), его будет трудно понять ошибку, не зная URL/сайт участвует. Является ли это допустимым доменным именем? Вы отказались от связи? Извините, если я неправильно понял ваш вопрос. – JohnDevelops

+0

Выстрел в темноте, но попробуйте использовать следующий 'curl_setopt ($ curl, CURLOPT_FOLLOWLOCATION, true);' –

+0

Возможно, вам следует следовать перенаправлению ('CURLOPT_FOLLOWLOCATION')? – baf

ответ

1

Это то, что я предложил в обсуждении в комментариях. Он хранит файлы cookie в файле и выполняет два запроса. Одна только открывает страницу формы и сохраняет файлы cookie в банке cookie. Второй запрос отправляет данные. Вы можете попробовать.

$jar = tempnam('/tmp', 'cookie'); // create temporary file 

$curl = curl_init($url_1); // open form page 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_COOKIEJAR, $jar); 
curl_exec($curl); 
curl_close($curl); 

$curl = curl_init($url_2); // post data 
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($curl, CURLOPT_POST, true); 
curl_setopt($curl, CURLOPT_POSTFIELDS, $fields_string); 
curl_setopt($curl, CURLOPT_HEADER, false); 
curl_setopt($curl, CURLOPT_COOKIEFILE, $jar); 
$out = curl_exec($curl); 
curl_close($curl); 

unlink($jar); // delete temporary file 
+0

Правильно. Обсуждение в комментариях и именно то, что вы мне помогли. Поэтому я одобрил ваш ответ. Но, как вы можете видеть, я делаю это по одному запросу (exec) и не использую cookiejar/ –

+0

@sergey. Отлично, что вы нашли решение. Хотя я немного удивлен, что установка фальшивого идентификатора сеанса ('900000jjsakjas') работает :) – baf

+0

мне очень помог *, (typo =)) Уверен, что он не работает с фальшивым идентификатором сеанса, я использовал его, например. –

0

Наконец, я сделал это. Я получил PHPSESSID с вкладки cookie chrome debugger. Затем я сделал следующее (просто отправьте cookie на URL-адрес):

if($curl = curl_init()) { 
    curl_setopt($curl, CURLOPT_URL, $curlURL); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER,true); 

    curl_setopt($curl, CURLOPT_COOKIE, "PHPSESSID=900000jjsakjas"); 
    $out = curl_exec($curl); 
    echo $out; 

    curl_close($curl); 
    } 

Это возвращает прекрасный результат.

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