Автоматизация работы с ВКонтакте с помощью Python

VK

VK_API (ВКонтакте API) представляет собой программный интерфейс, который предоставляет разработчикам доступ к различным функциональным возможностям и данным социальной сети ВКонтакте. Этот API позволяет взаимодействовать с различными сервисами VK, такими как пользовательские профили, друзья, фотографии, группы и многое другое.

Какие возможности открывает VK_API:

  1. Получение информации о пользователях:
    • Доступ к основной информации о профиле пользователя, такой как имя, фамилия, дата рождения и другие.
  2. Работа с друзьями:
    • Получение списка друзей пользователя.
    • Поиск друзей по различным параметрам.
  3. Работа с группами:
    • Получение информации о группах.
    • Управление участниками группы.
  4. Работа со стеной:
    • Постинг на стену пользователя.
    • Получение записей со стены пользователя.
  5. Работа с сообщениями:
    • Отправка и получение сообщений.
  6. Работа с фотографиями и видео:
    • Получение фотографий и видеозаписей пользователя.
    • Загрузка новых фотографий и видео.

VK_API может быть полезен для различных задач, включая:

  • Автоматизация публикаций:
    • Разработка скриптов для автоматического размещения новостей, фотографий или видео на стене пользователя или в группах.
  • Анализ данных:
    • Использование данных из VK_API для анализа активности пользователей, взаимодействия с сообществами и других социальных аспектов.
  • Социальные боты:
    • Создание чат-ботов для автоматического ответа на сообщения, отправки уведомлений и других социальных взаимодействий.
  • Работа с сообществами:
    • Управление сообществами, мониторинг активности и взаимодействие с участниками.

Установка VK_API

Для того чтобы начать использовать VK_API в своих проектах на Python, необходимо установить соответствующую библиотеку. Используемый инструмент для установки библиотек в Python — pip.

Шаги по установке:

  1. Откройте терминал или командную строку:
    • На Windows: можно использовать cmd или PowerShell.
    • На macOS и Linux: можно использовать терминал.
  2. Введите команду для установки VK_API:
    pip install vk-api
    

    Эта команда сообщит pip о необходимости установить библиотеку VK_API из Python Package Index (PyPI).

  3. Дождитесь завершения установки: После выполнения команды pip начнет загрузку и установку библиотеки. Подождите, пока процесс завершится.

Авторизация в VK

Токен доступа (access token) — это специальный ключ, который предоставляет программам и приложениям доступ к определенным данным или функциональности в рамках VK_API. Он служит в качестве виртуального «ключа», который приложение предоставляет для идентификации и авторизации себя в системе ВКонтакте. Токен нужен для того, чтобы обеспечить безопасность и контроль доступа к данным пользователя.

Процесс получения токена доступа для работы с VK_API:

  1. Создание приложения в VK:
    • Перейдите на страницу для разработчиков ВКонтакте и создайте новое приложение.
    • Заполните необходимые поля, такие как название, тип приложения и описание.
    • После создания приложения, вы получите ID приложения и Защищенный ключ.
  2. Получение кода авторизации:
    https://oauth.vk.com/authorize?client_id=CLIENT_ID&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=SCOPE&response_type=code&v=5.131
    
    • Сформируйте URL для получения кода авторизации. Замените CLIENT_ID на ID вашего приложения.
      • SCOPE — список разрешений, которые ваше приложение запрашивает у пользователя (например, friends, photos, wall).
      • Токен доступа, который вы получите на следующем шаге (3) живет только 24 часа. Если нужен бессрочный доступ, указывайте в SCOPE разрешение offline.
      • В итоге, вы перейдете на страницу авторизации ВКонтакте.
  3. Получение токена доступа:
    https://oauth.vk.com/access_token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&redirect_uri=https://oauth.vk.com/blank.html&code=CODE
    
    • После успешной авторизации, вы будете перенаправлены на redirect_uri с параметром code в URL.
    • Используйте этот код для запроса токена доступа с помощью следующего запроса:
      • Замените CLIENT_ID, CLIENT_SECRET и CODE соответственно.
      • В ответ вы получите JSON, в котором будет указан ваш токен доступа.

Авторизация без использования токена:

В определенных случаях, например, при работе с открытыми данными, можно использовать методы VK_API без авторизации с токеном. Однако, большинство операций требуют наличия токена, особенно при работе с данными пользователя, друзьями, группами и другими приватными данными.

Авторизация без токена может быть полезной для просмотра публичных данных, например, информации о публичных группах или открытых профилях.

Первая программа. подключаемся к VK

Для использования VK_API в своем коде необходимо создать объект VKSession и передать ему токен доступа. Затем этот объект можно использовать для создания объекта VK_API.

Пример кода:

from vk_api import VkApi, VkUpload
from vk_api.longpoll import VkLongPoll, VkEventType

# Ваш токен доступа
token = 'ваш_токен_доступа'

# Создаем объект VKSession
vk_session = VkApi(token=token)

# Получаем объект VK_API
vk = vk_session.get_api()

# Создаем объект для загрузки медиафайлов
upload = VkUpload(vk_session)

Подключение к VK_API:

После создания объекта VK_API, вы готовы к подключению к VK_API и взаимодействию с социальной сетью. В этом уроке мы будем использовать VK_API для выполнения различных операций, таких как получение информации о пользователе, постинг на стену, и т.д.

Пример подключения и выполнения простой операции:

# Получение информации о текущем пользователе
user_info = vk.users.get()

# Вывод информации о пользователе
print(user_info)

В данном примере, объект vk представляет собой интерфейс для выполнения различных методов VK_API, таких как users.get(), wall.post() и др. Токен доступа, переданный при создании объекта vk_session, автоматически используется для аутентификации запросов к VK_API.

Как получить список друзей пользователя

Для получения списка друзей пользователя с использованием VK_API на Python, вы можете воспользоваться методом friends.get().

from vk_api import VkApi
from vk_api.exceptions import ApiError

# Ваш токен доступа
token = 'ваш_токен_доступа'

# Создаем объект VKSession
vk_session = VkApi(token=token)

# Получаем объект VK_API
vk = vk_session.get_api()

try:
    # Получение списка друзей пользователя
    friends = vk.friends.get()
    
    # Вывод списка друзей
    print("Список друзей пользователя:")
    for friend_id in friends['items']:
        friend_info = vk.users.get(user_ids=friend_id, fields='first_name,last_name')
        print(friend_info[0]['first_name'], friend_info[0]['last_name'])

except ApiError as e:
    print(f"Ошибка VK API: {e}")

Обратите внимание, что в этом примере мы используем метод vk.friends.get(), который возвращает идентификаторы друзей текущего пользователя. Затем мы используем метод vk.users.get() для получения дополнительной информации о каждом друге (имя и фамилия) и выводим эту информацию.

Не забудьте заменить 'ваш_токен_доступа' на реальный токен доступа.

Получение списка друзей произвольного пользователя

Для получения списка друзей другого пользователя по его идентификатору (id) с использованием VK_API на Python, вы можете также воспользоваться методом friends.get() и указать id нужного пользователя.

from vk_api import VkApi
from vk_api.exceptions import ApiError

# Ваш токен доступа
token = 'ваш_токен_доступа'

# ID пользователя, чей список друзей мы хотим получить
target_user_id = 'идентификатор_пользователя'

# Создаем объект VKSession
vk_session = VkApi(token=token)

# Получаем объект VK_API
vk = vk_session.get_api()

try:
    # Получение списка друзей другого пользователя
    friends = vk.friends.get(user_id=target_user_id)
    
    # Вывод списка друзей
    print(f"Список друзей пользователя с ID {target_user_id}:")
    for friend_id in friends['items']:
        friend_info = vk.users.get(user_ids=friend_id, fields='first_name,last_name')
        print(friend_info[0]['first_name'], friend_info[0]['last_name'])

except ApiError as e:
    print(f"Ошибка VK API: {e}")

В этом примере в переменной target_user_id укажите идентификатор (id) пользователя, чей список друзей вы хотите получить. Затем мы используем метод vk.friends.get() с указанием user_id=target_user_id для получения списка друзей указанного пользователя.

 Постинг на стену

Для постинга на стену пользователя, сообщества или другого пользователя с использованием VK_API, вы можете воспользоваться методом wall.post().

Для постинга на стену, вам понадобится верифицировать свою личность как разработчика. Для этого потребуется создать stand-alone приложение и отправить свои паспортные данные. Без верификации, публикация на стену не работает!

Пример кода для постинга на свою собственную стену:

from vk_api import VkApi
from vk_api.exceptions import ApiError

# Ваш токен доступа
token = 'ваш_токен_доступа'

# Текст поста
post_text = 'Привет, мир! Этот пост создан с использованием VK_API на Python.'

# Создаем объект VKSession
vk_session = VkApi(token=token)

# Получаем объект VK_API
vk = vk_session.get_api()

try:
    # Постинг на свою стену
    response = vk.wall.post(message=post_text)
    
    # Вывод информации о созданном посте
    print(f"Пост успешно создан. ID поста: {response['post_id']}")

except ApiError as e:
    print(f"Ошибка VK API: {e}")

В приведенном примере мы используем метод vk.wall.post() для размещения сообщения на стене текущего пользователя. Вы можете добавить дополнительные параметры, такие как прикрепление изображений или ссылок, указав их в соответствующих аргументах метода.

Если вы хотите опубликовать пост в сообществе или на стене другого пользователя, вам нужно указать owner_id в методе vk.wall.post():

# ID сообщества или пользователя, на стену которого вы хотите опубликовать пост
target_owner_id = 'идентификатор_сообщества_или_пользователя'

try:
    # Постинг на стену другого пользователя или сообщества
    response = vk.wall.post(owner_id=target_owner_id, message=post_text)
    
    # Вывод информации о созданном посте
    print(f"Пост успешно создан. ID поста: {response['post_id']}")

except ApiError as e:
    print(f"Ошибка VK API: {e}")

Сложный постинг на стену видео и изображений в цикле

Для автоматизации постинга на стену с использованием цикла и данных из списка, давайте представим, что у нас есть список постов, каждый из которых представлен словарем. Каждый словарь может содержать текст поста, изображения и/или видео. Давайте использовать такую структуру данных и напишем пример кода.

Пример структуры данных:

posts_data = [
    {
        'text': 'Текст первого поста',
        'images': ['image1.jpg', 'image2.jpg'],
        'videos': ['video1.mp4']
    },
    {
        'text': 'Текст второго поста',
        'images': ['image3.jpg'],
        'videos': []
    },
    # ... добавьте другие посты по аналогии
]

Пример кода для автоматизации постинга:

from vk_api import VkApi
from vk_api.exceptions import ApiError

# Ваш токен доступа
token = 'ваш_токен_доступа'

# ID сообщества, на стену которого вы хотите опубликовать посты
target_group_id = 'идентификатор_сообщества'

# Создаем объект VKSession
vk_session = VkApi(token=token)

# Получаем объект VK_API
vk = vk_session.get_api()

# Список постов с данными
posts_data = [
    {
        'text': 'Текст первого поста',
        'images': ['image1.jpg', 'image2.jpg'],
        'videos': ['video1.mp4']
    },
    {
        'text': 'Текст второго поста',
        'images': ['image3.jpg'],
        'videos': []
    },
    # ... добавьте другие посты по аналогии
]

try:
    # Постинг на стену сообщества
    for post in posts_data:
        attachments = []

        # Прикрепление изображений, если они есть
        if 'images' in post:
            for image in post['images']:
                photo = vk.photos.getWallUploadServer(group_id=target_group_id)
                uploaded_photo = vk.photos.saveWallPhoto(server=photo['server'], photo=photo['photo'], hash=photo['hash'])
                attachments.append(f"photo{uploaded_photo[0]['owner_id']}_{uploaded_photo[0]['id']}")

        # Прикрепление видео, если оно есть
        if 'videos' in post:
            for video in post['videos']:
                video_upload_url = vk.video.save(group_id=target_group_id)['upload_url']
                vk.video.save(video_file=video, upload_url=video_upload_url)
                # Получите информацию о загруженном видео и добавьте его к attachments

        # Постинг на стену
        response = vk.wall.post(owner_id=f"-{target_group_id}", message=post['text'], attachments=','.join(attachments))

        # Вывод информации о созданном посте
        print(f"Пост успешно создан. ID поста: {response['post_id']}")

except ApiError as e:
    print(f"Ошибка VK API: {e}")

Примечание:

  1. В данном примере мы используем метод vk.photos.getWallUploadServer и vk.photos.saveWallPhoto для загрузки изображений. Для видео нужно использовать аналогичные методы для загрузки видео.
  2. Прикрепление видео к посту в VK_API требует дополнительной обработки, включая загрузку видео на сервер VK, получение информации о загруженном видео и добавление этой информации к attachments.
  3. Внимательно следите за ограничениями API VK, такими как максимальный размер медиафайлов, частота запросов и другие.

Парсинг стены сообщества

Вам необходимо использовать метод wall.get() из этой библиотеки для выполнения запроса к API ВКонтакте и получения данных о постах.

Пример кода с использованием vk_api:

from vk_api import VkApi
from vk_api.exceptions import ApiError

# Ваш токен доступа
token = 'ваш_токен_доступа'

# ID сообщества, стену которого вы хотите парсить
group_id = 'идентификатор_сообщества'

# Количество постов, которые вы хотите получить
post_count = 5

# Создаем объект VKSession
vk_session = VkApi(token=token)

# Получаем объект VK_API
vk = vk_session.get_api()

try:
    # Получение постов со стены сообщества
    wall_posts = vk.wall.get(owner_id=f"-{group_id}", count=post_count)

    # Структура для хранения данных постов
    posts_data = []

    # Извлечение данных из каждого поста
    for post in wall_posts['items']:
        post_data = {'text': post['text']}

        # Извлечение изображений, если они есть
        if 'attachments' in post:
            post_data['images'] = []
            for attachment in post['attachments']:
                if attachment['type'] == 'photo':
                    max_size_photo = max(attachment['photo']['sizes'], key=lambda x: x['width'] * x['height'])
                    post_data['images'].append(max_size_photo['url'])

        # Извлечение видео, если оно есть
        if 'attachments' in post:
            post_data['videos'] = []
            for attachment in post['attachments']:
                if attachment['type'] == 'video':
                    post_data['videos'].append(attachment['video']['player'])

        posts_data.append(post_data)

    # Вывод данных постов
    for post in posts_data:
        print(post)

except ApiError as e:
    print(f"Ошибка VK API: {e}")

Примечание:

  1. Вам нужно использовать vk.wall.get() для получения постов. Укажите owner_id как -group_id для получения постов со стены сообщества.
  2. Как и в предыдущем примере, вы можете использовать полученные данные для создания структуры данных, подобной той, которую мы использовали в предыдущих примерах.

Обработка ошибок при работе с VK_API

При взаимодействии с VK_API важно учесть возможность возникновения различных ошибок. Для обработки ошибок в библиотеке vk_api можно использовать исключения, такие как ApiError. Это исключение может возникнуть в случае ошибки при выполнении запроса к VK_API, например, если передан некорректный токен, если привилегии доступа недостаточны, или если запрос к API завершается ошибкой.

Пример обработки ошибок при использовании vk_api:

from vk_api import VkApi
from vk_api.exceptions import ApiError

# Ваш токен доступа
token = 'ваш_токен_доступа'

# Создаем объект VKSession
vk_session = VkApi(token=token)

# Получаем объект VK_API
vk = vk_session.get_api()

try:
    # Пример запроса к VK_API
    response = vk.wall.get()
    print(response)

except ApiError as e:
    # Обработка ошибки VK_API
    error_msg = f"Ошибка VK API: {e}"
    if e.code == 5:
        error_msg += "\nУбедитесь, что ваш токен доступа правильный и имеет необходимые права доступа."
    elif e.code == 15:
        error_msg += "\nУбедитесь, что у вашего приложения есть необходимые права доступа к запрашиваемым методам VK_API."

    print(error_msg)

В этом примере, если происходит ошибка при выполнении запроса к VK_API, исключение ApiError перехватывается, и выводится сообщение об ошибке. В зависимости от кода ошибки, вы можете предоставить дополнительную информацию и рекомендации пользователю.

Помимо обработки ошибок VK_API, также учитывайте возможность сетевых ошибок, исключений, которые могут возникнуть при выполнении HTTP-запросов, и других возможных проблем в вашем коде.

Сценарии использования библиотеки

  1. Автоматизация постинга в социальных сетях:
    • Вы можете использовать VK_API для автоматизации публикаций на стенах пользователей или сообществ. Например, создание постов по расписанию, публикация новостей или обновлений.
  2. Анализ данных и статистики:
    • VK_API предоставляет доступ к различным данным о пользователях, сообществах, постах и других объектах ВКонтакте. Вы можете использовать эти данные для анализа активности пользователей, выявления трендов, определения популярных тем и т.д.
  3. Уведомления и боты:
    • Создание ботов для отправки уведомлений, автоответов или выполнения определенных задач. Например, боты для ответов на комментарии, уведомлений о новых сообщениях, и т.д.
  4. Интеграция с веб-сайтами и приложениями:
    • VK_API может быть использован для интеграции функциональности ВКонтакте с веб-сайтами и приложениями. Например, добавление возможности авторизации через ВКонтакте, публикация комментариев или лайков на сайте и т.д.
  5. Социальные исследования и маркетинг:
    • Использование VK_API для сбора данных о поведении пользователей и их предпочтениях. Эти данные могут быть использованы для проведения маркетинговых исследований, выявления целевой аудитории, планирования кампаний и анализа эффективности рекламы.

Анализ активности пользователя в сообществе

Мы можем использовать VK_API для получения информации о пользователях, сообществах, постах и других объектах в ВКонтакте. Рассмотрим пример кода для анализа активности пользователей в определенном сообществе.

Пример кода:

from vk_api import VkApi
from vk_api.exceptions import ApiError

# Ваш токен доступа
token = 'ваш_токен_доступа'

# ID сообщества, статистику которого вы хотите анализировать
group_id = 'идентификатор_сообщества'

# Количество последних постов для анализа
post_count = 10

# Создаем объект VKSession
vk_session = VkApi(token=token)

# Получаем объект VK_API
vk = vk_session.get_api()

try:
    # Получение последних постов со стены сообщества
    wall_posts = vk.wall.get(owner_id=f"-{group_id}", count=post_count)

    # Статистика по лайкам, комментариям и репостам
    likes_count = 0
    comments_count = 0
    reposts_count = 0

    for post in wall_posts['items']:
        likes_count += post['likes']['count']
        comments_count += post['comments']['count']
        reposts_count += post['reposts']['count']

    # Вывод статистики
    print(f"Статистика постов в сообществе с ID {group_id}:")
    print(f"Общее количество лайков: {likes_count}")
    print(f"Общее количество комментариев: {comments_count}")
    print(f"Общее количество репостов: {reposts_count}")

except ApiError as e:
    print(f"Ошибка VK API: {e}")

В этом примере мы получаем последние посты со стены сообщества, а затем считаем общее количество лайков, комментариев и репостов за определенный период времени. Вы можете адаптировать этот код для получения различной статистики в зависимости от ваших потребностей. Также, обратите внимание, что запросы к VK_API могут быть ограничены, поэтому при работе с большими объемами данных рекомендуется использовать пагинацию и следить за лимитами запросов.

Создание чат-бота Вконтакте

Для создания простого бота для автоматизации рассылки сообщений вам потребуется использовать библиотеку vk_api для взаимодействия с VK_API и обработки событий ваших ботов. Обратите внимание, что VK не рекомендует использовать ботов для рассылки нежелательной информации или спама.

import vk_api
from vk_api.longpoll import VkLongPoll, VkEventType
import random

# Ваш токен доступа
token = 'ваш_токен_доступа'

# ID пользователя, которому будет отправляться рассылка
target_user_id = 'идентификатор_пользователя'

# Создаем объект VKSession
vk_session = vk_api.VkApi(token=token)

# Получаем объект VK_API
vk = vk_session.get_api()

# Создаем объект для работы с longpoll-событиями
longpoll = VkLongPoll(vk_session)

def send_message(user_id, message):
    """Отправляет сообщение пользователю."""
    try:
        vk.messages.send(user_id=user_id, message=message, random_id=random.randint(1, 1000))
        print(f"Сообщение успешно отправлено пользователю с ID {user_id}")
    except vk_api.exceptions.ApiError as e:
        print(f"Ошибка VK API при отправке сообщения: {e}")

def main():
    """Основная функция бота."""
    print("Бот запущен. Ожидание событий...")

    for event in longpoll.listen():
        if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text:
            print(f"Получено новое сообщение от пользователя с ID {event.user_id}: {event.text}")

            # Пример рассылки ответа на сообщение
            response_message = "Привет! Это бот. Спасибо за ваше сообщение."
            send_message(event.user_id, response_message)

            # Пример рассылки сообщения другому пользователю
            send_message(target_user_id, f"Получено новое сообщение от пользователя с ID {event.user_id}: {event.text}")

if __name__ == "__main__":
    main()

В данном примере, бот будет отвечать на входящие сообщения и отправлять копии этих сообщений указанному пользователю (target_user_id). Обратите внимание, что вам нужно заменить 'ваш_токен_доступа' и 'идентификатор_пользователя' на реальные значения.

Примечание: Использование ботов для рассылки сообщений требует согласия пользователей на получение таких сообщений и соблюдение правил VK. Соблюдайте эти правила и рекомендации.

Интеграция с веб сайтом

Интеграция с веб-сайтами и приложениями может включать в себя различные сценарии, такие как авторизация через ВКонтакте, публикация на стенах пользователей, получение информации о пользователях и друзьях, и многое другое. Вам понадобится использовать VK_API для выполнения соответствующих запросов.

Давайте рассмотрим пример реализации авторизации через ВКонтакте на веб-сайте с использованием библиотеки Flask в Python.

  1. Установите библиотеку Flask:
    pip install Flask
    
  2. Создайте файл app.py с кодом для вашего веб-приложения:
    from flask import Flask, redirect, url_for, session
    from flask import render_template
    from vk_api import VkApi
    from vk_api import AuthError
    
    app = Flask(__name__)
    
    # Замените настройки приложения и секретный ключ
    app.config['SECRET_KEY'] = 'your_secret_key'
    app.config['VK_APP_ID'] = 'your_vk_app_id'
    app.config['VK_APP_SECRET'] = 'your_vk_app_secret'
    app.config['VK_REDIRECT_URI'] = 'http://localhost:5000/vk_callback'
    
    def get_vk_session():
        """Вспомогательная функция для создания сессии VK_API."""
        return VkApi(app.config['VK_APP_ID'], app.config['VK_APP_SECRET'])
    
    @app.route('/')
    def index():
        return render_template('index.html')
    
    @app.route('/login')
    def login():
        vk_session = get_vk_session()
        auth_url = vk_session.get_auth_url(scope=['friends', 'photos', 'email'])
        return redirect(auth_url)
    
    @app.route('/vk_callback')
    def vk_callback():
        vk_session = get_vk_session()
        try:
            vk_session.authorization(code=session['code'], redirect_uri=app.config['VK_REDIRECT_URI'])
            user_info = vk_session.get_api().users.get()[0]
            return f"Добро пожаловать, {user_info['first_name']} {user_info['last_name']}!"
        except AuthError as e:
            return f"Ошибка авторизации: {e}"
    
    if __name__ == '__main__':
        app.run(debug=True)
    
  3. Создайте папку templates в той же директории, что и ваш файл app.py. В папке templates создайте файл index.html:
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>VK Login Example</title>
    </head>
    <body>
        <h1>VK Login Example</h1>
        <p><a href="{{ url_for('login') }}">Войти через ВКонтакте</a></p>
    </body>
    </html>
    
  4. Запустите ваше веб-приложение:
    python app.py
    

Откройте веб-браузер и перейдите по адресу http://localhost:5000. Вы увидите страницу с кнопкой «Войти через ВКонтакте». После нажатия на кнопку и подтверждения разрешений, вы вернетесь на веб-сайт с приветственным сообщением.

Дополнительные ресурсы

Документация по VK_API: https://vk-api.readthedocs.io/en/latest/

Официальная документация по VK API: https://vk.com/dev/manuals

Понравилась статья? Поделиться с друзьями:
Школа Виктора Комлева
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.