php curl - проблемы с постингом в гостевую

Discussion in 'PHP' started by Flisk, 3 Jan 2012.

  1. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    Не получается сделать скрипт, который бы постил в гостевую текст. Капчу вводить надо вручную (скрипт тестовый чисто), и видимо где-то с этой капчей и сессиями ошибка, ибо не получается. Потому что капча, которую я ввожу, отличается от той, которая в папке скрипта. Видимо, сессия как-то перезапрашивается или хз. По снифферу не особо понятно.

    Гостевая вот _http://mariyana.ru/gb/

    Код постинга:
    Путь к кукисам задан фиксированный, ибо курл часто любит писать куда-то в недры апача куки;

    PHP:
    <?php
    header
    ('Content-Type: text/html; charset=windows-1251');
    //функция получения ид картинки
    function get_sessid()
    {
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_URL,"http://mariyana.ru/gb/");
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
        
    curl_setopt($chCURLOPT_COOKIEJAR'C:\\cookie.txt');
        
    $result curl_exec($ch);
        
        
    preg_match("#<img src='capcha\.php\?s=(\w+)'#"$result$key);
        
    curl_setopt($chCURLOPT_URL,"http://www.mariyana.ru/gb/capcha.php?s=$key[1]"); // получаем картинку
        
    $result curl_exec($ch); // Скачиваем картинку
        
    curl_close ($ch); // Закрываем сессию
        
        
    file_put_contents('capcha.jpg'$result); // Сохраняем
        
        
    return $key[1]; // Возвращаем добытый ключ
    }

    // Параметры регистрации.
    $login 'somenick';
    //пост данные  - username=imya&icq=&email=&city=&url=&capcha=2331&text=messaga

    // Функция, производящая регистрацию 

    function add_post($login,$capcha)
    {
        
    // Все POST-параметры, которые надо отправить
        
    $post = array(
            
    'username' => $login,
            
    'icq'    => ""
            
    'email'    => "",
            
    'city'    => ""
            
    'url'    => ""
            
    'capcha'=> $capcha,
            
    'text'    => 'Какой-то текст'
        
    );
        
        
    $ch curl_init();
        
    curl_setopt($chCURLOPT_URL,"http://mariyana.ru/gb/index.php?act=add");
        
    curl_setopt($chCURLOPT_POST1);
        
    curl_setopt($chCURLOPT_POSTFIELDS$post);
        
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
    curl_setopt($chCURLOPT_FOLLOWLOCATION1);
        
    curl_setopt($chCURLOPT_COOKIEJAR'C:\\cookie.txt');
        
        
    $result curl_exec($ch);
        
    curl_close ($ch);
        
        if(
    strstr($result'Сообщение успешно добавлено!'))
        {
            return 
    true;
        }
        else
        {
            return 
    false;
        }
    }

    // Выводим капчу для ввода
    if(!empty($_GET['capcha']))
    {
        
    // Регистрация
        
    if(add_post($login,$_GET['capcha']))
        {
            echo 
    'Успешно добавлено';
        }
        else
        {
            echo 
    '<b>Ошибка постинга. Видимо, опять кривой код</b>';
        }
        echo 
    '<br><a href="'.basename(__FILE__).'">Еще раз</a>';
    }
    else
    {
        
    // Если капчу еще не ввели - отображаем ее и просим ввести
        
    $key get_sessid();
        
    $form "<h2>Введите код с картинки</h2>
        <img src='capcha.jpg'>
        <form>
             <input class='input' type='text' name='capcha' size='24' maxlength='6'>
        <input type='submit' value='Добавить' class='button' />
        </form>"
    ;
        echo 
    $form;
    }
    ?>
    // Gifts: починил подсветку
     
    #1 Flisk, 3 Jan 2012
    Last edited by a moderator: 3 Jan 2012
  2. daniel777

    daniel777 Elder - Старейшина

    Joined:
    8 Jul 2010
    Messages:
    517
    Likes Received:
    90
    Reputations:
    37
    Не проще ли немножко исправить гостевую?
     
  3. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    daniel777, в смысле? Что вы имеете ввиду?
     
  4. daniel777

    daniel777 Elder - Старейшина

    Joined:
    8 Jul 2010
    Messages:
    517
    Likes Received:
    90
    Reputations:
    37
    В файле add_func.php добавить условие, что если скрипту будет передаватся например переменная pass методом POST, то не использовать капчу.

    PHP:
    if($_POST['pass'] == "пароль"){
    //добавляем запись
    }
    else{
    //используем капчу
    }
     
  5. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    daniel777, а где я его возьму?) У меня нет доступа к гостевой, она чужая же. Была бы моя - я бы отключил капчу ес-но.
     
  6. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Flisk вы не используете кукисы сохраненные в предыдущем запросе. Необходимо добавить curl_setopt($ch, CURLOPT_COOKIEFILE, 'C:\\cookie.txt');

    daniel777 не подскажете, к кому обратиться чтобы исправили авторизацию в произвольное мыло на gmail.com. А то парсить мешают и читать чужие письма
     
    _________________________
  7. daniel777

    daniel777 Elder - Старейшина

    Joined:
    8 Jul 2010
    Messages:
    517
    Likes Received:
    90
    Reputations:
    37
    Не знал, прости:)

    Мне не понять твоего юмора.
     
  8. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    Gifts, а куда конкретно добавить? Как я понимаю, в функцию add_post ? А вместо строки curl_setopt($ch, CURLOPT_COOKIEJAR, 'C:\\cookie.txt');, или после нее?
     
  9. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,174
    Likes Received:
    1,157
    Reputations:
    202
    Flisk в оба блока с курлом добавить

    ЗЫ по поводу <img src='capcha.jpg'> вам будет мешать кэширование броузера, сделайте что-то типа:
    Code:
    echo "<img src='capcha.jpg?".time()."'>"
     
    #9 b3, 3 Jan 2012
    Last edited: 3 Jan 2012
  10. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    b3, спасибо. С картинками действительно какая-то ерунда творится, в браузере отображается одно, а в папке совсем другое. В браузере картинки меняются, но все равно, в папке они "актуальные", т.е. если вводить то, что в папке, тогда добавляется.
     
  11. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,174
    Likes Received:
    1,157
    Reputations:
    202
    Ну я выше написал как избавится от кэширования
     
  12. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    b3, ну смотрите, я написал такой кодес
    Но все равно не работает, как надо.

    upd. Извините, уже работает, не тот браузер взял.
    Всем большое спасибо за помощь (жаль, не могу ставить плюсы).
     
    #12 Flisk, 3 Jan 2012
    Last edited: 4 Jan 2012
  13. sele

    sele New Member

    Joined:
    14 Aug 2011
    Messages:
    28
    Likes Received:
    2
    Reputations:
    0
    Данные капчи должны передаваться скрипту из той же формы, либо писаться в куки, чтобы скрипт мог проверить введенное значение со значением, соответствующем тексту на картинке. Т.е. ты либо передаешь с формой нужные скрипту данные только что распознанной капчи (например адрес картинки), или, работаешь с печеньем. В файл его писать совершенно не обязательно, можно в переменную. Отправляешь скрипту распознанный текст вместе с соответствующей кукой.

    Я делал так - забирал картинку, отправлял ее на antigate.com, получал значение и передавал скрипту данные формы. Ибо вручную вводить капчу геморно.
     
    #13 sele, 4 Jan 2012
    Last edited: 4 Jan 2012
  14. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    sele По первому абзацу - внимательно смотрим код и не выдумываем проблем.
     
    _________________________
  15. sele

    sele New Member

    Joined:
    14 Aug 2011
    Messages:
    28
    Likes Received:
    2
    Reputations:
    0
    Я ничего не выдумываю, я просто пояснил тс, как решается его проблема.
     
  16. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    А если есть две функции? Одна берет картинку, вторая постит. Переменная с куками же будет локальная, т.е. будут две сессии? Или нет?
    Да это для тренировки просто, мне спам этой гесты совсем не нужен. Просто она не посещаемая и не модерируемая, поэтому пробую там.
     
  17. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,174
    Likes Received:
    1,157
    Reputations:
    202
    Все действия должны происходить в пределах одной сессии. Одна сессия подразумевает одного пользователя.
     
  18. Flisk

    Flisk Member

    Joined:
    4 Aug 2010
    Messages:
    147
    Likes Received:
    8
    Reputations:
    -2
    b3, извините за много тупых вопросов, но я до конца не понимаю - если у меня 2 функции (см. код с 1 поста), одна на получение картинки, вторая на постинг; в первой и второй есть два сеанса Курл - это две сессии или все таки одна?
     
  19. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,174
    Likes Received:
    1,157
    Reputations:
    202
    Саму сессию вы получаете при помощи:
    Code:
    curl_setopt($ch, CURLOPT_COOKIEJAR, 'C:\\cookie.txt');
    в get_sessid, далее вы вы используете эту сессию для постинга в add_post но там нехватает строки:
    Code:
    curl_setopt($ch, CURLOPT_COOKIEFILE, 'C:\\cookie.txt');
     
  20. sele

    sele New Member

    Joined:
    14 Aug 2011
    Messages:
    28
    Likes Received:
    2
    Reputations:
    0
    Передавай куку в качестве аргумента нужной функции. Зачем 2 сессии? Ты забрал картинку, например file_get_content'ом, отправил на antigate.com, получил распознанный текст и отправил форму. Если параметры капчи не передаются в $_REQUEST, значит сохраняются в печеньях, в таком случае, передаешь печенья. Ссылку на гостевую можно?