Публикация постов Вконтакте через Trello

от автора

Предположим есть группа в Вконтакте о кино, в которой публикуются анонсы новых фильмов и ещё какая-нибудь информация. Необходимо заранее подготавливать посты и публиковать по расписанию. Для этого я собираюсь использовать доску Trello, где хранятся посты и Вконтакте API чтобы публиковать эти посты в группе.

image

Создадим доску в Trello с названием "Кино", а в ней два листа "Новинки недели" и "Скоро в прокате". Добавим туда 4 карточки, 2 с публикацией на сегодня, 1 на завтра и 1 без даты.

Для работы с Trello API и Вконтакте API нам понадобятся следующие библиотеки.

$ pip3 install py-trello $ pip3 install py-vkontakte

Доступ к Trello API

KEY и TOKEN получаем тут https://trello.com/app-key

import trello client = trello.TrelloClient(api_key=KEY, token=TOKEN) board = client.get_board(ID)  # например https://trello.com/b/nC8QJJoZ/, где ID — nC8QJJoZ

С помощью "Due Date" в карточке Trello мы задаём, время когда нужно опубликовать в Вконтакте.

def is_card_can_published(trello_card):     if not trello_card.due_date:         return False      now_unixtime = datetime.datetime.utcnow().replace(tzinfo=None).timestamp()     card_due_unixtime = trello_card.due_date.replace(tzinfo=None).timestamp()      delta = card_due_unixtime - now_unixtime     return True if delta <= 0 else False  card_items = (card for card in board.open_cards() if is_card_can_published(card))

Расписание публикаций можно посмотреть с помощью внутреннего календаря Trello.

image

К карточке можно прикрепить любой файл, поэтому предварительно проверяем расширение у файла. Функция get_attachment_in_card возвращает кортеж "имя файла" и "байтовую строку изображения", который используются, для загрузки в ВК.

import os import requests  def is_image_file(attachment_url):     _, file_extension = os.path.splitext(attachment_url)      if file_extension not in ('.jpg', '.gif', '.png'):         return False      return True  def download_attachment(attachment_url):     response = requests.get(attachment_url, stream=True)     return response.content  def get_attachment_in_card(card):     for attachment in card.get_attachments():         if not is_image_file(attachment.url):             continue          binary_content = download_attachment(attachment.url)         _, filename = os.path.split(attachment.url)         yield (filename, binary_content)

Доступ к Вконтакте API

  1. Создаём Standalone-приложение https://vk.com/editapp?act=create
  2. В настройках приложения нам понадобятся "ID_приложения" и "Защищённый_ключ"

https://vk.com/dev/authcode_flow_user

>>> import vk >>> vk.create_url_get_code("ID_приложение", 'https://oauth.vk.com/blank.html', scope='wall, photos')  # ссылка для получения CODE >>> vk.create_access_token("ID_приложение", "Защищённый_ключ", "https://oauth.vk.com/blank.html", "CODE")  # возвращает ACCESS_TOKEN

Получаем группу ВК через py-vkontakte

import vk vk.set_access_token(ACCESS_TOKEN) group = vk.get_group(ID)  # vk.com/apiclub, где ID — apiclub или vk.com/club1, где ID — 1

Используем нашу функцию "get_attachment_in_card" для получения изображения из карточки Trello. Загружаем изображения в ВК и создаем публикацию в группе. После публикации поста в Вконтакте, "due date" помечаем как выполненное.

from vk.photos import Photo  for card in card_items:     attachment_items = \         {filename: binary_content for filename, binary_content in get_attachment_in_card(card)}     photo_items = Photo.upload_wall_photos_for_group(group.id, attachment_items.items())     group.wall_post(message=card.name + '\n' + card.description, attachments=photo_items)     card.set_due_complete()

GitHub

ссылка на оригинал статьи https://habrahabr.ru/post/327216/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *