За последние 24 часа нас посетили 16516 программистов и 1677 роботов. Сейчас ищет 901 программист ...

Новичок в CURL

Тема в разделе "PHP для новичков", создана пользователем MCTrane, 1 авг 2011.

  1. MCTrane

    MCTrane Активный пользователь

    С нами с:
    14 ноя 2009
    Сообщения:
    217
    Симпатии:
    0
    Я сейчас тренеруюсь работать с CURL. Ну и решил написать авто-регер для одного сайта. Конечно не полностью автоматический, т.к. капча там трудная. Каждый заход на эту страницу меняется капча. Я хочу сделать, чтобы пользователь вводил капчу, но не знаю как такое реализовать. Вот что у меня есть:
    PHP:
    1. <?php
    2. header('Content-type: text/html; charset=KOI8-R');
    3.  
    4. $ch = curl_init('http://rutube.ru/register.html');
    5. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    6. if(!isset($_POST['caph'])){
    7. $prs = curl_exec($ch);
    8. preg_match_all('/<img src="\/img\/code\.jpg\?[0-9]{7}" alt="Captcha" width="120" height="40" \/>/', $prs, $prs0);
    9. $prs0 = str_replace('<img src="/img/code.jpg?', "", $prs0[0][0]);
    10. $prs0 = str_replace('" alt="Captcha" width="120" height="40" />', "", $prs0);
    11. $cap = $prs0;
    12. echo "<img src='http://rutube.ru/img/code.jpg?$cap'>";
    13. echo "<form method=post><input name=caph type=text></form>";
    14. }else{
    15. $caph = $_POST['caph'];
    16. curl_setopt($ch, CURLOPT_POST, 1);
    17. curl_setopt ($ch, CURLOPT_USERAGENT, "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19");
    18. $headers = array
    19. (
    20.     'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    21.     'Accept-Language: ru,en-us;q=0.7,en;q=0.3',
    22.     'Accept-Encoding: gzip,deflate',
    23.     'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7',
    24. );
    25. curl_setopt($ch,CURLOPT_ENCODING,"");
    26. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  
    27. curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
    28. curl_setopt($ch, CURLOPT_REFERER, "http://rutube.ru/register.html");
    29. curl_setopt($ch, CURLOPT_POSTFIELDS, [email='rm=save&nick=zlosn&email=klickers-ru@yandex.ru]'rm=save&nick=zlosn&email=klickers-ru@yandex.ru[/email]&pass=curl_pass&cpass=curl_pass&word='.$caph.'&agree=y');
    30. curl_setopt($ch, CURLOPT_COOKIEJAR, "my_cookies.txt");
    31. curl_setopt($ch, CURLOPT_COOKIEFILE, "my_cookies.txt");
    32. $result = curl_exec($ch);
    33.  
    34. echo $result;
    35. }
    36. curl_close($ch);
    37. ?>
    38.  
    Поле с капчей это word. Как видите, перед тем как сделать запрос на регу, я даю капчу, чтобы ввели и она потом отправляется в http://rutube.ru/register.html. Но всёравно пишет, что не верный код, я думаю, потому что капча меняется при иницилизации curl_init(). Как добиться желаемого результата?
     
  2. MCTrane

    MCTrane Активный пользователь

    С нами с:
    14 ноя 2009
    Сообщения:
    217
    Симпатии:
    0
    Никто не знает?
     
  3. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Наверняка многие здес смогли бы решить эту задачу, но просто нужно лезть, смотреть, разбираться, как устроена капча на конкретно том сайте, который тебе нужен, а это как-то влом. Могу предположить, что при отправке курл-запроса на регистрацию тебе нужны куки, которые устанавливаются либо при обращении к
    http://rutube.ru/register.html
    либо при обращении к
    http://rutube.ru/img/code.jpg
     
  4. MCTrane

    MCTrane Активный пользователь

    С нами с:
    14 ноя 2009
    Сообщения:
    217
    Симпатии:
    0
    Я до этого уже докопался. Вот новый код:
    PHP:
    1. <?php
    2. header('Content-type: text/html; charset=KOI8-R');
    3.  
    4. $ch = curl_init();
    5. curl_setopt($ch, CURLOPT_URL, "http://rutube.ru/register.html");
    6. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    7. if(!isset($_POST['caph'])){
    8. if($_SESSION['cooki']!=""){
    9. $cook = $_SESSION['cooki'];
    10. $headers = array
    11. (
    12.     'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    13.     'Accept-Language: ru,en-us;q=0.7,en;q=0.3',
    14.     'Accept-Encoding: gzip,deflate',
    15.     'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7',
    16.     'Cookie: '.$cook,
    17. );
    18. curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
    19. }
    20. curl_setopt  ($ch, CURLOPT_HEADER, true);
    21. $prs = curl_exec($ch);
    22. preg_match_all('/<img src="\/img\/code\.jpg\?[0-9]*" alt="Captcha" width="120" height="40" \/>/', $prs, $prs0);
    23. preg_match_all('/Set-Cookie:.*/', $prs, $prs1);
    24. $prs1 = str_replace('Set-Cookie:', "", $prs1[0][0]);
    25. $prs1 = explode(";", $prs1);
    26. $prs1 = trim($prs1[0]);
    27. $_SESSION['cooki'] = $prs1;
    28. $prs11= str_replace('xsid=', "", $prs1);
    29. SetCookie("xsid", $prs11);
    30. $prs0 = str_replace('<img src="/img/code.jpg?', "", $prs0[0][0]);
    31. $prs0 = str_replace('" alt="Captcha" width="120" height="40" />', "", $prs0);
    32. $cap = $prs0;
    33. echo "<img src='http://rutube.ru/img/code.jpg?$cap'>";
    34. echo "<form method=post><input name=caph type=text></form>";
    35. }else{
    36. $cook = $_SESSION['cooki'];
    37. $caph = $_POST['caph'];
    38. curl_setopt($ch, CURLOPT_POST, 1);
    39. curl_setopt ($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.0.19) Gecko/2010031422 Firefox/3.0.19");
    40. $headers = array
    41. (
    42.     'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    43.     'Accept-Language: ru,en-us;q=0.7,en;q=0.3',
    44.     'Accept-Encoding: gzip,deflate',
    45.     'Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7',
    46.     'Cookie: '.$cook,
    47. );
    48. curl_setopt($ch,CURLOPT_ENCODING,"");
    49. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);  
    50. curl_setopt($ch, CURLOPT_HTTPHEADER,$headers);
    51. curl_setopt($ch, CURLOPT_REFERER, "http://rutube.ru/register.html");
    52. curl_setopt($ch, CURLOPT_POSTFIELDS, [email='rm=save&nick=zlosn&email=ks@yasx.ru]'rm=save&nick=zlosn&email=ks@yasx.ru[/email]&pass=curl_pass&cpass=curl_pass&word='.$caph.'&agree=y');
    53. curl_setopt($ch, CURLOPT_COOKIEJAR, "my_cookies.txt");
    54. curl_setopt($ch, CURLOPT_COOKIEFILE, "my_cookies.txt");
    55. $result = curl_exec($ch);
    56.  
    57. echo $result;
    58. }
    59. curl_close($ch);
    60. ?>
    Кука называется xsid и в этом коде я её добавляю, но всёравно ошибка при вводе капчи( Может я не правильно добавил куку?