Запрос на отправку PHP с помощью cURL и cookie

Я пытаюсь сделать запрос на веб-страницу, которая требует входа. Я успешно беру файл cookie с SESSID и записываю его в файл с завитком:

$username = 'xxx'; $password = 'xxxxxxx'; $url = 'http://example.com'; $cookie="cookie.txt"; $postdata = "username=$username&userpass=$password&autologin=1&userlogin=Login"; $ch = curl_init(); curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6"); curl_setopt ($ch, CURLOPT_TIMEOUT, 60); curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 0); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie); curl_setopt ($ch, CURLOPT_REFERER, $url); curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata); curl_setopt ($ch, CURLOPT_POST, 1); $result = curl_exec ($ch); curl_close($ch); 

Теперь после этого я хочу сделать POST-запрос на сайт с файлом cookie, чтобы он распознал меня как зарегистрированный. Он использует API, который возвращает информацию JSON, если вы запрашиваете: site.com/API/command.get(x) – просто пример. Поэтому, если вы открываете это в браузере, он возвращает данные JSON.

Может ли кто-нибудь помочь мне способом, как это сделать? Я новичок в завитках.

Независимо от того, что я пытаюсь, я перенаправляюсь на страницу входа. Пытался пройти curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie); , никакого успеха.

Я считаю проблематичным кукурузу кукурузы, поэтому я написал свою собственную рутину. Есть и другие случаи, когда мне нужно добавлять файлы cookie со страницы.
Для этого CURLOPT_HEADER должен быть правдой.

  curl_setopt($ch, CURLOPT_HEADER, true); $data = curl_exec($ch); $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); $requestHeader= substr($data,0,$skip); $data = substr($data,$skip); $e = 0; while(true){ $s = strpos($requestHeader,'Set-Cookie: ',$e); if (!$s){break;} $s += 12; $e = strpos($requestHeader,';',$s); $cookie = substr($requestHeader,$s,$e-$s) ; $s = strpos($cookie,'='); $key = substr($cookie,0,$s); $value = substr($cookie,$s); $cookies[$key] = $value; } в  curl_setopt($ch, CURLOPT_HEADER, true); $data = curl_exec($ch); $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); $requestHeader= substr($data,0,$skip); $data = substr($data,$skip); $e = 0; while(true){ $s = strpos($requestHeader,'Set-Cookie: ',$e); if (!$s){break;} $s += 12; $e = strpos($requestHeader,';',$s); $cookie = substr($requestHeader,$s,$e-$s) ; $s = strpos($cookie,'='); $key = substr($cookie,0,$s); $value = substr($cookie,$s); $cookies[$key] = $value; } 

Затем, чтобы использовать $ cookies []:

  $cookie = ''; $show = ''; $delim = ''; foreach ($cookies as $k => $v){ $cookie .= "$delim$k$v"; $delim = '; '; } 

Затем используйте $ cookie:

 curl_setopt($ch, CURLOPT_COOKIE, $cookie ); 

Когда возникают проблемы, я часто устанавливаю FOLLOWLOCATION в false:

 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 

Если есть перенаправление, вы можете увидеть, что происходит, и вам нужно получить файлы cookie, установленные в заголовке ответа перенаправленного URL-адреса, тогда для параметра FOLLOWLOCATION должно быть установлено значение false.

Когда URL-адрес curl приведет вас к перенаправлению curl_getinfo вы получите URL-адрес для перенаправления.

 $status = intval(curl_getinfo($ch,CURLINFO_HTTP_CODE)); if ($status > 299 && $status < 400){ $url= curl_getinfo($ch,CURLINFO_REDIRECT_URL ); } // update cookies, do not clear `cookies()`; 

Когда это становится жестким, я использую эти параметры для получения заголовков ответов и ответов. Заголовок ответа будет возвращен в данных curl_exec() . Заголовок запроса будет возвращен curl_getinfo()

 curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $request); curl_setopt($ch, CURLINFO_HEADER_OUT, true); curl_setopt($ch, CURLOPT_HEADER, true); $data = curl_exec($ch); if (curl_errno($ch)){ $data .= 'Retreive Base Page Error: ' . curl_error($ch); } else { $info = rawurldecode(var_export(curl_getinfo($ch),true)); $data = curl_exec($ch); $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); $requestHeader= substr($data,0,$skip); $data = substr($data,$skip); $filename = parse_url($url, PHP_URL_HOST); $filename .= parse_url($url, PHP_URL_PATH) . '.txt'; $fp = fopen($filename,'w'); fwrite($fp,$info\n$data"); fclose($fp); $data = substr($data,$skip); } о curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $request); curl_setopt($ch, CURLINFO_HEADER_OUT, true); curl_setopt($ch, CURLOPT_HEADER, true); $data = curl_exec($ch); if (curl_errno($ch)){ $data .= 'Retreive Base Page Error: ' . curl_error($ch); } else { $info = rawurldecode(var_export(curl_getinfo($ch),true)); $data = curl_exec($ch); $skip = intval(curl_getinfo($ch, CURLINFO_HEADER_SIZE)); $requestHeader= substr($data,0,$skip); $data = substr($data,$skip); $filename = parse_url($url, PHP_URL_HOST); $filename .= parse_url($url, PHP_URL_PATH) . '.txt'; $fp = fopen($filename,'w'); fwrite($fp,$info\n$data"); fclose($fp); $data = substr($data,$skip); } 

Оба заголовка и HTML хранятся в файле. Затем вы можете просматривать HTTP-заголовки, HTML и JavaScript. Иногда файлы cookie устанавливаются JavaScript document.cookie, или страница, перенаправленная с помощью window.location, или кнопка отправки формы HTML, нажата с помощью JS. В этих случаях может потребоваться очистить файлы cookie и / или перенаправить местоположение из данных завитка.


Затем я использую FireFox Inspector или Chrome Development Tool.

Я перехожу на вкладку «Сеть»

В FireFox я перехожу к настройкам и включаю «Включить постоянные журналы»,
В Chrome я нажимаю «Сохранить журнал» на вкладке «Сеть»

Затем я использую Браузер, чтобы идти туда, куда я хочу зависнуть.

Теперь я вижу каждый запрос и ответ, включая перенаправления и сравнение их с заголовками сохранения.


Когда вам нужен заголовок, чтобы он выглядел точно так же, как и сохраненные заголовки браузера:

Создайте массив для размещения значений ключа заголовка запроса
Заполните массив Request именно тем, что находится в заголовке запроса вашей загрузки.
ПРИМЕР:

 $request = array(); $request[] = "Host: www.example.com"; $request[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; $request[] = "User-Agent: MOT-V9mm/00.62 UP.Browser/6.2.3.4.c.1.123 (GUI) MMP/2.0"; $request[] = "Accept-Language: en-US,en;q=0.5"; $request[] = "Connection: keep-alive"; $request[] = "Cache-Control: no-cache"; $request[] = "Pragma: no-cache"; 

Добавить в завиток:

 curl_setopt($ch, CURLOPT_HTTPHEADER, $request); 

Много раз гораздо проще использовать мобильную версию. Много раз для версии настольной версии требуется JavaScript, а в мобильной версии этого нет. Я использую FireFox с помощью переключателя пользовательского агента, используя старый пользовательский агент Motorola для извлечения заголовков и HTML. Затем я использую один и тот же пользовательский агент в HTTPHEADER :

 request[] = 'User-Agent: MOT-V9mm/00.62 UP.Browser/6.2.3.4.c.1.123 (GUI) MMP/2.0 

Спасибо, ребята, за ваши намеки. Как я получил это работает с этим кодом (я на самом деле использовал неправильные данные сообщения):

 $username = 'xxx'; $password = 'xxxx'; $url = 'http://example.com'; //request to the page i want the content from $cookie="cookie.txt"; $url1 = "http://example.com/command.."; //login form action url $postinfo = "act=login&login=$username&pass=$password"; $cookie_file_path = "cookie.txt"; $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_NOBODY, false); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file_path); //set the cookie the site has for certain features, this is optional curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file_path); curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_REFERER, $_SERVER['REQUEST_URI']); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $postinfo); $result = curl_exec($ch); //var_dump($result); //page with the content I want to grab curl_setopt($ch, CURLOPT_URL, $url1); //do stuff with the info with DomDocument() etc $html = curl_exec($ch); var_dump($html); curl_close($ch); 

Я получил этот код где-то здесь (stackoverflow). Спасибо парню, который опубликовал его! не помните точное имя. Это работает как шарм!

Может быть, вы попробуете жрать ? Я написал прокси-сервер для некоторых игровых движков, и у меня возникла аналогичная проблема с файлами cookie.

Важно : я не нашел простого способа манипулирования куками в стиле ключевого слова. Итак, что касается меня, это решение ближе к взлому, чем решение. Я склеил печенье в строку:

 foreach ($request->cookies as $key => $cookie) { $cookie_str .= $key .'='.$cookie . '; } 

И мое решение выглядит так:

 $client = new GuzzleHttp\Client([ 'headers' => [ 'Cookie' => $cookie_str ] ]); $reqv = $client -> createRequest('POST', 'some_url'); $resp = $client -> send($reqv);