Скачиваем фото из Instagram с помощью бота Вконтакте

в 13:05, , рубрики: api, python, python 3.6, Вконтакте API

Скачиваем фото из Instagram с помощью бота Вконтакте - 1

В этой публикации напишем бота Вконтакте, которые принимает ссылку на фото из Instagram'a, а обратно отправляет эту фотографию.

Создаем группу в Вконтакте и в настройках сообщества включаем сообщения:
"Управление сообществом" — "Сообщения".

Для начала попробуем создать "эхо-бота".

Нужны будут следующие библиотеки для работы

falcon==1.2.0
gunicorn==19.7.1
py-vkontakte==5.53.4
requests==2.18.3

Нам нужно получить TOKEN, с помощью которого мы сможешь отправлять сообщения от имени сообщества:

"Управление сообществом" — "Настройки" — "Работа с API" — "Ключи доступа".

Скачиваем фото из Instagram с помощью бота Вконтакте - 2

Получать новые сообщения может двумя способами: "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".

Скачиваем фото из Instagram с помощью бота Вконтакте - 3

Скачиваем фото из Instagram с помощью бота Вконтакте - 4

Подтверждаем сервер для "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'

# ....

Пример работы бота
Исходный код

Дополнительные ссылки:

Автор: sgaynetdinov

Источник

Поделиться

* - обязательные к заполнению поля