ВНИМАНИЕ: статья создана только в обучающих целях, я не призываю Вас использовать продукт полученный в конце урока для принесения неудобств или собственной выгоды
Что будем делать
Бота для автопостинга записей на стене сообщества или страницы Vk
Зачем
Для ознакомительных целей
Что нам понадобится
- Знание ЯП Python
- Python3
- Модуль для работы с XML файлами
- Python библиотеки: vk_api и time
Начнем
Для работы нам понадобится токен с разрешениями 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_apiimport timefrom modules import XML as moduleXmlXML = moduleXml.XML("settings")VK = vk_api.VkApi(token=XML.parsingFile("token"))
Далее получим все короткие адреса, где будут публиковаться записи.
import vk_apiimport timefrom modules import XML as moduleXmlXML = 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_apiimport timefrom modules import XML as moduleXmlXML = 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 groupsShortNametextPost = XML.parsingFile("textPost")intervalPost = int(XML.parsingFile("interval"))
Теперь получим все объекты, которые будут прикреплены к записи.
import vk_apiimport timefrom modules import XML as moduleXmlXML = 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 groupsShortNametextPost = 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_apiimport timefrom modules import XML as moduleXmlXML = 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 groupsShortNametextPost = 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 = Falsedef publicPosts(): passif __name__ == "__main__": done = Truewhile done: publicPosts() time.sleep(intervalPost)
Чтобы публиковать запись будем вызвать метод API wall.post и передавать параметры получение раньше. Если все сработает правильно будет выводится соответствующее сообщение в консоль.
import vk_apiimport timefrom modules import XML as moduleXmlXML = 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 groupsShortNametextPost = 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 = Falsedef 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 = Truewhile done: publicPosts() time.sleep(intervalPost)
Заключение
Вот и все, весь код готов. Скажу Вам сразу же мне 13 лет. И я хочу рассказать и поделиться тем, что я умею и считаю интересным для других. Так мою прошлую публикацию прочитали 2к+ человек, а 40 человек сохранили в закладки, хотя там и есть, что доработать. Это меня замотивировала, спасибо Вам большое.
Проект на gitHub.
ВНИМАНИЕ: статья создана только в обучающих целях, я не призываю Вас использовать продукт полученный в конце урока для принесения неудобств или собственной выгоды