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

  • Tutorial


В этой публикации напишем бота Вконтакте, которые принимает ссылку на фото из 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'

# ....

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


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


Метки:
Поделиться публикацией
Похожие публикации
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама
Комментарии 7
  • 0

    Если ставите минус, то хотя бы напишите в комментариях причину. Это сильно поможет для написание более интересных и качественных статей.

    • 0
      Вместо py-vkontakte лучше использовать vk_api — он имеет больше фич
      • 0
        про какие фичи речь?
        • 0
          Хотя бы это — github.com/python273/vk_api/blob/master/examples/get_full_wall.py.
          Удобное использование execute прямо из питона.
          Ни один бот для ВК не будет быстро работать без использования этого метода (если много пользователей)
          github.com/python273/vk_api/blob/master/examples/execute_functions.py
          • 0
            > Удобное использование execute прямо из питона.

            про метод «execute» замечание верное, я постараюсь в ближайшем времени добавить

            > Ни один бот для ВК не будет быстро работать без использования этого метода (если много пользователей)

            про скорость замечание не верное, метод «execute» хорошо для запросов, вытащить всех пользователей в группе, все записи со стены и тд., т.е. в задачах «парсинг» данных. В этой же задача, этот метод не нужен т.к. используется «Callback API» и мы не обращаемся к серверам VK, а они сами нам присылают сообщения.

            Также в «vk_api» не нашел способа отправки сообщения и прикрепления фотографии к эту сообщению, а в "py-vkontakte" это делается двумя строчками github.com/sgaynetdinov/instasave_bot/blob/master/bot/bot.py#L29
      • 0

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

        • 0
          > Можно просто ссылку вставить в телеграмм, так даже можно видео скачать
          суть этой статьи показать возможность создание бота в вконтакте

          > но не понял как видно из директа получить
          не понял?

        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.