• Главная
  • Контакты
Подписаться:
  • 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:01

Большинству людей плевать на качество софта +52

08:27

Телеграфируем кодом Морзе через Java Stream API (часть 1 из 2) +30

14:07

Вы тоже заказываете платы, компоненты и всячину здесь? +28

13:01

Пишем простой драйвер Linux для устройства, ничего не зная о драйверах и о USB +28

07:29

Простой ультразвуковой отпугиватель собак +27

11:34

Лучшее IT-событие этого лета. За что говорят «спасибо» Summer Merge +26

12:49

Сжатие текста в Angie: статика, динамика, производительность +17

15:18

Как мы в Авито используем split-тесты для оценки алгоритмов продвижения объявлений +14

04:50

Илон Маск создал Меха-Гитлера, а также релиз самого умного Grok 4 +13

09:00

200 тысяч единиц уже готовы, еще миллион — на подходе: разворачиваем контуры в один клик +12

07:00

Одноплатники как роутеры: новинки 2025 года и их возможности +11

05:54

MCP для новичков +11

09:10

Как я полюбил LESS и с его помощью избавился от копипасты в своём CSS-коде, а разметку сделал семантической +10

13:14

А был ли патчик? Как долго живут уязвимости в Рунете +9

08:50

Б/У Antminer S9 в помощь радиолюбителю +8

07:07

Недельный геймдев: #234 — 13 июля, 2025 +8

12:32

Как я случайно стал UI-дизайнером радиоприёмника — и заработал 60к за 15 часов +7

11:04

Разбор заданий AI CTF на Positive Hack Days Fest. Часть 2 +7

05:15

Когда JOIN тянет ко дну: как одно изменение ускорило запрос в 75 раз +7

04:45

Как информатики научились разоблачать ложь +7

09:01

От React всё также веет безумием, но все об этом молчат +88

16:16

Как «по-быстрому» сделанная игра затянула меня в геймдев на 20 лет и какие выводы я из этого сделал +85

13:39

Как выйти из IT?.. и пойти слесарем на завод. Моя попыточка дауншифтинга [1\4] +58

08:02

Commodore 64 Ultimate: возрождение легенды в 2025 году +40

13:01

Большое испытание кальциевых аккумуляторов, часть 2: недозаряд портит, а кипячение убивает +38

08:00

Без(д)воз(д)мездно, то есть даром +15

08:13

Новый рекорд по упаковке сфер неожиданно пришёл из геометрии +14

07:16

Конфаундинг, или как аналитику попасть в ловушку +14

12:00

Как я пришёл в open source в 2025-м (с утилитой для бекапа PostgreSQL), чуть не потеряв проект на ~$1500\мес в 2023-м +13

13:05

Кладбище криминальных экшенов. Почему почти все клоны GTA провалились, а студии закрылись +12

05:16

Алгоритмы для работы с большими данными в Go: HyperLogLog и Count-Min Sketch +11

17:50

Как собрать друзей на игру и не сойти с ума: мой бот для геймеров +10

08:00

Кремниевая революция по-китайски: как Пекин собирается обойти Тайвань и США к 2030 году +10

08:16

«Хочу, но боюсь и не делаю»: что делать со страхом того, что не получится? +9

10:08

Свой ChatGPT на документах: делаем RAG с нуля +8

06:15

Vue: Composables и TS это вам не Mixins и JS. С ними сложнее +8

15:35

Как ваш полет домой поможет инопланетянам определить местоположение Земли +7

09:02

Kubernetes на базе Deckhouse в облаке Linx Cloud: встроенный мониторинг, безопасность и управление сертификатами +7

12:15

Алгоритм Диница: как найти максимальный поток в сети (для начинающих) +6

04:41

Управление проектами: дайджест публикаций #36 +6

08:41

Как в РФ разрабатывали уникальный судовой радар ближней зоны в диапазоне 76 ГГц +76

09:01

Первые анекдоты о программистах: юмор айтишников на переломе тысячелетий, 1999-2000 годы +59

05:29

VLESS+Reality и Multi-hop: Архитектура VPN-цепочки для нового поколения блокировок +53

12:00

Самодельный компьютерный стол с навороченной начинкой внутри за 20 шагов +49

13:01

Голографический принцип: реальность как иллюзия +42

00:21

Исследование METR: использование Cursor замедляет опытных разработчиков на 19 % +42

14:05

Drift Skate, Freeskates, Freeline Skates, Кайф +37

18:16

Территория Большого Взрыва. Что, где и когда взорвалось +33

08:14

Xreal One Pro — подробный разбор новых AR-очков с чипом X1 и экраном до 191 дюйма +28

16:32

Девушки, котики и Flux Kontext: как выжать максимум из WebUI Forge? +19

17:29

Ещё один PID-контроллер +18

21:09

Не хватило мощности: история бренда «Техносила» +16

06:05

История игровой журналистики в России +16

11:29

«Почему топ менеджеры выбирали SAP, но...» что пошло не так у автора +14

05:48

Универсальные подсказки по промптам (продвинутые советы) (Ч.2) +11

20:45

Цистеин. Как одна аминокислота мешает худеть. И спасибо ей за это +7

14:44

Разработка требований к ПО с помощью Markdown, Git и Obsidian +7

01:17

Сделай удобно: подборка UI/UX-кейсов из цифровых и нецифровых продуктов (#18) +7

18:36

Баблишко для тех, кто вкатывается в айтишку (дубль два) +5

15:29

Разбирая бэклог. Часть 19. 10 трёхмерных консольных beat 'em up'ов. 1997-2003 +5

ОБСУЖДАЕМОЕ

  • От React всё также веет безумием, но все об этом молчат +88

    • 256   29000

    Самодельный компьютерный стол с навороченной начинкой внутри за 20 шагов +49

    • 252   46000

    VLESS+Reality и Multi-hop: Архитектура VPN-цепочки для нового поколения блокировок +53

    • 140   39000

    Территория Большого Взрыва. Что, где и когда взорвалось +33

    • 123   16000

    «Почему топ менеджеры выбирали SAP, но...» что пошло не так у автора +14

    • 82   5200

    Исследование METR: использование Cursor замедляет опытных разработчиков на 19 % +42

    • 73   17000

    No Cars Allowed? Что с трендом на улицы без авто +5

    • 72   2300

    Большинству людей плевать на качество софта +52

    • 69   8400

    Без(д)воз(д)мездно, то есть даром +15

    • 60   14000

    Хабра-харакири 2: Как я спросил, и мне ответили +4

    • 54   3000

    Как в РФ разрабатывали уникальный судовой радар ближней зоны в диапазоне 76 ГГц +76

    • 48   8300

    Простой ультразвуковой отпугиватель собак +27

    • 46   3700

    Как «по-быстрому» сделанная игра затянула меня в геймдев на 20 лет и какие выводы я из этого сделал +82

    • 42   18000

    Не хватило мощности: история бренда «Техносила» +16

    • 42   9100

    Шифрование на основе хешей -6

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