В этой части туториала по VK API мы продолжим с помощью Python разбирать возможности ВК для разработчиков и сделаем небольшого чат-бота-автоответчика.
Бот будет выполнять некоторые действия в ответ на полученное сообщение. Например, отправлять в ответ на команду ~bash~, случайную цитату с bash.im. Для этого бота, кроме знаний питона и работы с VK API, нужны хотя бы начальные знания по парсингу. В данном случае нам понадобится requests + lxml.
Настройка
Прежде всего, нужно написать код для отлова нужных сообщений. Получать уведомления мы будем с помощью messages.get, используя last_message_id.
import vk
from time import sleep
from lxml import html
import requests as req
login = ''
password = ''
vk_id = 'ID_ВАШЕГО_ПРИЛОЖЕНИЯ'
session = vk.AuthSession(app_id=vk_id, user_login=login, user_password=password)
vkapi = vk.API(session)
messages = vkapi.messages.get(count=1)
last = messages['items'][0]['id']
while True:
try:
messages = vkapi.messages.get(last_message_id=last)
except Exception as e:
print(e)
sleep(4)
continue
if not messages['items']: # Если нет новых сообщений
sleep(4)
continue
last = messages['items'][0]['id']
for message in messages['items']:
# временные заглушки
if "~bash~" in message['body']:
print("Wow. Such bash")
if "~cgra~" in message['body']:
print("Very nice")
sleep(4)
Парсим Баш
Теперь нужно написать функции для получения цитаты из Баша.
def bash(id):
try:
r = req.get('http://bash.im/random')
doc = html.document_fromstring(r.text)
bash = '\n'.join(doc.xpath('//*[@id="body"]/div[3]/div[@class="text"]/text()'))
vkapi.messages.send(user_id=id, message=bash)
except Exception as e:
print(e)
С помощью XPath мы получаем текст из контейнера div, содержащий в себе первую цитату на странице. Найти путь нужный вам элемент можно в инструментах разработчика вашего браузера, но почти всегда понадобится «допилить» до нужного вида и убрать лишние теги, вроде <br/>.
Исправим цикл проверки сообщений, заменив заглушку на готовую функцию:
...
if "~bash~" in message['body']:
bash(message['user_id'])
...
Сейчас все должно работать. Но есть одно но. Если кто-то в коллективном чате напишет ~bash~, то цитата отправится к нему в личные сообщения, а не в общий чат. Надо поправить.
def bash(id, mode='u'):
try:
r = req.get('http://bash.im/random')
doc = html.document_fromstring(r.text)
bash = '\n'.join(doc.xpath('//*[@id="body"]/div[3]/div[@class="text"]/text()'))
if mode == 'c':
vkapi.messages.send(chat_id=id, message=bash)
else:
vkapi.messages.send(user_id=id, message=bash)
except Exception as e:
print(e)
....
if "~bash~" in message['body']:
if 'chat_id' in message:
bash(message['chat_id'], 'c')
else:
bash(message['user_id'])
....
Интерфейс пользователя
На основе этого парсера можно приготовить свой собственный, для любимого ресурса. Но давайте добавим еще немного функционала к нашей программе.
def print_help(id, mode='u'):
try:
message = """=== VK-бот ===
Доступные команды:
&#_9989; ~bash~ -- случайная цитата с bash.im
&#_9989; ~help~ -- показать помощь"""
if mode == 'c':
vkapi.messages.send(chat_id=id, message=message)
else:
vkapi.messages.send(user_id=id, message=message)
except Exception as e:
print(e)
...
if "~help~" in message['body']:
if 'chat_id' in message:
print_help(message['chat_id'], 'c')
else:
print_help(message['user_id'])
...
Таким образом, набор доступных команд можно будет расширить в соответствие с функциями, которые вы добавите к парсеру или не только к нему.
Комментарии