SHARE
TWEET

php curl session

msangel Feb 24th, 2013 48 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <?php
  2. header('Content-Type: text/html; charset=windows-1251'); // это  для нормального вывода
  3.  
  4. function curl($url, $post_data=false, $referer = false, $cookies=false){
  5.  
  6. $ch = curl_init();
  7. curl_setopt($ch, CURLOPT_URL,$url);
  8. curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); // убирает проблему "HTTP/1.1 100 Continue", когда нам в ответе приходит первый дополнительный заголовок "Expect: 100-continue" который с одной стороны позволяет библиотеке узнать что соединение еще не сброшено, с другой - мешает нам нормально поделить ответ на заголовок. фактически здесь мы устанавливаем пустое значение этому заголовку запроса, тем самым перетирая дефолтное значение библиотеки и убираем его
  9. curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
  10. curl_setopt($ch, CURLOPT_HEADER, true);
  11. curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  12. curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1');
  13.  
  14. if($post_data!==false){// если указанные POST параметр - устанавливаем тип запрса POST и передаем параметры
  15.   curl_setopt($ch, CURLOPT_POST, true);
  16.   curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
  17. }
  18.  
  19. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); // не следовать за перенаправлением(потому что в данном случае кукисы нужно сграбить с той странички, которая перенаправляет, что не очень удобно)
  20.  
  21. if($cookies!==false){ // если они у нас есть
  22.   curl_setopt($ch, CURLOPT_COOKIE, $cookies); // то устанавливаем куки
  23. }
  24.  
  25. if($referer!==false) {
  26.   curl_setopt($ch, CURLOPT_REFERER, $referer);
  27. }
  28. if(strpos($url, 'https')!==FALSE) {
  29.   curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
  30.   curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
  31. }
  32.  
  33. $response = curl_exec ($ch);
  34. // print_r($response)
  35. list($header, $body) = explode("\r\n\r\n", $response, 2);// не использовать curl_getinfo($ch, CURLINFO_HEADER_SIZE); для определения размера заголовка - это значение может быть неверным. с другой стороны использованный подход для разделения ответа на заголовок и тело гарантированно протоколом http
  36.  
  37. $ansv = array("body"=>$body, "url"=>$url);
  38. if(preg_match_all('|Set-cookie: (.*);|iU', $header, $res)>0){ // используем регулярное выражение для того, чтоб вытащить кукисы из заголовка ответа
  39.   if(!empty($res[1])){ // здесь внимательно. у разных сайтов может быть разное количество куки. у меня оно одно, поэтому я просто беру первый елемент масива
  40.   $cookies=$res[1][0];
  41.   $ansv['cookies']=$cookies;
  42.   }
  43. }
  44.  
  45. if(preg_match('/Location: (.+)/i', $header, $res) ){
  46. $ansv['location']= trim($res[1]);
  47. }
  48.  
  49. return $ansv;
  50.  
  51. }
  52.  
  53.  
  54. // пример использования на сайте http://codepad.org/users/msangel
  55. $login = "";
  56. $password = "";
  57.  
  58. // логинимся, чтоб получить куки
  59. $first =curl("http://codepad.org/login",array("username" => $login, "password"=>$password, "submit"=>"Login"),"http://codepad.org/login");
  60. if(isset($first['cookies'])){ // если куки есть то все ок, можно работать дальше
  61. $cookie = $first['cookies'];
  62.  
  63. // задержка чтоб не подумали что мы - бот
  64. sleep (2);
  65.  
  66. // постим запись
  67. $third = curl("http://codepad.org/",array(
  68. "lang"=>"PHP",
  69. "code"=>"<?php\necho \"this is script generated code\";\n?>\n",
  70. "run"=>"True",
  71. "submit"=>"Submit"
  72. ),"http://codepad.org/login",$cookie);
  73.  
  74. // снова задержка
  75. sleep (2);
  76.  
  77. // сохраняем запись в списке записей
  78. curl($third['location']."/save",false,$third['location'],$cookie);
  79.  
  80. // еще задержка
  81. sleep (2);
  82.  
  83.  
  84. // просто получаем и выводим
  85. $last=curl($third['location']);
  86. echo $last['body'];
  87. } else {
  88. die("ошибка авторизации");
  89. }
  90.  
  91. ?>
RAW Paste Data
Top