Публикация постов Вконтакте через Trello +22
Предположим есть группа в Вконтакте о кино, в которой публикуются анонсы новых фильмов и ещё какая-нибудь информация. Необходимо заранее подготавливать посты и публиковать по расписанию. Для этого я собираюсь использовать доску Trello, где хранятся посты и Вконтакте API чтобы публиковать эти посты в группе.
Создадим доску в 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.
К карточке можно прикрепить любой файл, поэтому предварительно проверяем расширение у файла. Функция 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
- Создаём Standalone-приложение https://vk.com/editapp?act=create
- В настройках приложения нам понадобятся "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
Комментарии (9)
t0rr
25.04.2017 14:26Если у кого-то вылетает Access Denied, то знайте:
Для новых приложений ВКонтакте закрыл доступ к wallpost и открывает его только по запросу в поддержку.
Агент службы поддержки:
Здравствуйте,
доступ к использованию wall.post с сервера мы предоставляем только в очень редких случаях, когда речь идёт о крупных специализированных сервисах автопостинга.
Вы можете использовать wall.post с окном подтверждения (vk.com/dev/api_confirm)
Команда ВК.
sgaynetdinov
25.04.2017 19:09Этот метод можно вызвать с ключом доступа пользователя, полученным в Standalone-приложении через Implicit Flow, или с использованием окна подтверждения. Требуются права доступа: wall.
https://vk.com/dev/wall.post
Приложения я создал 15 апреля.
Пользователь, который получает access_token из ВК является также администратором группы, в которую добавляется пост из Trello.
Агент поддержки из ВК имеет виду наверно случай когда приложение может делать публикации на стену не являясь администратором у данной группы.
saluev
Не планируете оформить это как power-up?
sgaynetdinov
Не думал, я можете кейс работы с power-up описать?
thatside
Собственно, Ваш сценарий использования, только в более «готовом к применению» виде. Установить powerup, добавить несколько различных настроек по типу выбора колонок, возможно, чего-либо еще, дать возможность указать группу, в которую постить — и все, плюсик в карму получен :)