Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- header('Content-Type: text/html; charset=windows-1251'); // это для нормального вывода
- function curl($url, $post_data=false, $referer = false){
- $ch = curl_init();
- curl_setopt($ch, CURLOPT_URL,$url);
- curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:')); // убирает проблему "HTTP/1.1 100 Continue", когда нам в ответе приходит первый дополнительный заголовок "Expect: 100-continue" который с одной стороны позволяет библиотеке узнать что соединение еще не сброшено, с другой - мешает нам нормально поделить ответ на заголовок. фактически здесь мы устанавливаем пустое значение этому заголовку запроса, тем самым перетирая дефолтное значение библиотеки и убираем его
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
- curl_setopt($ch, CURLOPT_HEADER, true);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1');
- curl_setopt($ch, CURLOPT_COOKIEFILE, getcwd()."/cookies.txt"); // с какого файла считываю куки
- curl_setopt($ch, CURLOPT_COOKIEJAR, getcwd()."/cookies.txt"); // в вкакой файл сохранаять куки, желательно указывать полный абсолютный путь к фалу, потому что по дефолту используется корневая папка сервера Apache. ну и само собой на файлы должны быть права записи(в виндовсе это не так важно)
- if($post_data!==false){// если указанные POST параметр - устанавливаем тип запрса POST и передаем параметры
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
- }
- curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); // не следовать за перенаправдением(потому что в данном случае кикисы нужно сграбить с той странички, которая перенаправляет, что не очень удобно)
- if($referer!==false) {
- curl_setopt($ch, CURLOPT_REFERER, $referer);
- }
- if(strpos($url, 'https')!==FALSE) {
- curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
- curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
- }
- $response = curl_exec ($ch);
- // print_r($response);
- list($header, $body) = explode("\r\n\r\n", $response, 2);// не использовать curl_getinfo($ch, CURLINFO_HEADER_SIZE); для определения размера заголовка - это значение может быть неверным. с другой стороны использованный подход для разделения ответа на заголовок и тело гарантированно протоколом http
- $ansv = array("body"=>$body, "url"=>$url);
- if(preg_match('/Location: (.+)/i', $header, $res) ){
- $ansv['location']= trim($res[1]);
- }
- return $ansv;
- }
- // пример использования на сайте http://codepad.org/users/msangel
- $login = "";
- $password = "";
- // логинимся, чтоб получить куки
- $first =curl("http://codepad.org/login",array("username" => $login, "password"=>$password, "submit"=>"Login"),"http://codepad.org/login");
- if(!($first['location']=="http://codepad.org/login")){
- // задержка чтоб не подумали что мы - бот
- sleep (2);
- $third = curl("http://codepad.org/",array(
- "lang"=>"PHP",
- "code"=>"<?php\necho \"this is script generated code\";\n?>\n",
- "run"=>"True",
- "submit"=>"Submit"
- ),"http://codepad.org/login");
- // снова задержка
- sleep (2);
- // сохраняем запись в списке записей
- curl($third['location']."/save",false,$third['location']);
- // еще задержка
- sleep (2);
- // просто получаем и выводим
- $last=curl($third['location']);
- echo $last['body'];
- } else {
- die("login failed");
- }
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement