Не получается сделать скрипт, который бы постил в гостевую текст. Капчу вводить надо вручную (скрипт тестовый чисто), и видимо где-то с этой капчей и сессиями ошибка, ибо не получается. Потому что капча, которую я ввожу, отличается от той, которая в папке скрипта. Видимо, сессия как-то перезапрашивается или хз. По снифферу не особо понятно. Гостевая вот _http://mariyana.ru/gb/ Код постинга: Путь к кукисам задан фиксированный, ибо курл часто любит писать куда-то в недры апача куки; PHP: <?php header('Content-Type: text/html; charset=windows-1251'); //функция получения ид картинки function get_sessid() { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://mariyana.ru/gb/"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_COOKIEJAR, 'C:\\cookie.txt'); $result = curl_exec($ch); preg_match("#<img src='capcha\.php\?s=(\w+)'#", $result, $key); curl_setopt($ch, CURLOPT_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($ch, CURLOPT_URL,"http://mariyana.ru/gb/index.php?act=add"); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_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: починил подсветку
В файле add_func.php добавить условие, что если скрипту будет передаватся например переменная pass методом POST, то не использовать капчу. PHP: if($_POST['pass'] == "пароль"){ //добавляем запись } else{ //используем капчу }
daniel777, а где я его возьму?) У меня нет доступа к гостевой, она чужая же. Была бы моя - я бы отключил капчу ес-но.
Flisk вы не используете кукисы сохраненные в предыдущем запросе. Необходимо добавить curl_setopt($ch, CURLOPT_COOKIEFILE, 'C:\\cookie.txt'); daniel777 не подскажете, к кому обратиться чтобы исправили авторизацию в произвольное мыло на gmail.com. А то парсить мешают и читать чужие письма
Gifts, а куда конкретно добавить? Как я понимаю, в функцию add_post ? А вместо строки curl_setopt($ch, CURLOPT_COOKIEJAR, 'C:\\cookie.txt');, или после нее?
Flisk в оба блока с курлом добавить ЗЫ по поводу <img src='capcha.jpg'> вам будет мешать кэширование броузера, сделайте что-то типа: Code: echo "<img src='capcha.jpg?".time()."'>"
b3, спасибо. С картинками действительно какая-то ерунда творится, в браузере отображается одно, а в папке совсем другое. В браузере картинки меняются, но все равно, в папке они "актуальные", т.е. если вводить то, что в папке, тогда добавляется.
b3, ну смотрите, я написал такой кодес Но все равно не работает, как надо. upd. Извините, уже работает, не тот браузер взял. Всем большое спасибо за помощь (жаль, не могу ставить плюсы).
Данные капчи должны передаваться скрипту из той же формы, либо писаться в куки, чтобы скрипт мог проверить введенное значение со значением, соответствующем тексту на картинке. Т.е. ты либо передаешь с формой нужные скрипту данные только что распознанной капчи (например адрес картинки), или, работаешь с печеньем. В файл его писать совершенно не обязательно, можно в переменную. Отправляешь скрипту распознанный текст вместе с соответствующей кукой. Я делал так - забирал картинку, отправлял ее на antigate.com, получал значение и передавал скрипту данные формы. Ибо вручную вводить капчу геморно.
А если есть две функции? Одна берет картинку, вторая постит. Переменная с куками же будет локальная, т.е. будут две сессии? Или нет? Да это для тренировки просто, мне спам этой гесты совсем не нужен. Просто она не посещаемая и не модерируемая, поэтому пробую там.
Все действия должны происходить в пределах одной сессии. Одна сессия подразумевает одного пользователя.
b3, извините за много тупых вопросов, но я до конца не понимаю - если у меня 2 функции (см. код с 1 поста), одна на получение картинки, вторая на постинг; в первой и второй есть два сеанса Курл - это две сессии или все таки одна?
Саму сессию вы получаете при помощи: Code: curl_setopt($ch, CURLOPT_COOKIEJAR, 'C:\\cookie.txt'); в get_sessid, далее вы вы используете эту сессию для постинга в add_post но там нехватает строки: Code: curl_setopt($ch, CURLOPT_COOKIEFILE, 'C:\\cookie.txt');
Передавай куку в качестве аргумента нужной функции. Зачем 2 сессии? Ты забрал картинку, например file_get_content'ом, отправил на antigate.com, получил распознанный текст и отправил форму. Если параметры капчи не передаются в $_REQUEST, значит сохраняются в печеньях, в таком случае, передаешь печенья. Ссылку на гостевую можно?