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

Подписка


ЛУЧШЕЕ

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

GigaChat 3.5 — меньше, быстрее, сильнее +56

08:00

6 pro-фишек FluxCD. Выжимаем все соки из GitOps +35

08:55

Готовы проверить свои знания в AI и ML? Попробуйте решить кроссворд и выиграть мерч Selectel +34

07:03

Почему алмаз твердый, но хрупкий +27

07:00

Профессия «погоняла» теряет смысл: 80% менеджеров пойдут лесом +20

10:45

Важные языки. Часть 3. Оберон +19

06:13

YouTube 17-го века +19

04:50

Физическая память +19

08:00

От wow-эффекта и быстрых побед вайбкодинга к проектированию архитектуры и формированию полноценной AI-driven команды +16

13:01

Как устроен двигатель внутреннего сгорания +15

07:04

Как проект из ШАДа попал в Spotlight статей на конференции ICML 2026 +15

14:21

25 виртуальных процессоров в одном железе: как Space Shuttle обрабатывал ввод-вывод +14

11:56

Как сделать технические интервью предсказуемее: опыт внутренней школы Островка +14

09:01

Борис Чёрный: уроженец Одессы и создатель Claude Code +14

11:05

Панорамный DOOM 1.1 на трёх экранах: повторяем легенду под MS-DOS +13

09:30

Iron Core. Часть 3: Бессмертная командная строка +13

09:05

Если я в чем‑то и опытнее всех, так это в активном поиске работы +13

07:26

LumaBloom — DIY‑цветок, который автоматически регулирует яркость мониторов +13

12:08

Автоматическая трассировка вместо ручной: что реально нового в Delta Design 4.2 +11

12:00

От полной выгрузки к S3 и PostgreSQL: как мы доставляем гигабайты данных в память подов +11

10:53

Как троттлинг процессора ломает видеокарту через PCIe: хроники абсурда в сервисном центре DNS +66

13:30

Тегеран, 1978: Диско бессмертно +59

17:59

Слишком умный, чтобы размножиться +37

09:01

Вот бы вернуть те старые неказистые форумы +36

06:40

Старый трансивер эфир не испортит. Часть 3. Умощняемся +36

13:01

ЭВМ в народном хозяйстве: лампы, кибернетика, «Урал-1» +34

09:00

ИИ добрался до раритетов: цены на память DDR2 взлетели на 60% за три месяца +33

13:10

Съездили к ByteDance и Z.ai: роботы по паспорту, серверные карты на рынке и восемь дней внутри китайского AI +21

05:52

Книга среднего уровня — 1 +21

11:09

Галлюцинации: почему LLM «тупеют» от «умных» промптов +17

15:38

«Бот, теперь ты коммунист!» — почему бизнес под управлением ИИ проваливается, а компании не хотят в это верить? +14

16:07

Age of Mythology в 2026 году: от мифов Древней Греции до ацтеков — почему стратегия все еще жива +11

08:47

Действительно богатые сообщения в Telegram-ботах: разбираем Rich Messages +10

21:17

Claude Desktop на Linux, через прокси +9

12:05

Гибель богов. Fable и ещё 10 LLM реорганизуют код. Сравнение +9

08:31

Чума оказалась очень древней. Что произошло в Сибири 5 500 лет назад +9

17:59

Как мы научили большую языковую модель говорить на карачаево-балкарском +8

13:00

Unreal Engine 6 на Verse — это что-то крышесносное +8

17:03

Ghidra — фреймворк АНБ для реверс-инжиниринга ПО +7

15:37

«Мы сделали это»: Как мы готовили доклад в тандеме через пол-России и что поняли только после +7

08:00

«Иностранные холодные кошельки» — или нами когда-нибудь перестанут управлять идиоты? +93

23:14

Taskbar с живыми превью работающих приложений (олдскул на NET11) +45

13:19

Носители данных — «игра на выбывание» (2026.07) +35

08:15

Сэнди Петерсен и Джон Кармак: как Quake сломал id Software +34

13:02

Самодельная электрогитара: тонируем деку и подгоняем к ней гриф +32

08:30

5 новых одноплатников лета 2026 года: x86, Snapdragon и сменные процессоры +32

17:37

Используем старый Mikrotik как сигнализацию +31

09:01

«Из ниоткуда в Грецию» и похищенный врач: что стояло за волной сообщений о странных дирижаблях в США 1890-х годов? +29

09:05

Пока все ждут GTA. Вспоминаем, что ещё делала Rockstar и удивляемся некоторым наименованиям +27

10:03

Телефон из 1999 года: Alcatel One Touch Pocket. Что внутри? +24

18:05

Игра проигравшего +20

13:05

Подземный гигант: зачем Швейцария строит самую мощную батарею в мире +19

11:50

USB-ключ для ввода TOTP-кодов и сохранённого пароля +16

12:55

Различие между научной гипотезой, теорией и законом +15

09:16

Нужен ли здесь `useEffect`? 12 сценариев из React-код-ревью — от производного состояния до React 19.2 +14

14:07

«Уэбб» обнаружил новый сюрприз в ранней Вселенной: зрелое скопление галактик +13

08:27

От игры за $999 до симулятора автобуса: самые странные проекты в истории Steam +13

18:53

Как я обучил русский RAG‑сплиттер, который режет документы по индексам, а не по тексту +12

16:52

Переоценённый король +12

17:04

Иллюзия безопасности или как ваши сотрудники прямо сейчас обучают конкурентов +11

ОБСУЖДАЕМОЕ

  • Как троттлинг процессора ломает видеокарту через PCIe: хроники абсурда в сервисном центре DNS +66

    • 162   21000

    Тегеран, 1978: Диско бессмертно +59

    • 150   17000

    «Иностранные холодные кошельки» — или нами когда-нибудь перестанут управлять идиоты? +93

    • 135   26000

    Слишком умный, чтобы размножиться +37

    • 119   26000

    Хватит винить HR: почему «плохие рекрутёры» — самый удобный, но неверный ответ на кризис найма +4

    • 50   7400

    Подземный гигант: зачем Швейцария строит самую мощную батарею в мире +19

    • 49   13000

    Профессия «погоняла» теряет смысл: 80% менеджеров пойдут лесом +20

    • 46   15000

    Taskbar с живыми превью работающих приложений (олдскул на NET11) +45

    • 46   17000

    Игра проигравшего +20

    • 46   13000

    Готовы проверить свои знания в AI и ML? Попробуйте решить кроссворд и выиграть мерч Selectel +34

    • 43   6700

    Переоценённый король +12

    • 37   11000

    GigaChat 3.5 — меньше, быстрее, сильнее +56

    • 33   12000

    В чем смысл жизни с точки зрения термодинамики? -4

    • 33   11000

    Вот бы вернуть те старые неказистые форумы +36

    • 30   13000

    Используем старый Mikrotik как сигнализацию +31

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