• Главная
  • Контакты
Подписаться:
  • Twitter
  • Facebook
  • RSS
  • VK
  • PushAll
logo

logo

  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • За год
    • Положительные
    • Отрицательные
  • Сортировка
    • По дате (возр)
    • По дате (убыв)
    • По рейтингу (возр)
    • По рейтингу (убыв)
    • По комментам (возр)
    • По комментам (убыв)
    • По просмотрам (возр)
    • По просмотрам (убыв)
Главная
  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • Главная
  • Публикация постов Вконтакте через Trello

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

24.04.2017 07:15
sgaynetdinov 9 5300 Источник
Вконтакте API*, Python*

Предположим есть группа в Вконтакте о кино, в которой публикуются анонсы новых фильмов и ещё какая-нибудь информация. Необходимо заранее подготавливать посты и публиковать по расписанию. Для этого я собираюсь использовать доску 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

Поделиться с друзьями
-->

Комментарии (9)


  1. saluev
    24.04.2017 11:39
    #10188254
    +1

    Не планируете оформить это как power-up?


    1. sgaynetdinov
      24.04.2017 15:48
      #10188774

      Не думал, я можете кейс работы с power-up описать?


      1. thatside
        24.04.2017 18:58
        #10189060

        Собственно, Ваш сценарий использования, только в более «готовом к применению» виде. Установить powerup, добавить несколько различных настроек по типу выбора колонок, возможно, чего-либо еще, дать возможность указать группу, в которую постить — и все, плюсик в карму получен :)


  1. Bellicus
    24.04.2017 16:36
    #10188864

    А что не так с отложенной публикацией?


    1. lAfftaRl
      24.04.2017 18:58
      #10189058

      Легче составлять расписание с помощью трелло


  1. GriNAME
    24.04.2017 21:34
    #10189266
    +2

    А не подскажете как публиковать посты в канал телеграмма с помощью трелло?


    1. sgaynetdinov
      25.04.2017 08:55
      #10189654
      +1

      Используйте Telegram API и Trello API


  1. t0rr
    25.04.2017 14:26
    #10190312

    Если у кого-то вылетает Access Denied, то знайте:

    Для новых приложений ВКонтакте закрыл доступ к wallpost и открывает его только по запросу в поддержку.

    Агент службы поддержки:

    Здравствуйте,

    доступ к использованию wall.post с сервера мы предоставляем только в очень редких случаях, когда речь идёт о крупных специализированных сервисах автопостинга.

    Вы можете использовать wall.post с окном подтверждения (vk.com/dev/api_confirm)

    Команда ВК.



    1. sgaynetdinov
      25.04.2017 19:09
      #10190868

      Этот метод можно вызвать с ключом доступа пользователя, полученным в Standalone-приложении через Implicit Flow, или с использованием окна подтверждения. Требуются права доступа: wall.
      https://vk.com/dev/wall.post


      Приложения я создал 15 апреля.

      Пользователь, который получает access_token из ВК является также администратором группы, в которую добавляется пост из Trello.

      Агент поддержки из ВК имеет виду наверно случай когда приложение может делать публикации на стену не являясь администратором у данной группы.

МЕТКИ

  • Хабы
  • Теги

Python

Вконтакте API

python3

trello

vkontakte api

СЕРВИСЫ
  • logo

    CloudLogs.ru - Облачное логирование

    • Храните логи вашего сервиса или приложения в облаке. Удобно просматривайте и анализируйте их.
Все публикации автора
  • Публикация постов Вконтакте через Trello +22

    • 24.04.2017 07:15

Подписка


ЛУЧШЕЕ

  • Сегодня
  • Вчера
  • Позавчера
09:02

Загадочный «Блок №20» +68

06:55

Я выкачал 1 000 лучших статей Хабра за год, чтобы понять, почему меня так мало плюсуют +45

06:42

Что стало с «убийцами 1С»? +31

07:01

Фишки кастдева: личный опыт +23

13:01

Gravity Defied: стик-человечек на мотоцикле +19

12:14

Таск‑трекер, Петрович и три пачки сигарет. История одной цифровизации +19

12:13

Краткий обзор фейкового планшета: что нового в 2026-м году +19

07:32

Студенты против ИИ-агентов на фоне падения прибыли ИТ-рынка на 34%: единственный способ стать востребованным инженером +19

09:53

Три стадии развития коммуникации с клиентом в ИТ +18

08:00

Можно ли собрать сервер из игровых комплектующих +18

07:05

Питание пульта ДУ от нестандартных источников: индукционное и не только +17

07:00

ИТ-шаманизм — когда айтишники старой волны замыкают на себя как можно больше процессов, чтобы их не уволили +17

06:10

Свой CAM для фрезеровки плат: Windows 7, станок без API и карта высот самой фрезой +15

12:15

Air gap-кластеры Kubernetes: сеть закрыта, но не безопасна +13

09:49

10 000 вентилей NAND в реальном времени: как устроен симулятор в нашей игре на Rust +11

10:08

Российские ИБП в 2026 году: как читать реестр и где ломается замена APC +10

09:12

Gemini получила доступ в интернет и атаковала системы трех реальных компаний +10

07:55

Тестируем работу WEB-proxy для Telegram +10

06:43

Китайский гигант в мире мобильных игр: история NetEase +10

08:00

Осознанное возведение барьеров и сокращение взаимодействия между командами +9

11:54

Электронный микроскоп — штука, которая позволяет увидеть атомы +115

05:46

Как меня сократили из крупной IT‑компании и через 3 месяца я стал зарабатывать больше, чем на прошлой работе +77

07:51

Что полезно знать про процедуру увольнения по соглашению сторон +62

05:36

Почему автобус никогда не приходит вовремя, или Теорема о том, что вам не повезло +61

06:25

«Инцидент в Сасово» как зеркало современного капитализма +60

10:32

PaperKey — современная замена пароля +52

08:00

Ваш смартфон разговаривает сам с собой. Введение в UART, I2C и SPI +44

07:57

Один профессор, один калькулятор и 475 миллионов долларов, которые Intel пришлось списать +41

07:01

Как работает акустическая камера, которая показывает окружающие звуки +41

07:03

И восстали люди из пепла ядрёного нейрослопа +39

13:01

Кто стоит за бэкдорами в криптокошельках Ledger? +38

09:01

Милорд, серверное железо пожрал ИИ. Арендуем Bare Metal +31

20:55

Нужно больше инстансов, Милорд +28

07:05

Zynq 7 020 + AD9361. Часть 1. Вводная +20

08:15

От толмачей до локальных нейросетей: как я собрал приложение для перевода книг +18

13:50

Дребезг цифрового сигнала: почему инвертор ведет себя как усилитель +16

19:10

Миллион ферритовых колец ради 128 КБ: разбираем память компьютера Spacelab 1980 года +13

13:00

Странные олдскульные технологии, которые так и не взлетели, часть 5 +13

13:30

Прежде чем работать с AIDL: разбираемся, как устроен IDL +12

08:00

PromptBeats: музыка из текста прямо в браузере +11

13:01

Компьютер в кармане: вспоминаем легендарный Sony CLIE PEG-UX50 +56

08:05

Раньше были основой, а потом пропали без следа. Какие мобильные ОС мы потеряли +54

09:01

Разбор отличий между клавиатурами под Windows и Mac +52

09:04

Учим английский или любой другой иностранный язык с Claude Code: личный репетитор за 5 минут +38

10:30

Идеи Тома Вуджека об инженерном творчестве +29

16:02

Звёздные хороводы в галактике Hen 2–10 +27

08:00

Орбитальная свалка: как человечество рискует закрыть себе дорогу в космос +25

14:30

Hotreload в Rust +22

15:30

Почти выбрались из постапокалипсиса: расцвет НКР и ядерный удар в лоре Fallout +19

12:25

Пьеса про дежурство с AIOps‑агентом. Внутри 340 алертов, три ошибки и кнопка «Отмена» +18

13:20

J. W. — мечтатель, неудачник, законодатель моды +16

09:20

YPtun — один клиент вместо десятка или как мы собрали кучу протоколов в одном месте +14

11:08

ИИ в работе: воркслоп и как его избежать +12

07:47

Сверка таблиц в PostgreSQL, или О том, нужны ли для этого специальные утилиты +12

21:28

Замена Lens, которую целиком написала модель: что получилось и где мы проигрываем +10

06:31

Хронология языков программирования — и открытый редактор хронологий +9

15:30

SQL, NoSQL, NewSQL, Distributed SQL: как читать архитектуру СУБД +8

13:18

Методология оптимизации игр, или как 3 дня работы над тестовым стендом дало больше FPS, чем месяц написания кода +7

12:55

Возвращение в прошлое, которого у нас ещё не было +7

18:50

Приключения вайбкодера в Ворде, или Как две нейронки не осилили простенькую задачку +6

ОБСУЖДАЕМОЕ

  • «Инцидент в Сасово» как зеркало современного капитализма +60

    • 591   83000

    Как мы горим +8

    • 185   20000

    PaperKey — современная замена пароля +52

    • 131   84000

    Как меня сократили из крупной IT‑компании и через 3 месяца я стал зарабатывать больше, чем на прошлой работе +77

    • 126   23000

    Компьютер в кармане: вспоминаем легендарный Sony CLIE PEG-UX50 +56

    • 81   15000

    Инженерный штраф: как зарабатывать, оставаясь инженером +6

    • 67   15000

    Что стало с «убийцами 1С»? +31

    • 59   11000

    Учим английский или любой другой иностранный язык с Claude Code: личный репетитор за 5 минут +38

    • 48   60000

    Раньше были основой, а потом пропали без следа. Какие мобильные ОС мы потеряли +54

    • 48   14000

    ИТ-шаманизм — когда айтишники старой волны замыкают на себя как можно больше процессов, чтобы их не уволили +17

    • 43   5900

    Я выкачал 1 000 лучших статей Хабра за год, чтобы понять, почему меня так мало плюсуют +45

    • 38   5700

    Электронный микроскоп — штука, которая позволяет увидеть атомы +115

    • 38   14000

    Почему автобус никогда не приходит вовремя, или Теорема о том, что вам не повезло +61

    • 38   13000

    И восстали люди из пепла ядрёного нейрослопа +39

    • 37   9700

    Спросите Итана: Если существует разумная внеземная жизнь, сможем ли мы вступить в контакт? +1

    • 36   8600
  • Главная
  • Контакты
© 2026. Все публикации принадлежат авторам.