admin / 06.02.2018

Как написать бота для сайта

.

Проект фактически представляет собой онлайн хранилище свободно распространяемого программного кода. Свои разработки здесь могут размещать все желающие, а доступ к проектам можно получить всем пользователям с любой точки мира.

  • Рады видеть вас в приложении! Если вы здесь впервые то перейдите на страницу помощи.

Пишем бота для сайта на javascript

(Не смотря на то, что в тексте присутствуют примеры кода и рабочие функции, эта статья служит скорее наводкой, для людей которым надо написать пожую программу, а не конкретным примером действия. Я описал возникшие у меня трудности и их решение, но думаю этого не достаточно)

Волею судьбы мне понадобилось написать бота для сайта, навигация по которому полностью построена на ajax.

Я уже сталкивался с такой проблемой и прекрастно понимаю, что php-шная библиотека curl вполне справляется со своей задачей и в этом случае с ajax-ом, но, видать, я был не первым таким умником и разработчики сайта защитились от ботов постоянно меняя ajax-запросы, да еще и генерируя их с помощью javascript.

Все статьи цикла
Промучившись три ночи, я осознал, что нужно писать интерпретатор javascript, вот только занятие это, мягко говоря, не благодарное, покопавшись в интернете я нашел уже 2 готовых (весь остальной абзац к делу фактически не относится):

Для java. (пользуясь случаем хочу отметить, что вопреки распространенному мнению, java и javascript – два совершенно разных языка, а приставку «java» javascript приобрел в последний момент и только в маркетинговых целях).

Благодаря случайно попавшейся месяц назад на глаза батиной книжке Питера Нотона за 1996 год я понял, что java – язык без сомнения интересный и позволяющий решить много специфических задач язык. Вот только я, как и большинство, думаю, не смогу взять и написать бота на нем, java требует не малых усилий по изучению, и если и изучать его, то не для написания одной маленькой программки.
Для python. Наверно в начале весны от одного человека (руководителя одной из конторок по производству сайтов, как он сам себя называет) слышал восторженный отзыв об этом языке программирования, в котором обсирались все известные мне серверные языки и прославлялся великий и могучий python. Из этого монолога я также узнал, что для конторы, по заказу на python-е сейчас пишется CMS и почти завершена. Вот только:
говорил он не своими словами, а словами программиста, который эту CMS пишет, сам же он даже не знает, как этот самый python выглядит.
в программировании этот человек не идет дальше лабороторок в институте и даже плохо в нем соображает, все его программирование ограничивается навигацией в интерактивных flesh мультиках,
даже после полутора лет своей работы контора убыточна,
возможно из-за предыдущего пункта она, по сути, не легальна и представляет собой просто N-ое количество друзей работающих за идею,
CMS все еще не доработана даже до beta-версии.

Исходя из всего этого, я составил обратное мнение об этом языке программирования. Может, конечно, и зря, но этот вариант рассматривать не буду вообще.

После еще одной бессонной ночи впустую, мой засыпающий мозг вспомнил о Delphi. О той старенькой 7-ой версии, которую машинально устанавливаю после каждого форматирования диска, но с которой, по сути, не работал уже лет пять или даже семь. (Кстати, думаю, в C++Builder все те же самые огурцы лежат, но лично не проверял.)

Там, на вкладке internet притаился компонент TWebBrowser, он является встроенным в Delphi экземпляром Internet Explorer-а, в котором уже есть так нужный мне интерпретатор javascript.

Как сделать (создать) бот программу(кликер)?

При этом мы получаем почти безграничную власть над этим творением Microsoft-а.

Это, конечно, хорошо, но в начале нужно научится WebBrowser-ом пользоватся, а с этим у меня возникли проблемы, отвык знаете ли от делфовскиъх мануалов. По этому я ограничился всего парой приемчиков, которые помогли мне перевести работу от самого компонента на непосредственно страницу загруженную в него.

Дальше пойдут примеры кода, которые собирались еще в лохматые времена для Delphi 6 и я не уверен, что они будут работать на новых версиях. (в 7-ой версии работают точно)

Итак, перво-наперво, после размещения компонента TWebBrowser на форме, нам нужно загрузить в него страницу, для этого служит метод Navigate:
WebBrowser.Navigate(‘http://vvy.me’);

Также присутствует и метод отправки post-данных, но он нам совершенно не нужен, отправлять все формы будет сам WebBrowser, нам же нужна лишь страница с которой и начнет гулять по сайту бот, а ее адрес не может содержать post-запросов.

После того, как страница загрузится произойдет событие onDocumentComplete, в котором мы уже и можем приступить к работе со страницей, но для начала нам нужно:

добавляем в uses модуть MSHTML
добавляем переменные:
WB_Doc : IHTMLDocument2; // В этой переменной будет хранится интерфейс взаимодействия со всем WebBrowser-ом WB_HTMLWindow : IHTMLWindow2; // А тут уже наше окно, с которым и работает javascript

и конечно кусок кода в процедуре onDocumentComplete
WebBrowser1.Document.QueryInterface(IHTMLDocument2, WB_Doc); WB_HTMLWindow := WB_Doc.parentWindow; if not Assigned(WB_HTMLWindow) then showmessage(‘авот фих тебе’) else showmessage(‘ все OK’);

Но на самом деле все немного сложнее, событие onDocumentComplete возникает при:

загрузке html-кода страницы,
загрузке каждого фрейма в отдельности,
в случаях работы javascript на странице, когда происходит какое-то изменение в содержимом тегов,
и еще куча всего.

При этом во время возникновения события объект браузера может быть не доступен, но мы можем убедится в возможности взаимодействия с WebBrowser-ом по его свойству ReadyState, если все хорошо, то оно должно быть равно 4 или READYSTATE_COMPLETE, кому как нравится. Все остальные значения от 0 до 3 в нашем контексте мало интересны и лишь обозначают степень готовности WebBrowser-а к работе с ним.

Что бы добраться до html-кода страницы мы можем применить вот такую функцию:
function GetHtml(doc: IHtmlDocument2): string; var iDisp: IDispatch; iCollection: IHTMLElementCollection; begin result := »; iCollection := doc.all.Tags(‘HTML’) as IHTMLElementCollection; iDisp := iCollection.item(0, 0); result := (iDisp as IHTMLElement).outerHTML; end;

Хоть она и вернула все содержимое в виде одной строки, кодовые символы
в наличии, и все прекрасно загружается например в TMemo с переносом строк:
Memo.Lines.Add(GetHtml(WB_Doc));

Смертельный номер! Функция GetHtml вернет нам не просто html-код страницы, а код, в котором выполнились уже все скрипты, т.е вместо
<script language="javascript"> document.write(‘Я работаю!’); </script>

Мы получим
<script language="javascript"> document.write(‘Я работаю!’); </script> Я работаю!

И даже больше: мы можем обращаться к html-элементам страницы, например заполнять input-ты или отправлять формы средствами Delphi, но что б не курить мануалы еще и по этому вопросу я поступаю хитрее, а точнее выполняю javascript, например:
WB_HTMLWindow.execScript(‘alert(“Тадам!”)’, ‘javascript’);

Схема работы получается предельно простая (с примерами как получилось у меня):

Загружаем первую страницу
Например, код ссылки, в том виде как ее получил WebBrowser
<a>Далее</a>

Получаем цункцией GetHtml ее html-код с уже отработавшими скриптами
Наша ссылка получилась вот такой
<a onclick="qwerty()">Далее</a>

И малого того, что событие onclick задается в самом javascript, так еще и функцию qwerty явно прогнали через абсфукатор, но это нам не помешает
Регулярками вытаскиваем код из события onclick
qwerty()

С помощью .execScript запускаем событие onclick, вернее код из него
Из многочисленных событий onDocumentComplete ифом(if) выбираем то, в котором WebBrowser.ReadyState равно 4 и только тогда продолжаем работу.

Лично я, для верности, еще и потом включаю TTimer, в любом случае он создаст задержку в выполнении программы, и наш будет больше похож на человека.
Регулярками вынимаем нужную информацию
Находим следующую ссылку «Далее»

И так по кругу

Кстати, в TWebBrowser частенько не выполняются правильно написанные скрипты, которые выполняются в обычном IE, в этом случае на экран выскакивает стандартное окошко об ошибке в javascript, с предложением запустить отладку. И, кроме того, что они мельтешат перед глазами, они еще иступарят нам весь компонент делая его не доступным до момента загрузки нового url-а, да и всю программу, подобно процедуре showmessage(). Это можно решить, назначив свойству Silent значение true. Оно поможет нам отключить все ошибки javascript в TWebBrowser, но оставит нам сообщения об ошибках взаимодействия с самим компонентом, что жизненно важно при отладке.

У TWebBrowser еще куча плюшек, но лично мне хватило перечисленных, а еще все это работает не только в компонентах WebBrowser, но и окнах Internet Explorer-а, достаточно получить указатель на окно программы и вперед!

В конце хочу сказать, что если для работы бота лучше использовать регулярные выражения в самом Delphi, а не в javascrip. Для этого нужно будет импортировать отдельную библиотеку, но это уже совсем другая история.

.

ВКонтакте

  1. Войдите ВК под аккаунтом, на котором вы собираетесь использовать бота.
  2. Перейдите на страницу с игрой.
  3. После загрузки игры, обновите страницу, нажав F5. Это важно!
  4. Скопируйте в адресную строку браузера следующий код:  var allscripts=document.getElementsByTagName(«script»); script=allscripts[allscripts.length-1].innerHTML;var json=JSON.parse(script.substring(script.indexOf(‘{«api_url’), script.indexOf(‘»};’)) + ‘»}’);var answer1=prompt(«VK id»,json.viewer_id);var answer2=prompt(«VK auth»,json.auth_key);
  5. Пропишите в начало адресной строки «javascript:» (без кавычек).

  1. Нажмите Enter. По очереди выведутся два окна с нужными параметрами. Сохраните их где-нибудь (например, в блокноте), т.к. перейти на вкладку с регистрацией в боте вы не сможете, пока не закроете эти сообщения.

  1. Если окошки не появились, то обновите страницу с игрой, нажав F5, и еще раз повторите действия в пунктах 4 и 5.
  2. Перейдите по ссылке и нажмите «Разрешить».

  1. Скопируйте из браузерной строки значение параметра access_token. Не обращайте внимание на предупреждение, данный параметр используется в боте исключительно для получения списка ваших друзей в игре.

Одноклассники

  1. Войдите в Одноклассники под аккаунтом, на котором вы собираетесь использовать бота.
  2. Перейдите на страницу с игрой.
  3. Скопируйте в адресную строку браузера следующий код: var frame=document.getElementById(«appMain_Div»).src;window.location.href=frame;
  4. Пропишите в начало адресной строки «javascript:» (без кавычек).

  1. Нажмите Enter.

    Как создать бот собственными силами за пять минут

    Браузер перейдет на похожую страницу. На этой странице скопируйте в адресную строку браузера следующий код: var script=document.getElementsByTagName(«script»)[3].innerHTML;var json=JSON.parse(script.substring(script.indexOf(‘{«web_se’), script.indexOf(‘»};’)) + ‘»}’);var answer1=prompt(«Odnoklassniki id»,json.logged_user_id);var answer2=prompt(«Odnoklassniki auth»,json.auth);

  2. Пропишите в начало адресной строки «javascript:» (без кавычек).

  1. Нажмите Enter. По очереди выведутся два окна с нужными параметрами. Сохраните их где-нибудь (например, в блокноте), т.к. перейти на вкладку с регистрацией в боте вы не сможете,  пока не закроете эти сообщения.

Mail.ru

  1. Войдите в Mail.ru под аккаунтом, на котором вы собираетесь использовать бота.
  2. Перейдите на страницу с игрой.
  3. Скопируйте в адресную строку браузера следующий код: var url=document.getElementById(‘app-wrapper’).dataset.src;var params=url.split(«?»)[1].split(«&»);var id=params[3].split(«=»)[1];var auth=params[5].split(«=»)[1];var answer1=prompt(«Mail.ru id»,id);var answer2=prompt(«Mail.ru auth»,auth);
  4. Пропишите в начало адресной строки «javascript:» (без кавычек).

  1. Нажмите Enter. По очереди выведутся два окна с нужными параметрами. Сохраните их где-нибудь (например, в блокноте), т.к. перейти на вкладку с регистрацией в боте вы не сможете, пока не закроете эти сообщения.

.

Как написать Telegram бота: практическое руководство

6 Апрель 2016, Python, 157837 просмотров

В последнее время Telegram у всех на слуху. Нужно отдать должное отделу маркетинга этого приложения, шумиху подняли на славу. Одной из основных «фишек» Telegram является его якобы защищённость — по словам Павла Дурова вся переписка между пользователями шифруется. Более того, ни одна спец.служба мира не будет иметь доступ к вашим сообщениям. Но в данной статье речь не об этом.

На чем писать бота для браузера

Сегодня хотелось бы поговорить о не менее крутой фишке в Telegram, а именно о ботах. Помимо того, что в сети уже полно информации о различного рода Telegram ботах (github бот, например), мессенджер открыл своё API для разработчиков, и теперь каждый может создать своего собственного бота с блэкджеком и плюшками.

В статье я приведу пример написания онлайн бота с использованием Python и Django фреймворка. То есть мы «запилим» полноценное веб-приложение, которое будет крутиться на удалённом хосте и принимать команды от пользователей. Весь исходный текст доступен в моём github репозитории.

Документация, описывающая процесс взаимодействия с ботами Telegram находится тут. Чтобы не изобретать велосипед, я нашел неплохую Python библиотеку, реализующую все основные функции ботов — telepot. Как я уже упоминал ранее, для того, чтобы обслуживать пользователей нашего бота мы будет разрабатывать веб-приложение, используя Django фреймворк.

Как создать Telegram бота?

Для начала нам необходимо зарегистрировать в Telegram нашего будущего бота. Это делается следующим образом:

  • Необходимо установить приложение Telegram на телефон или компьютер. Скачать приложение можно тут
  • Добавляем к себе в контакт-лист бота с именем BotFather
  • Запускаем процедуру «общения» с ботом нажатием кнопки Start. Далее перед нами предстанет список команд точно как на скриншоте.
  • Для того, чтобы создать нового бота необходимо выполнить команду /newbot и следовать инструкциям. Обратите внимание, что username для бота должен всегда содержать в конце слово bot. Например, DjangoBot или Django_bot.

  • Для нашего бота я выбрал имя PythonPlanetBot, так как его основная функция заключается в парсинге RSS feed сайта Python Planet и выдача информации о последних постах пользователю 🙂

После создания бота, обратите внимание на строку с текстом:

Use this token to access the HTTP API:

За которой следует т.н. token по которому мы будем манипулировать нашим ботом. Помимо функции создания telegram бота, BotFather также имеет ряд других возможностей:

  • Присвоить боту описание
  • Установить аватар
  • Поменять token

и так далее. Полное описание доступных команд можно увидеть на первом скриншоте.

Приступаем к кодированию

Как я ранее уже упоминал, мы будем писать веб-приложение на Django. Но стоит отметить, что это делать необязательно. Можно обойтись и обычным Python скриптом, правда в этом случае необходимо будет периодически опрашивать Telegram на предмет новых запросов от пользователей бота (используя метод getUpdates) и увеличивая offset для получения самых последних данных без повторений. В Telegram существует два взаимоисключающих метода получения команд/сообщений для вашего бота.

  • Использование вызова API метода getUpdates
  • Установка Webhook

Установка Webhook заключается в передаче боту специального URL адреса на который будет поступать POST запрос каждый раз, когда кто-то начнёт посылать сообщения боту. Именно этот вариант мы и будем использовать для взаимодействия между ботом и его пользователем. Для того, чтобы задать URL, необходимо использовать API метод setWebhook. Отмечу, что URL должен начинаться с https, то есть иметь защищённое SSL соединение с валидным сертификатом. Telegram разрешает использовать самоподписанный сертификат, правда для этого необходимо в методе setWebhook передавать также публичный ключ в PEM формате (ASCII base64). Либо же можно получить валидный бесплатный SSL сертификат от Let’s Encrypt.

Подробнее о getUpdates и setWebhook можно почитать соответственно здесь и тут.

Итак, вернёмся к python библиотеке для работы с Telegram — telepot. На текущий момент самой последней её версий является 6.7. Устанавливаем её в виртуальное окружение python virtualenv:

Самый простой вариант взаимодействия с Telegram ботом на Python выглядит следующим образом:

Переменной token присваиваем значение токена, полученного при создании бота через BotFather. В итоге после выполнения этих команд мы получим:

Поздравляю! Мы вызывали самый простой API запрос getMe, который возвращает информацию о боте: username, id, first_name.

Добавим нашего бота к себе в контакт-лист и пошлём ему первую стандартную команду /start

Выполняем код:

Процесс общения с telegram ботом происходит по HTTPS; для передачи данных используется JSON. Метод getUpdates возвращает список/массив из объектов типа Update. Внутри Update находится объект Message. Для стандартного взаимодействия с ботом нас фактически интересует именно объект Message, у которого мы считываем атрибут text, хранящий в себе текст, переданный боту и объект chat, в котором лежит информация о пользователе, инициировавшем общение с нашим Telegram ботом. Также имеется параметр update_id, который служит в качестве offset параметра при вызове метода getUpdates. То есть update_id+1 вернёт все сообщения, поступившие после последнего update_id, при этом все предыдущие сообщения будут удалены.

На этапе написания простейшего Telegram бота нам этих вызовов достаточно. Приступим к написанию Django приложения для обслуживания наших пользователей.

Простая функция парсинга RSS фида Planet Python выглядит вот так:

Здесь я использую python библиотеку requests для работы с HTTP в самом простейшем варианте без обработки ошибок. Django «вьюшка» выглядит следующим образом:

CommandReceiveView ждёт POST запрос на себя, парсит его и отвечает исходя из заданной команды. Полноценное Django приложение можно найти по этой ссылке. Стоит отметить в коде использование ещё одного API вызова — sendMessage. Этот метод отправляет сообщение заданному пользователю, используя при этом chat_id и сам текст сообщения. Chat_id — это уникальный идентификатор чата между пользователем и ботом (его идентификатор есть в ответе на запрос getUpdates). У Telegram ботов есть одно ограничение, они не могут посылать сообщения пользователям, которые предварительно не инициировали общение с ним. По-видимому это сделано дабы избежать массового создания спам-ботов.

Я предполагаю, что вы уже клонировали мой репозиторий, настроили окружение и установили все необходимые зависимости: Django, requests, telepot. Если же вы не знаете как это сделать, то совсем скоро я напишу цикл статей о разработке веб-приложений на Python, включая разбор экосистемы: разработка, настройка, деплой. Если вам это интересно, то отпишитесь, пожалуйста, в комментариях к этой статье. Хочется получить обратную связь 🙂

Итак, веб-приложение на Django запущено. Как же начать тестировать бота? А всё очень просто — необходимо симулировать действия Telegram сервиса. Для этого нам понадобится HTTP клиент и тело запроса. В качестве HTTP клиента я часто использую Chrome плагин под названием Postman, а тело запроса мы возьмём напрямую из данных, полученных с помощью API вызова getUpdates.

После запуска runserver, URL на который необходимо посылать запрос выглядит следующим образом:

http://127.0.0.1:8000/planet/b…BOT_TOKEN/

где BOT_TOKEN — это токен нашего бота. Смотрим скриншот:

 

А давайте-ка отправим команду feed для получения списка новостей из Planet Python:

На скриншотах видно, что бот адекватно отреагировал на нашу команду вывести список последних 10 постов.

Следующим шагом является деплой нашего Django приложения на удалённый хост и последующий вызов метода setWebhook для передачи URL на который будет посылаться POST запрос от сервиса Telegram каждый раз при поступлении команд боту от пользователей. Об этом мы поговорим в следующей заметке.

FILED UNDER : IT

Submit a Comment

Must be required * marked fields.

:*
:*