В этой публикации напишем бота Вконтакте, которые принимает ссылку на фото из Instagram'a, а обратно отправляет эту фотографию.
Создаем группу в Вконтакте и в настройках сообщества включаем сообщения:
"Управление сообществом" — "Сообщения".
Для начала попробуем создать "эхо-бота".
Нужны будут следующие библиотеки для работы
falcon==1.2.0
gunicorn==19.7.1
py-vkontakte==5.53.4
requests==2.18.3
Нам нужно получить TOKEN, с помощью которого мы сможешь отправлять сообщения от имени сообщества:
"Управление сообществом" — "Настройки" — "Работа с API" — "Ключи доступа".
Получать новые сообщения может двумя способами: "Callback API" или "Long Poll".
Будет использовать "Callback API".
"Callback API" отправляет данные в json-формате.
{
"type":"message_new",
"object":{
"id":1,
"date":1499441696,
"out":0,
"user_id":1,
"read_state":0,
"title":" ... ",
"body":"Hello"
},
"group_id":1,
"secret":"111111"
}
В "Callback API" необходимо указать адрес сервера. В качестве сервера будем использовать falcon
"Управление сообществом" — "Настройки" — "Работа с API" — "Callback API".
Подтверждаем сервер для "Callback API":
import falcon
GROUP_ID = "YOUR GROUP ID"
CONFIRMATION = "YOUR CONFIRMATION CODE"
class Bot(object):
def on_post(self, req, resp):
if req.content_length:
data = json.loads(req.stream.read())
if "confirmation" == data.get("type") and GROUP_ID == data.get("group_id"):
resp.data = CONFIRMATION
application = falcon.API()
application.add_route('/', Bot())
Теперь напишем обработчик для приёма новых сообщений и их отправку. Для отправки сообщения будет использовать библиотеку py-vkontakte.
# ....
import vk
api = vk.Api(TOKEN) # которые вы получили выше
group = api.get_group(GROUP_ID)
class Bot(object):
def on_post(self, req, resp):
# ....
user_id = data.get('object').get('user_id')
text = data.get('object').get('body')
if "message_new" == data.get("type"):
group.send_message(user_id, text)
resp.data = b"ok"
# ....
Для того чтобы передать Вконтакте, что мы успешно прочитали сообщение, нужно отправить строку "ok".
"Эхо-бот" готов его можно запустить
gunicorn bot:application
Пишем бота который отправляет фотографии из Instagram
В документации Instagram сказано, что если к https://instagram.com/p/fA9uwTtkSN/, добавить /media, то вернется JPG файла.
Для начала напишем функцию, которая будет проверять, что отправленное пользователем сообщение это ссылка на сайт Instagram.
from urllib.parse import urlsplit
def is_instagram_link(self, link):
url = urlsplit(link)
if url.netloc in ["www.instagram.com", "instagram.com"]:
return True
return False
Напишем функцию, которая добавляет к ссылке /media и скачивает этот JPG
import io
from urllib.parse import urljoin
import requests
def get_instagram_photo(self, instagram_photo_link):
url = urljoin(instagram_photo_link, 'media/?size=l')
response = requests.get(url)
if not response.ok:
raise ValueError()
file_like = ('photo.jpg', io.BytesIO(response.content))
return file_like
?size=l – это параметр, который указывает размер возвращаемого JPG
if not response.ok: – ссылка может быть не верной, нам нужно это проверить
file_like = ('photo.jpg', io.BytesIO(response.content)) – готовим полученный JPG для отправки
Добавим is_instagram_link
и get_instagram_photo
в class Bot
и изменим логику работы, при поступления нового сообщения отправляем JPG.
class Bot(object):
def on_post(self, req, resp):
# ....
if "message_new" == data.get("type"):
if not self.is_instagram_link(message_text):
group.send_messages(user_id, message='Отправьте пожалуйста ссылку на фото из instagram.com')
else:
try:
instagram_photo = self.get_instagram_photo(instagram_photo_link=message_text)
group.send_messages(user_id, image_files=[instagram_photo])
except ValueError:
group.send_messages(user_id, message='Не могу найти фото, проверьте пожалуйста ссылку')
resp.data = b'ok'
# ....
Пример работы бота
Исходный код
Дополнительные ссылки:
- https://github.com/sgaynetdinov/py-vkontakte
- https://vk.com/dev/bots_docs
- https://www.instagram.com/developer/embedding/
Автор: sgaynetdinov