[API, Python, ВКонтакте API] Бот для автопостинга VK

Автор Сообщение
news_bot ®

Стаж: 6 лет 3 месяца
Сообщений: 27286

Создавать темы news_bot ® написал(а)
27-Сен-2020 20:30
ВНИМАНИЕ: статья создана только в обучающих целях, я не призываю Вас использовать продукт полученный в конце урока для принесения неудобств или собственной выгоды

Что будем делать
Бота для автопостинга записей на стене сообщества или страницы Vk
Зачем
Для ознакомительных целей
Что нам понадобится

Начнем
Для работы нам понадобится токен с разрешениями wall и offline. Для получения токена создайте свое Standalone-приложение Vk. И сохраните его ID.
Далее перейдите по ссылке:
oauth.vk.com/authorize?client_id=IDAPP&scope=wall,offline&redirect_uri=http://api.vk.com/blank.html&response_type=token
И вместо IDAPP подставьте ID своего приложения. Или воспользуйтесь ссылкой, которую я подготовил специально для Вас.
Если все сделано правильно Вас перекинет на другой сайт, а в URL странице в GET параметре access_token будет токен, который нам и нужен, сохраняем его.
Работа XML
Для хранения настроек созданим файл формата .xml со следующем контентом:
<settings>
  <token>token</token>
  <textPost>Text post</textPost>
  <interval>120</interval>
  <post>
    <attachments>
      <attachment>attachment</attachment>
    </attachments>
    <copyright>copyright</copyright>
    <v>5.122</v>
  </post>
  <groups>
    <group>short name group</group>
  </groups>
</settings>

Замените:
  • «token» на токен, который мы получили выше
  • «Text post» на сообщение, которое должно быть в записи
  • «attachment» на объект, который будет прикреплен к записи
  • «copyright» на ссылку источника
  • «short name group» на короткое имя(без vk.com) страницу сообщества/ пользователя, где будет проходить публикация(стена должна быть открытой для публикации)

Начнем писать код
Импортируем все нужные библиотеки, создадим экземпляр нашего модуля и авторизуемся во вконтакте от лица пользователя через токен.
import vk_api
import time
from modules import XML as moduleXml
XML = moduleXml.XML("settings")
VK = vk_api.VkApi(token=XML.parsingFile("token"))

Далее получим все короткие адреса, где будут публиковаться записи.
import vk_api
import time
from modules import XML as moduleXml
XML = moduleXml.XML("settings")
VK = vk_api.VkApi(token=XML.parsingFile("token"))
groupsId = []
groupsShortName = ""
for child in XML.parsingFile("groups", False):
    groupsShortName += child.text + ","
for group in VK.method("groups.getById", {"group_ids": groupsShortName}):
    groupsId.append(group["id"] * -1)
del groupsShortName

Теперь получим сообщение, которое будет в записи, интервал, с которым будут публиковаться записи и источник записи.
import vk_api
import time
from modules import XML as moduleXml
XML = moduleXml.XML("settings")
VK = vk_api.VkApi(token=XML.parsingFile("token"))
groupsId = []
groupsShortName = ""
for child in XML.parsingFile("groups", False):
    groupsShortName += child.text + ","
for group in VK.method("groups.getById", {"group_ids": groupsShortName}):
    groupsId.append(group["id"] * -1)
del groupsShortName
textPost = XML.parsingFile("textPost")
intervalPost = int(XML.parsingFile("interval"))

Теперь получим все объекты, которые будут прикреплены к записи.
import vk_api
import time
from modules import XML as moduleXml
XML = moduleXml.XML("settings")
VK = vk_api.VkApi(token=XML.parsingFile("token"))
groupsId = []
groupsShortName = ""
for child in XML.parsingFile("groups", False):
    groupsShortName += child.text + ","
for group in VK.method("groups.getById", {"group_ids": groupsShortName}):
    groupsId.append(group["id"] * -1)
del groupsShortName
textPost = XML.parsingFile("textPost")
intervalPost = int(XML.parsingFile("interval"))
attachments = [attachment.text for attachment in XML.parsingFile("attachments", False)]
copyright = XML.parsingFile("copyright")
v = XML.parsingFile("v")

У нас уже есть все данные, которые нам понадобятся для публикации. Осталось только сделать функцию для публикации и цикл, который будет вызывать функцию публикации.
Сначала сделаем цикл, а функцию оставим пустой. Так же код будет работать, только если будет запущен из консоли.
import vk_api
import time
from modules import XML as moduleXml
XML = moduleXml.XML("settings")
VK = vk_api.VkApi(token=XML.parsingFile("token"))
groupsId = []
groupsShortName = ""
for child in XML.parsingFile("groups", False):
    groupsShortName += child.text + ","
for group in VK.method("groups.getById", {"group_ids": groupsShortName}):
    groupsId.append(group["id"] * -1)
del groupsShortName
textPost = XML.parsingFile("textPost")
intervalPost = int(XML.parsingFile("interval"))
attachments = [attachment.text for attachment in XML.parsingFile("attachments", False)]
copyright = XML.parsingFile("copyright")
v = XML.parsingFile("v")
done = False
def publicPosts():
    pass
if __name__ == "__main__":
    done = True
while done:
    publicPosts()
    time.sleep(intervalPost)

Чтобы публиковать запись будем вызвать метод API «wall.post» и передавать параметры получение раньше. Если все сработает правильно будет выводится соответствующее сообщение в консоль.
import vk_api
import time
from modules import XML as moduleXml
XML = moduleXml.XML("settings")
VK = vk_api.VkApi(token=XML.parsingFile("token"))
groupsId = []
groupsShortName = ""
for child in XML.parsingFile("groups", False):
    groupsShortName += child.text + ","
for group in VK.method("groups.getById", {"group_ids": groupsShortName}):
    groupsId.append(group["id"] * -1)
del groupsShortName
textPost = XML.parsingFile("textPost")
intervalPost = int(XML.parsingFile("interval"))
attachments = [attachment.text for attachment in XML.parsingFile("attachments", False)]
copyright = XML.parsingFile("copyright")
v = XML.parsingFile("v")
done = False
def publicPosts():
    for groupId in groupsId:
        for i in range(1, 5):
            result = VK.method("wall.post", {
                "owner_id": groupId,
                "message": textPost,
                "attachments": attachments,
                "copyright": copyright,
                "v": v
            })
            if result["post_id"]:
                print("Good post, id post - " + str(result["post_id"]))
            else:
                print("Error posting")
if __name__ == "__main__":
    done = True
while done:
    publicPosts()
    time.sleep(intervalPost)

Заключение
Вот и все, весь код готов. Скажу Вам сразу же мне — 13 лет. И я хочу рассказать и поделиться тем, что я умею и считаю интересным для других. Так мою прошлую публикацию прочитали 2к+ человек, а 40 человек сохранили в закладки, хотя там и есть, что доработать. Это меня замотивировала, спасибо Вам большое.
Проект на gitHub.
ВНИМАНИЕ: статья создана только в обучающих целях, я не призываю Вас использовать продукт полученный в конце урока для принесения неудобств или собственной выгоды

===========
Источник:
habr.com
===========

Похожие новости: Теги для поиска: #_api, #_python, #_vkontakte_api (ВКонтакте API), #_api, #_api_vk, #_api_vkontakte, #_api_vkontakte (api вконтакте), #_python3, #_bot, #_api, #_python, #_vkontakte_api (
ВКонтакте API
)
Профиль  ЛС 
Показать сообщения:     

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы

Текущее время: 17-Май 10:05
Часовой пояс: UTC + 5