ВНИМАНИЕ: статья создана только в обучающих целях, я не призываю Вас использовать продукт полученный в конце урока для принесения неудобств или собственной выгоды
Что будем делать
Бота для автопостинга записей на стене сообщества или страницы 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_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 человек сохранили в закладки, хотя там и есть, что доработать. Это меня замотивировала, спасибо Вам большое.
ВНИМАНИЕ: статья создана только в обучающих целях, я не призываю Вас использовать продукт полученный в конце урока для принесения неудобств или собственной выгоды
ссылка на оригинал статьи https://habr.com/ru/post/520860/
Добавить комментарий