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

/e/OS 3.2: приватный Android без слежки, который только что стал еще лучше +21

06:18

«План любой ценой»: Почему российский менеджмент превратил работу в выживание и можно ли с этим бороться +11

07:00

Киберспорт: что нужно, чтобы стать профессионалом +9

10:05

Кэширование и всё, что с ним связано +8

11:15

Как я заменил саппорт-команду ChatGPT и потом неделю разбирался с жалобами +7

09:01

Люди Х против Железной Няни в космической Матрице: странная (анти)утопия 1949 года +5

07:22

VL53L0X что это такое и с чем это едят +4

12:17

В процессе обучения нейронных сетей получаются красивые фракталы +3

09:26

Как я создаю idle-игру «Империя Кузбасс» для Telegram, VK и браузера +3

07:14

Чему я научился, обучая людей этике ИИ +3

00:00

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

08:31

Надоело включать VPN для Zwift? История создания reZwift с серверами в России +2

05:15

Как удалить отзыв на Яндекс Картах пошаговая инструкция и реальные способы +2

11:34

ASP.Net MVC vs Blazor: чья возьмет? +1

04:18

Как я получаю зарплату от зарубежных IT-компаний в 2025 году, живя в России +1

09:01

Тетрод, пентод — зачем триоду дополнительные сетки? +64

18:15

Путеводитель по матанализу, который скрывали от вас в вузе +54

07:05

Что известно о межзвёздной комете 3I/ATLAS, которую можно увидеть сейчас? +45

13:01

Как менялись фотокамеры в телефонах и почему мегапиксели — не главное +41

08:06

Оживляем самый массовый карточный таксофон двухтысячных +38

10:24

Войти в айти, выйти из айти: если защемило карьерным турникетом +35

14:52

Как решать LeetCode? Легко! Нужно просто… +33

06:24

Настраиваем nano под себя +25

16:05

История игровой журналистики в России. Часть 10. Другие журналы о компьютерных играх +24

08:34

Security by design на практике: проектирование безопасной инфраструктуры +24

16:05

Судно на воздушной подушке — насколько оно реально для самостоятельной постройки (мини модель)? +22

13:05

На заводе проекты идут по два года, а команда выгорает через полтора. Вот как я с этим справляюсь +20

13:57

Книга «Современный C#. Разработка настольных, облачных, мобильных и веб-приложений». Работа со встроенными массивами +19

10:02

Почему я выбрал Warp, а не Cursor или Claude Code: мои инструменты, MCP, подход и конкретные приёмы разработки с LLM +17

07:23

Наследие кода: разбор С и С++ модулей Erlang, которые работают десятилетиями +17

19:06

От слов к делу: как Postgres Pro строит будущее в Академгородке +14

07:05

В защиту «обычных» разработчиков +14

12:15

Шардирование сервиса объявлений Авито Доставки. Часть II +13

12:00

PHP-веб-панель для Amnezia VPN: ускоряем корпоративную автоматизацию +13

09:24

Большие деньги. В самом прямом смысле этого слова +13

08:22

Эмуляция «тетриса» Apollo из 90-х и запуск кода на оригинальном железе +102

09:01

Реставрация, которая меня сломала: Почему убрать смех из Скуби-Ду сложнее, чем сделать ремастер Тома и Джерри в 2к +68

08:00

А кто у вас отвечает за kube-api? Безопасность Kubernetes при помощи CIS Benchmark +49

12:15

Как мы воскресили русский NLP и сократили потребление памяти на 90% +48

05:06

Как изготовить корпус из листового металла +47

07:02

Почему операционный усилитель — плохой компаратор +46

08:57

Перед вами первый «торговый автомат» по продаже крепкого алкоголя. Вы не поверите, но ему уже почти три века +38

09:58

Кому нужен Graphviz, если можно написать его самому? +36

13:01

Ansible Inventory: полное руководство от localhost до AWS +35

06:01

Особенности Python, о которых вас точно спросят на техническом собеседовании. Часть 2 +33

12:11

Open source-стратегии: как МойОфис развивает открытый подход — рассказывает Тамара Щепалкина, CTO компании +32

22:46

Алфавитная идеология и буквенный символизм +30

07:38

Почему я отказался от ORM в пользу чистого SQL +30

07:00

История опенсорс-проекта LUWRAIN: как эксперименты с LLM помогают создавать невизуальные интерфейсы для незрячих +30

05:34

Эти компании заменили тысячи людей на ИИ, а потом дали заднюю. Как так вышло? +30

09:20

Тестируем плату RF Demo Kit for NanoVNA-F +29

13:15

Поднимаем внутренний мессенджер и VoIP-сервер без нарушения законодательства +27

14:09

Как ломали самый известный в мире код +22

12:15

Шардирование сервиса объявлений Авито Доставки. Часть I +22

07:05

Вкус успеха: съедобные 3D модели +21

ОБСУЖДАЕМОЕ

  • Вайбкодинг становится менее доступным: OpenAI закручивает гайки -5

    • 152   37000

    Программирование на русском языке -2

    • 119   10000

    Почему я отказался от ORM в пользу чистого SQL +30

    • 99   11000

    Путеводитель по матанализу, который скрывали от вас в вузе +54

    • 64   7300

    Эмуляция «тетриса» Apollo из 90-х и запуск кода на оригинальном железе +102

    • 51   6400

    Как менялись фотокамеры в телефонах и почему мегапиксели — не главное +41

    • 50   5700

    Реставрация, которая меня сломала: Почему убрать смех из Скуби-Ду сложнее, чем сделать ремастер Тома и Джерри в 2к +68

    • 48   8900

    Почему операционный усилитель — плохой компаратор +46

    • 46   8600

    Перед вами первый «торговый автомат» по продаже крепкого алкоголя. Вы не поверите, но ему уже почти три века +38

    • 44   7700

    Почему я выбрал Warp, а не Cursor или Claude Code: мои инструменты, MCP, подход и конкретные приёмы разработки с LLM +18

    • 38   12000

    Как изготовить корпус из листового металла +47

    • 38   12000

    Что известно о межзвёздной комете 3I/ATLAS, которую можно увидеть сейчас? +45

    • 36   36000

    Как мы воскресили русский NLP и сократили потребление памяти на 90% +48

    • 36   4400

    «План любой ценой»: Почему российский менеджмент превратил работу в выживание и можно ли с этим бороться +11

    • 30   5900

    Эти компании заменили тысячи людей на ИИ, а потом дали заднюю. Как так вышло? +30

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