SHARE
TWEET

php curl CURLOPT_COOKIEFILE CURLOPT_COOKIEJAR

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