На днях занялся попыткой создания небольшого бота для работы с нужным мне сайтом. Необходимо чтобы бот проверял в указанное время сайт и сгружал оттуда информацию. Это как бы обычный веб-скрап. А если нужно чтобы бот еще и некоторые формочки попутно заполнил и кнопочку нажал, что делать? И ессно вопрос, в какую сторону смотреть если язык для реализации - CommonLisp?
А почему именно формочки? Разве нельзя запрос вручную послать?
Вот берем форму
<form action="target" method="post">
<input type="textarea" name="text" />
<input type="submit" />
</form>
и делаем для нее запрос
(drakma:http-request "target"
:method :post
:parameters '(("text" . "Your text")))
По-моему, логично.
Спасибо за ссылку, работа пошла, ииии резко остановилась. Необходима авторизация на сайте. Для теста попробовал на паре-тройке левых сайтов - все прошло на ура. На нужном мне сайте - 403 Forbidden. Форма для авторизации вот такая.
<-h4>Авторизация<-/h4>
<-form id="login_form" action="/login/" method="post">
<-input type="image" style="width:0px;height:0px;border:0px;" alt="" title="" src="/i/empty.gif" />
<-input type="hidden" name="action" value="login" />
<-table cellspacing="3" cellpadding="0" border="0">
<-tr>
<-td>
E-mail:
<-/td>
<-td>
<-input type="text" name="login" class="sm" />
<-/td>
<-/tr>
<-tr>
<-td>
Пароль:
<-/td>
<-td>
<-input type="password" name="pwd" class="sm"/>
<-/td>
<-/tr>
<-tr>
<-td>
<-/td>
<-td>
HTTP | <-a title="Безопасное<-br/>подключение" href="https://advego.ru/login">HTTPS<-/a>
<-/td>
<-/tr>
<-tr>
<-td>
<-/td>
<-td>
<-a href="/password">Забыли пароль?<-/a>
<-/td>
<-/tr>
<-tr>
<-td>
<-/td>
<-td class="vmiddle">
<-span title="Небезопасно!"><-input title="Небезопасно!" type="checkbox" name="remember"/> запомнить<-/span>
<-/td>
<-/tr>
<-tr><-td> <-/td><-td> <-/td><-/tr>
<-tr>
<-td>
<-/td>
<-td>
<-input type="hidden" name="action" value="login" />
<-input type="hidden" name="uri" value="" />
<-input type="hidden" name="captcha" value="tmp_value" />
<-div class="midmenu">
<-a id="login_submit" href="/login/">Войти<-/a>
<-/div>
<-/td>
<-/tr>
<-/table>
<-/form>
Сабмит формы идет не через <input....> может быть в этом дело?
Вот код для авторизации:
(let ((cookie-jar (make-instance 'drakma:cookie-jar)))
(drakma:http-request "http://www.site.com/"
:method :post
:parameters `(("login" . "myemail@mail.com") ("pwd" . "mypassword"))
:cookie-jar cookie-jar)
(drakma:http-request "http://www.site.com/"
:cookie-jar cookie-jar))Наверно следующей проблемой будет капча, которая от твоих методов и создавалась.
"Постишь не туда. http://htmlbook.ru/html/form/action"
не-не, то я в пример не так вставил )
(let ((cookie-jar (make-instance 'drakma:cookie-jar)))
(drakma:http-request "http://www.site.com/login/"
:method :post
:parameters `(("login" . "myemail@mail.com") ("pwd" . "mypassword"))
:cookie-jar cookie-jar)
(drakma:http-request "http://www.site.com/"
:cookie-jar cookie-jar))
А что там с капчей? 0_о Капчи действительно с первого раза не видно, возможно, она высвечивается лишь при ошибочном вводе пароля.
Для начала, я бы попробовал данные всех input без исключения послать. Например, вот этого:
<-input type="hidden" name="action" value="login" />
мысль насчет высылки собирать данные со всех <input>`ов меня посещала. Пробовал - не сработало.
З.Ы. попробовал использовать Python фреймворк для скрапинга Scrapy. Используя стандартный метод для авторизации, он заходит на сайт без проблем. Передаются там только логин и пароль.
Кстати, а на каком из запросов 403?
В зависимости от паранойи разработчика/администратора могут учитываться User-Agent и Referrer.