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

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

Апрельские обновления в продуктах и услугах Selectel +28

09:00

Личная эффективность СТО: как не сгореть, быть полезным и не терять фокус +24

09:01

Самодельная газоразрядная Хабралампа V 1.1 +23

08:05

Запускаем раритетные платы фискальной памяти +18

07:13

Videoton TVC: непростой венгерский компьютер советской эпохи +18

08:28

Что же такое HDR? +15

10:58

Siemens A52, Nokia Lumia 800 и другие телефоны, которые были у сотрудников Selectel в детстве +12

08:11

Программный генератор случайных числовых последовательностей на RISC-V с использованием PUF в DRAM +10

06:45

Как использовать WebUI для Nginx +9

03:29

Выгорание в IT: системные причины, реальные кейсы и рабочие инструменты +9

11:28

История о свершениях одного QA: о Quality Gates и оптимизации релизных процессов в ОК +8

09:30

Как LLM могут помочь аналитикам баз данных в работе с SQL-запросами +8

08:13

Скрытые неэффективности индексных фондов, и как инвестор может их избежать +8

07:10

Открыла пекарню, научилась считать, закрыла пекарню, открыла хлебокомбинат +8

12:25

Математическое решение царской игры Ура +7

11:41

Из Москвы к Персидскому заливу на мотоцикле. Первый этап +7

11:07

.NET Digest #7 +7

09:49

ИИ в Data Governance: как мы ускорили маркировку персональных данных +7

08:54

Как работают антиботы +7

11:01

Технический долг нельзя распланировать +6

10:27

Скам на $700,000 в Solana: как токен с ростом в 4 млрд% обнуляется за секунды +73

09:01

От инженеров до барыг, или откуда растут переработки и прочая корпоративная шиза. Часть 2 +67

10:11

Как найти и потерять бэкдор в ESP32 +55

05:29

Откуда у Xiaomi так много разных устройств? +51

09:01

Всё про Generic Math в C# +48

12:11

Есть ли у AMD перспективы в AI/ML/DL. Часть 1 +43

09:05

Проект «Мультиключ». Эмулятор ключей от домофона на ESP8266 +41

06:37

Курсы по тестированию — развод, маркетинг и пустышки +41

01:28

Самоорганизация неприятностей +39

13:39

Процессор на коленке ч.1 +38

13:01

Электроэнергия из подошв ботинок? Решение: микроканальный генератор +36

09:20

Как использовать японские подходы в IT. Часть 5: в плену процесса +35

09:01

Оптимизация Spark-приложений: шаг за шагом от базовых техник до продвинутых приёмов +31

09:01

Оптимизация Spark-приложений: шаг за шагом от базовых техник до продвинутых приёмов +31

13:46

Radio Data System, SI4735 и Flipper Zero +23

09:52

Как мы в Точке сделали свой дизайн-линтер +23

10:18

Do as I do: алгоритм размещения сервисов внешних поставщиков в Маркетплейсе VK Cloud +21

10:18

Do as I do: алгоритм размещения сервисов внешних поставщиков в Маркетплейсе VK Cloud +21

04:41

Генератор синусоиды из LC-контура и отрицательного сопротивления +21

16:12

Linux для начинающих: WSL — это читерство. Как Microsoft дал нам Linux без головной боли +19

21:18

Любителям x86-64 assembler посвящается: DIY волокна в C++ +123

13:00

Как мы под Новый Год загрузили в PostgreSQL петабайт данных и что из этого вышло +98

13:01

Веб-разработка на ванильном HTML, CSS и JavaScript +65

10:51

За полчаса установил DeepSeek 1.5B, пока вы искали GPT подешевле +62

15:01

Как отстроить гитару — акустическую или электро +58

13:31

Add-on pack из 90-х: Microsoft 95 Plus! для Windows +47

08:23

MLечный путь 2025 — знания, опыт, коммьюнити. Как это было? +40

06:00

Альтернативы свинцовому аккумулятору ИБП +34

06:00

Сделали copilot-сервис для техподдержки и делимся секретами RAG c глубоким пониманием контекста +32

13:16

Как декомпозиция повышает точность распознавания текста: опыт с фотографиями СТС +31

09:01

Jellyfin Web на своём сервере. Фронтенд для медиастриминга +29

07:18

Этот крошечный винт отвечает за будущее гуманоидных роботов +27

07:00

Как быстро проверить скилы Go-разработчика: пул задач для собеседований и одна фаворитка +24

13:36

Разбираем древо ArangoDB «по веточкам». Подробный гайд по графовой БД +23

07:00

Автоматизация трехуровневой квартиры: хочу лучше, чем в Дубае +23

10:46

Ортодоксальный косплеер решает задачу Перельмана про демографию, проезжая мимо Вудстока +21

09:33

GPT-4.1: Новый уровень промптинга. Гайд от OpenAI для максимальной отдачи +21

08:07

IQ — во многом псевдонаучный обман +21

08:00

Распределённый инференс и шардирование LLM. Часть 2: скрипт vLLM, Ray Serve для вывода API и настройка KubeRay Cluster +21

09:00

Terraform уже не тот? Как Pulumi меняет правила игры в Infrastructure as Code +20

ОБСУЖДАЕМОЕ

  • Почему найм в ИТ теперь выглядит именно так +9

    • 219   51000

    HEX раздражает женщин +12

    • 175   4000

    Linux для начинающих: WSL — это читерство. Как Microsoft дал нам Linux без головной боли +19

    • 142   20000

    ООП или не ООП — вот в чём ревью +5

    • 119   2700

    За полчаса установил DeepSeek 1.5B, пока вы искали GPT подешевле +62

    • 114   50000

    Альтернативы свинцовому аккумулятору ИБП +34

    • 93   11000

    От инженеров до барыг, или откуда растут переработки и прочая корпоративная шиза. Часть 2 +67

    • 64   21000

    Этот крошечный винт отвечает за будущее гуманоидных роботов +27

    • 62   9500

    Windows против Linux: кто кого, или почему пингвин не боится окна -9

    • 60   5000

    Электроэнергия из подошв ботинок? Решение: микроканальный генератор +36

    • 58   3300

    Как упростить себе освоение Rust +18

    • 52   5600

    Как отстроить гитару — акустическую или электро +58

    • 46   7700

    IQ — во многом псевдонаучный обман +21

    • 46   6100

    Скам на $700,000 в Solana: как токен с ростом в 4 млрд% обнуляется за секунды +73

    • 35   15000

    Любителям x86-64 assembler посвящается: DIY волокна в C++ +123

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