ВНИМАНИЕ: статья создана только в обучающих целях, я не призываю Вас использовать продукт полученный в конце урока для принесения неудобств или собственной выгоды

Что будем делать


Бота для автопостинга записей на стене сообщества или страницы 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.

ВНИМАНИЕ: статья создана только в обучающих целях, я не призываю Вас использовать продукт полученный в конце урока для принесения неудобств или собственной выгоды