Как написать приложение в вк на питоне
Всем привет! Сегодня я расскажу вам немного о Пайтоновском API для соц. сети ВКонтакте.
Пост предназначен в первую очередь для школьников начинающих разработчиков, которые хотят сделать простейшее приложение.
Поскольку я сама не особо сильна в Пайтоне, о различных аспектах этого прекраснейшего языка (ООП, функциональное программирование и т.д.) я умолчу.
Получение Python
Пайтоновскую виртуальную машину под винду вместе с небогатой средой разработки IDLE можно скачать здесь.
Не советую качать версию 3.5, ибо под ней некоторые модули (ещё не обновившиеся) могут не работать.
И если вы только начинаете знакомиться с этим языком, не советую также качать версии ниже третьей.
Если вы юзаете UNIX то должны сами знать где гуглить. Под Убунтой просто обновитесь (типа sudo apt-get update).
Также рекомендую поставить pip под вашу версию языка.
Получение модуля
В командной строке или терминале введите pip install vk (pip3 install vk)
Или можете воспользоваться этой ссылкой.
Также присутствует документация с примерами.
Что надо сделать ВКонтакте?
Тыкаем там на кнопку "Создать приложение"
Вводим имя и нажимаем "Подключить приложение". Тип оставляем Standalone.
После создания приложения заходим в его настройки и копируем (запоминаем) его идентификатор, он нам позже пригодится. На скриншоте ID закрашен другим цветом.
Дополнительно можно также загрузить свою иконку, поменять имя и т.д.
Авторизация
Теперь самое интересное. Нужно получить токен авторизации.
В принципе, модуль vk вполне работает и без него. Некоторые методы могут быть вызваны вообще без авторизации на сайте. Кроме того, вы можете в самом приложении авторизоваться через свой логин и пароль (как показано в этом примере).
В принципе, говоря по-хорошему, оба способа небезопасны. Так или иначе разработчик модуля может получить доступ к вашим данным -- токену или паре логин-пароль.
Прикол в том, что токен авторизации выдаётся конкретному приложению с конкретными правами доступа и конкретным ID. Т.е. в принципе, разрабу модуля он бесполезен.
А вот ваши данные авторизации могут быть вполне полезны. Потому я считаю что лучше юзать токен. По крайней мере, если у вас возникнут какие-то подозрения, не придётся менять пароль и засвеченную почту (номер телефона).
Ещё одним плюсом токена для параноиков является то, что он может быть выдан на определённый срок. В общем, юзайте лучше токены. Это немного сложнее, но безопаснее.
Как получить токен авторизации для Standalone-приложения описано здесь. Вам (или пользователю приложения) нужно перейти по ссылке определённого вида, авторизоваться ВКонтакте (если вы это ещё не сделали), в открывшемся фрейме внимательно прочесть какие разрешения запрашивает приложение, выдать приложению доступ, и из перенаправленной ссылки вытащить токен авторизации.
Вот пример ссылки:
Это запрос к сайту на выдачу токена авторизации для нашего Standalone-приложения. Разберём подробнее.
client_id= -- вместо подставьте ID вашего приложения.
scope=friends,photos ,audio,video,docs,notes,pages,status,wall,groups,messages,notifications,offline -- самое интересное. Это список запрашиваемых разрешений. Полный список возможных разрешений можно найти здесь.
Будьте крайне внимательны при составлении этого списка. Фактически, он определяет все возможности, доступные обладателю токена. Особо обратите внимание на последний параметр offline -- при его использовании будет выдан бессрочный токен авторизации.
После того, как юзер даст приложению доступ со страницы ВК, его перебросит на пустую страницу с URL вида
С некоторыми дополнительными параметрами. Для авторизации приложению необходим токен, стоящий в параметре access_token. Вам необходимо его вытащить.
После этого необходимо авторизоваться в самой программе. На сайте разработчика модуля приводится такой простой пример:
session = vk.Session(access_token='')
api = vk.API(session)
После этого у объекта api вы можете вызывать все методы, перечисленные на этой странице.
К примеру, написание первого поста:
api.wall.post(message = 'Hello, World!')
Приведёт к появлению на вашей стене текстового поста.
Лирическое отступление относительно токенов и добросовестности
Как видите, процедура получения токена довольно проста, а его наличие даёт практически неограниченный контроль над страницей пользователя (практически такой же, как и с веб-интерфейса).
Естественно, это накладывает определённые требования к добросовестности пользователей. Любой из вас может обмануть доверчивого друга или соседа, прислав ему ссылку и попросив скопировать ответ (хотя на странице-редиректе и стоит напоминание о том, что ссылку с токеном нельзя никому присылать) либо получив на короткое время доступ к незапароленному компьютеру.
Я искренне надеюсь что вы не станете так делать.
Написание простейшей программы с использованием API
Давайте напишем какую-нибудь полезную программу, использующую API ВКонтакте.
import time
import SendEmail
def searchForUser(user_list, ID):
\tfor user in user_list:
\t\tif type(user) is int:
\t\t\tcontinue
\t\tif user['uid'] == ID:
\t\t\treturn user['first_name'] + ' ' + user['last_name'] + '\n'
def checkMessages(message_list):
\tfor message in message_list:
\t\tif type(message) is int:
\t\t\tcontinue
\t\tif message['read_state'] == 0:
\t\t\tif 'chat_id' not in message:
\t\t\t\tIDS.append(str(message['uid']))
\tfor message in message_list:
\t\tif type(message) is int:
\t\t\tcontinue
\t\tif message['read_state'] == 0:
\t\t\tif 'chat_id' not in message:
\t\t\t\ttext = text + searchForUser(user_list, message['uid']) + message['body'] + '\n'
\treturn text
session = vk.Session(access_token = '')
api = vk.API(session)
\tmessage = api.messages.get(time_offset = 0)
\tif len(message) != 1 and message[1]['read_state'] == 0:
\t\tSendEmail.sendEMail(checkMessages(message))
\t\tprint('No new messages!')
\t\tSendEmail.sendEMail('No new messages!')
\t\ttime.sleep(600)
Разберём построчно что делает этот код.
Функция searchForUser(user_list, ID) ищет пользователя по его ID в списке user_list объектов user. Когда она его находит, то возвращает строку с именем и фамилией юзера. Проверка на тип сделана т.к. API ВКонтакте частенько возвращает первым элементом списка объектов длину этого списка.
И наконец основная часть программы. Сначала мы авторизуемся (токен можно записать прямо в Пайтоновский файл либо читать из текстового файла), затем в бесконечном цикле делаем следующее:
2) Если есть, то вытаскиваем функцией checkMessages(message_list) строку вида
Юзер Юзеров
Юзер Юзеров
Другой Юзер Юзеров
3) Вызовом time.sleep(600) ждём ещё 10 минут.
Если вы планируете писать своё приложение, обращайте также внимание на ограничения по частоте запросов к API (в конце страницы).
Статья рассчитана для начинающих программистов. Метод работы программы очень прост и любой, кто умеет разбираться в синтаксисе Питона и немного знающий ООП сможет его реализовать для своих нужд. Но в принципе даже не зная никаких принципов ООП, думаю можно научиться добавлять простые функции или хотя бы в крайнем случае использовать готовые исходники из GitHub.
Что есть в этой статье?
Создание основы бота. После этого его можно будет запрограммировать как-угодно. Автоматизировать какую-то рутину или использовать как собеседник.
Улучшенная (слегка усложненная версия бота). Я решил сначала представить простой процедурный код бота, а затем слегка усложнить его, добавив функции, значительно улучшающие работу бота.
Добавление функции передачи погоды. Научим бота говорить нам погоду.
Создание бота в ВК
Начнем мы с создания бота, а именно группу в ВК.
Для это нужно зайти в «группы» → «создать сообщество».
Выберите любой тип сообщества и введите название, тематику группы.
На открывшейся странице настроек, выберите «Работа с API»
Далее, необходимо создать API-ключ.
Затем выберите нужные вам параметры с доступом для вашего API-ключа.
Скорее всего, вам придётся подтверждать действие в ВК с помощью мобильного телефона. Затем скопируйте полученный API-ключ где-нибудь в файл. Он нам еще понадобится.
Приступим к программной части бота
Мы не будем реализовывать его через запросы к ВК, а если быть точнее, просто используем библиотеку VkLongPool, которая сделает это за нас.
Для этого необходима библиотека vk_api. Установим его через pip:
Но лично я работаю с виртуальным окружением Anaconda. С этим зачастую возникают проблемы при первой работе. Обычно проблема в том, что система не распознают команду «python». А решается эта проблема путем добавления его в PATH.
Приступим к самому коду:
Импортируем нужные модули:
Авторизовавшись как сообщество и настроив longpool:
В нем мы циклически будем проверять на наличие event-ов. А получить тип event-а сможем с помощью event.type.
Итак, мы создали очень простого бота в ВК с такой же простой реализацией. А логику бота можно программировать как душе угодно.
Теперь приступим к более реальному программированию
Создадим класс VkBot в файле vk_bot.py, который будет служить нам ботом.
И добавим туда метод с помощью которого можно получить имя пользователя через vk id.
Это делается с помощью beatifulsoup4.
Устанавливаем если его нет:
На него есть достаточное количество статей, которые стоит изучить. С помощью него же создадим еще несколько методов:
Измените параметр _get_weather на нужный город, в последствии этот метод можно будет вызывать с указанием города, а по умолчанию будет ваше указанное значение.
С помощью этих методов мы сможем получить время и погоду. Эти методы вырезаны из моего основного проекта бота. Следует организовать их в отдельных пакетах и классах, применяя наследование. Но ради примера работы, я решил вместить все это в один класс бота, что конечно плохо.
Теперь вернемся к запускаемому файлу:
Импортируем класс нашего бота:
Изменим основной наш цикл:
Это усложнение программы просто необходимо, если вы хотите дальше улучшить функционал бота:
Создайте отдельные пакеты и классы для каждой функции _get_time и _get_weather. Организуйте наследование с общего класса. И каждую новую функцию определяйте в отдельных классах, лучше всего, конечно, еще и разделить на пакеты.
Добавьте словарь с ключом идентификатора пользователя и значением объекта бота. Таким образом, не придется каждый раз в цикле создавать объект бота. К тому же, это обеспечит пользование несколькими пользователями сразу в сложных конструкциях.
Таким образом, выбрав хорошую архитектуру кода, вы сможете создать многофункционального бота.
К примеру, я научил своего бота проигрывать музыку на компьютере, открывать сайты сидя с телефона. Присылать рецепты блюд на завтрак, обед, ужин.
Это новый вид статьи, в котором мы не будем говорить про PHP, многим python превосходит php, а для начинающих он покажется проще. Данная статья будет содержать в себе следующие шаги:
После установки запускаем командую строку:
И пишем команду:
Если Вы сделали все правильно, то увидите список команд и опций
На этом установка Python успешно завершена. Переходим к установке IDE PyCharm
Забегая вперед, у меня по умолчанию в настройках программы стоял Python 2.7
Нам нужна последняя версия, открываем File -> Settings. -> Project interpreter и из выпадающего меню выбираем последнюю версию, или добавляем ее туда нажав на Show All…
Теперь можно создавать новый проект.
В Pycharm выбираем: File -> New Project и создаем новый проект, выбрав необходимые настройки:
Теперь создаем новый файл, назовем его new.py, так как Python использует расширение .py (английскими буквами, не путайте) расширение указывать не обязательно.
Пишем наш первый самый простой код:
И нажав правой кнопкой мыши по файлу, выбираем: Run 'new'
Все работает. Теперь нам нужно установить библиотеку vk_api, для этого открываем терминал прямо в PyCharm и пишем команду:
Running setup.py install for vk-api … done
Successfully installed certifi-2019.6.16 chardet-3.0.4 enum34-1.1.6 idna-2.8 requests-2.22.0 six-1.12.0 urllib3-1.25.3 vk-api-11.4.0
Если в конце видите такой текст, библиотека успешно установлена, можно импортировать ее в проект и писать первый код:
Это код из примера, благодаря нему мы убедимся что сделали все правильно. Вставить его нужно в файл new.py предварительно удалив все оттуда, что мы написали ранее.
Для начала настроим наше сообщество.
Создаем ключ
Копируем ключ и вставляем его в наш скрипт:
Вместо 'your_group_token' указываем ключ сообщества
Вместо 'your_group_id' указываем ID нашего сообщества
Теперь переходим во вкладку Long Poll APIи включаем его
Далее, обязательно включаем тип событий, это частая ошибка при создании ботов, забыв включить события, бот не будет работать! Выбираем все что есть.
Как узнать названия других событий? Они будут выводится в консоли, так как в коде используется:
Тут мы получили 2 события:
VkBotEventType.WALL_POST_NEW - Новый пост
VkBotEventType.GROUP_OFFICERS_EDIT - Выдача админ прав в самой группе
Документация и больше примеров можно посмотреть на GitHub . Если Вам интересен этот язык и вы хотите видеть больше статей по Python, пишите в комментарии об этом!
И все же в чем разница между CallBack API и Long Poll API? А разница есть и она большая.
Когда Вы используете CallBack API, ВК сам отправляет Вам происходящее событие на сервер, нам остается только получить его и обработать, у Long Poll API все наоборот, ВК ничего не отправляет, а хранит все события у себя на серверах, Вам нужно самому их получать и обрабатывать, Long Poll API подходит для высоко нагруженных проектов, в идеале советуем использовать оба типа получения событий. На этом наша статья подходит к концу, в следующий раз мы напишем как запустить Long Poll используя PHP, всем хорошего кодинга и настроения
Статья рассчитана для начинающих программистов. Метод работы программы очень прост и любой, кто умеет разбираться в синтаксисе Питона и немного знающий ООП сможет его реализовать для своих нужд. Но в принципе даже не зная никаких принципов ООП, думаю можно научиться добавлять простые функции или хотя бы в крайнем случае использовать готовые исходники из GitHub.
Что есть в этой статье?
Создание основы бота. После этого его можно будет запрограммировать как-угодно. Автоматизировать какую-то рутину или использовать как собеседник.
Улучшенная (слегка усложненная версия бота). Я решил сначала представить простой процедурный код бота, а затем слегка усложнить его, добавив функции, значительно улучшающие работу бота.
Добавление функции передачи погоды. Научим бота говорить нам погоду.
Создание бота в ВК
Начнем мы с создания бота, а именно группу в ВК.
Выберите любой тип сообщества и введите название, тематику группы.
На открывшейся странице настроек, выберите «Работа с API»
Далее, необходимо создать API-ключ:
Затем выберите нужные вам параметры с доступом для вашего API-ключа:
Скорее всего, вам придётся подтверждать действие в ВК с помощью мобильного телефона. Затем скопируйте полученный API-ключ где-нибудь в файл. Он нам еще понадобится. Выглядит он так:
Приступим к программной части бота
Мы не будем реализовывать его через запросы к ВК, а если быть точнее, просто используем библиотеку VkLongPool, которая сделает это за нас.
Для этого необходима библиотека vk_api. Установим его через pip:
Но лично я работаю с виртуальным окружением Anaconda. С этим зачастую возникают проблемы при первой работе. Обычно проблема в том, что система не распознают команду «python». А решается эта проблема путем добавления его в PATH.
Приступим к самому коду:
Импортируем нужные модули:
Затем пропишем легкий и понятный код:
Авторизовавшись как сообщество и настроив longpool:
Войдем в основной цикл:
В нем мы циклически будем проверять на наличие event-ов. А получить тип event-а сможем с помощью event.type.
Итак, мы создали очень простого бота в ВК с такой же простой реализацией. А логику бота можно программировать как душе угодно.
Теперь приступим к более реальному программированию
Создадим класс VkBot в файле vk_bot.py , который будет служить нам ботом.
И добавим туда метод с помощью которого можно получить имя пользователя через vk id.
Это делается с помощью beatifulsoup4.
Устанавливаем если его нет:
На него есть достаточное количество статей, которые стоит изучить. С помощью него же создадим еще несколько методов:
Измените параметр _get_weather на нужный город, в последствии этот метод можно будет вызывать с указанием города, а по умолчанию будет ваше указанное значение.
С помощью этих методов мы сможем получить время и погоду. Эти методы вырезаны из моего основного проекта бота. Следует организовать их в отдельных пакетах и классах, применяя наследование. Но ради примера работы, я решил вместить все это в один класс бота, что конечно плохо.
Теперь вернемся к запускаемому файлу:
Импортируем класс нашего бота:
Изменим основной наш цикл:
Это усложнение программы просто необходимо, если вы хотите дальше улучшить функционал бота:
Создайте отдельные пакеты и классы для каждой функции _get_time и _get_weather. Организуйте наследование с общего класса. И каждую новую функцию определяйте в отдельных классах, лучше всего, конечно, еще и разделить на пакеты.
Добавьте словарь с ключом идентификатора пользователя и значением объекта бота. Таким образом, не придется каждый раз в цикле создавать объект бота. К тому же, это обеспечит пользование несколькими пользователями сразу в сложных конструкциях.
Таким образом, выбрав хорошую архитектуру кода, вы сможете создать многофункционального бота.
К примеру, я научил своего бота проигрывать музыку на компьютере, открывать сайты сидя с телефона. Присылать рецепты блюд на завтрак, обед, ужин.
Вы же можете редактировать бота под себя.
Основной проект бота (улучшенный) на GH:
Также, может быть, если надо сделаю статьи на тему «Управлением через ВК компьютером», «Архитектуру бота», «Хостинг сервера с телефона». Все эти упомянутые функции есть в основном проекте. Если есть вопросы можете писать, отвечу по мере желания. О желаемых статьях также пишите в личку.
Для работы бота необходим
Python 3.6+ или PyPy3.5
С версиями ниже бот не работает
Текущая версия бота: 6.0
По умолчанию бот отзывается на префикс: ! . Сменить их можно в settings.py на 32 строке ( PREFIXES = ('!', ) ).
Общение с ботом (элементы чат-бот)
VBot так-же позволяет развлекать пользователей беседами.
Инструкции по написанию логики бесед вы можете найти в chat/chat.py, а так-же в настройках.
Вы можете сами описание поведение бота, или воспользоваться ChatterBot.
Настроить ChatterBot вы можете в chat/chatter.py внизу(класс ChatterBot).
Миграции производятся с помощью файла migrate.py в папке scripts
В папке plugins есть пример плагина в файле example.py, отвечающий на команду !тест . В нём подробно расписана структура плагина. Для примера работы plugin.data или plugin.temp_data вы можете посмотреть memo.py, weather.py. Для примера цикличных задач friends.py.
Там есть и другие плагины, код которых можно просмотреть для понимания того, что можно сделать с помощью бота.
Каждый плагин должен иметь экземпляр класса Plugin (из plugin_system) под именем (обязательно) plugin. Все команды, на которые подписывается плагин, должны быть в нижнем регистре.
Вот пример простого плагина:
Для хранения данных используется peewee-async.
После импорта всего из database(именно таким образом)
Вы можете использовать db, который является экземпляром peewee_async.Manager. В database.py хранятся основные модели бд. Каждый плагин может создавать свои модели после импорта database с помощью, например, такого объявления:
Помле этого можно рассматривать NameForYourModel как обычную модель.
Плагины размещаются в папке plugins . Если два плагина имеют одинаковые команды - они обрабатываются в обоих плагинах.
Плагины могут работать со всеми методами API ВКонтакте.
Читайте также: