Генерируем скрипты в ChatGPT для VkApi

За последнее время чат-боты с AI 🤖 проделали большой путь от генераторов псевдо-кода до вполне рабочих решений. Вчера захотелось посмотреть, сможет ли бот Saiora на движке GTP4.0 создать рабочий скрипт на Python для работы с VkAPI. Кому интересно - го под кат!

Постановка задачи

Хочу собрать статку по друзьям в ВК и вывести: возраст, пол, страну, образование, активность.

Формулируем желание в строку "Пример кода статистики друзей в социальной сети Вконтакте на языке python. Должен подсчитывать возраст, пол, страну, образование, активность"

Создадим новый чат и введем данный запрос в поле ввода. Затем в real-time режиме увидим, как чат-бот на наших глазах генерирует ответ.

Диалоговое окно с чат-ботом

🖤 Подпишись на мою телегу и вступи в ВК паблик. 🖤

Вот что создал бот ChatGPT

Анализ полученного кода

Немного отредактируем отступы и комментарии и наш скрипт будет выглядеть так:

import vk_api def get_user_info(user_id): # Авторизация в Вконтакте vk_session = vk_api.VkApi('+79123456789', 'mypassword') vk_session.auth() # Создание экземпляра API vk = vk_session.get_api() # Получение информации о пользователе user_info = vk.users.get(user_ids=user_id, fields='sex,bdate,country,education,online')[0] return user_info def get_friends_info(user_id): # Авторизация в Вконтакте vk_session = vk_api.VkApi('+79123456789', 'mypassword') vk_session.auth() # Создание экземпляра API vk = vk_session.get_api() # Получение списка друзей пользователя friends = vk.friends.get(user_id=user_id, fields='sex,bdate,country,education,online')['items'] # Статистика stats = {'age': {}, 'sex': {}, 'country': {}, 'education': {}, 'online': {}} for friend in friends: # Подсчет возраста if 'bdate' in friend: bdate = friend['bdate'].split('.') if len(bdate) == 3: age = 2022 - int(bdate[2]) if age in stats['age']: stats['age'][age] += 1 else: stats['age'][age] = 1 # Подсчет пола if 'sex' in friend: sex = friend['sex'] if sex in stats['sex']: stats['sex'][sex] += 1 else: stats['sex'][sex] = 1 # Подсчет страны if 'country' in friend: country = friend['country']['title'] if country in stats['country']: stats['country'][country] += 1 else: stats['country'][country] = 1 # Подсчет образования if 'education' in friend: education = friend['education']['name'] if education in stats['education']: stats['education'][education] += 1 else: stats['education'][education] = 1 # Подсчет активности if 'online' in friend: online = friend['online'] activity = 'online' if online else 'offline' if activity in stats['online']: stats['online'][activity] += 1 else: stats['online'][activity] = 1 return stats # Пример использования user_id = '123456789' # ID пользователя Вконтакте user_info = get_user_info(user_id) friends_info = get_friends_info(user_id) print('Информация о пользователе:') print('ID: ', user_id) print('Пол: ', user_info['sex']) print('Дата рождения: ', user_info['bdate']) print('Страна: ', user_info['country']['title']) print('Образование: ', user_info['education']['name']) print('Активность: ', 'online' if user_info['online'] else 'offline') print('\nСтатистика друзей:') print('Возраст:') for age, count in friends_info['age'].items(): print(age, ': ', count) print('\nПол:') for sex, count in friends_info['sex'].items(): print(sex, ': ', count) print('\nСтрана:') for country, count in friends_info['country'].items(): print(country, ': ', count) print('\nОбразование:') for education, count in friends_info['education'].items(): print(education, ': ', count) print('\nАктивность:') for activity, count in friends_info['online'].items(): print(activity, ': ', count)

Бот предлагает нам воспользоваться библиотекой vk_api, которая умеет работать с родным VkAPI

Для запуска скрипта нам необходимо иметь user_id, который можно

посмотреть в своем профиле в разделе "Личные данные"

Скажу сразу - с VkAPI я никогда не работал и методы вижу впервые 👻

Получения статки по юзеру происходит вот так:

# Получение информации о пользователе user_info = vk.users.get(user_ids=user_id, fields='sex,bdate,country,education,online')[0]

Получение статки по друзьям: вызывается метод апи friends с фильрацией по полям

# Получение списка друзей пользователя friends = vk.friends.get(user_id=user_id, fields='sex,bdate,country,education,online')['items']

По-итогу, мы получаем словарь по которому итерируемся и выбираем нужную информацию:

for friend in friends: # Подсчет возраста if 'bdate' in friend: bdate = friend['bdate'].split('.') if len(bdate) == 3: age = 2022 - int(bdate[2]) if age in stats['age']: stats['age'][age] += 1 else: stats['age'][age] = 1 ...

Стоит отметить, что скрипт умеет подсчитывать возраст, хоть и считает от 2022 г (видимо движок GPT так думает), понял слово "активность" как статус "онлайн/оффлайн", вообщем оказался довольно сообразительным 🧠

Пробуем запускать 🏃

Хоть данный код и написан не идеально, но им уже можно пользоваться! Только нужно передать в VkApi свой телефон и пароль.

# Авторизация в Вконтакте vk_session = vk_api.VkApi('+79123456789', 'mypassword')

Запустить этот код и получим ошибку вида:

Немного погуглив доку, добавил captcha_handler

def captcha_handler(captcha): """ При возникновении капчи вызывается эта функция и ей передается объект капчи. Через метод get_url можно получить ссылку на изображение. Через метод try_again можно попытаться отправить запрос с кодом капчи """ key = input("Enter captcha code {0}: ".format(captcha.get_url())).strip() # Пробуем снова отправить запрос с капчей return captcha.try_again(key)

Т.к. я использую двухфакторную аутентификацию, то просто по связке телефон/пароль зайти не получится 😮‍💨. Нужно адаптировать скрипт под ввод кода подтверждения.

Для этого в личном кабинете ВК я подвязал Google Authenticator (чтобы не возиться с смс) и добавил auth_handler

def auth_handler(): """ При двухфакторной аутентификации вызывается эта функция. """ # Код двухфакторной аутентификации key = input("Enter authentication code: ") # Если: True - сохранить, False - не сохранять. remember_device = True return key, remember_device

Наконец, я решил немного навести красоту, и распилил единый скрипт на client и main. Секреты вынес в отдельный модуль secrets.

Проверяем!

Как видно, скрипт успешно собрал статистику по моим друзьям, подсчитал возраст, пол, страну, вывел кто онлайн/оффлайн.

Не знал, что кто-то есть в Бельгии 🇧🇪 Cчитаю - это успех! 🚀

Итоги

Приведенный здесь код я добавил в свой репозиторий на github - cкачать можно тут

Теперь по поводу самого чат-бота Saiora - это узбекский проект, который использует 2 версии движка GPT. Предоставляется 5 бесплатных запросов и различные варианты подписки. В пересчете на рубли и в сравнении с продуктом от OpenAI - получается не очень дорого. Но, нужно иметь местную карту или VISA.

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

🖤 Подписывайтесь на мою телегу и вступайте в ВК паблик.

Больше кода 🐍 - меньше багов 🪲!

0
Комментарии
-3 комментариев
Раскрывать всегда