Получить список участников беседы Вконтакте api python

Для лингвистического исследования мне понадобился корпус прямой речи, порожденной одним человеком. Я решил, что для начала удобнее всего использовать собственную переписку в ВК. Это статья о том, как скачать все сообщения, которые Вы когда-либо отправляли своим друзьям, используя программу на Python и API ВКонтакте. Для работы с API будем использовать библиотеку vk.

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

Итак, токен получен. Импортируем необходимые библиотеки (time и re понадобятся нам позже), подключимся к нашему приложению и начнем работу.

import vk import time import re session = vk.Session(access_token=’your_token’) vkapi = vk.API(session)

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

Python API VKontakte!! Как скачать фотографии из ВК через API?


friends = vkapi(‘friends.get’) # получение всего списка друзей для пользователя # friends = [1111111, 2222222, 33333333] # задаем друзей вручную

Имея список друзей, можно сразу приступить к скачиванию диалогов с ними, но я хочу обрабатывать только те диалоги, в которых содержится более чем 200 сообщений, так как короткие беседы с малознакомыми людьми мне не очень интересны. Поэтому напишем функцию, которая вернет «шапки» диалогов.

def get_dialogs(user_id): dialogs = vkapi(‘messages.getDialogs’, user_id=user_id) return dialogs

Такая функция возвращает «шапку» диалога с пользователем, id которого равен указанному user_id. Результат её работы выглядит приблизительно так:

В полученном списке содержится количество сообщений (96) и данные последнего сообщения в диалоге. Теперь у нас есть всё необходимое, чтобы скачать нужные диалоги.

Основное неудобство состоит в том, что ВКонтакте позволяет делать максимум около трех запросов в секунду, поэтому после каждого запроса нужно какое-то время ждать. Для этого нам и нужна библиотека time. Самое маленькое время ожидания, которое мне удавалось поставить, чтобы не получить отказ через несколько операций — 0.3 секунды.

Другая сложность в том, что за один запрос можно скачать максимум 200 сообщений. С этим тоже придется бороться. Напишем функцию.

def get_history(friends, sleep_time=0.3): all_history = [] i = 0 for friend in friends: friend_dialog = get_dialogs(friend) time.sleep(sleep_time) dialog_len = friend_dialog[0] friend_history = [] if dialog_len > 200: resid = dialog_len offset = 0 while resid > 0: friend_history += vkapi(‘messages.getHistory’, user_id=friend, count=200, offset=offset) time.sleep(sleep_time) resid -= 200 offset += 200 if resid > 0: print(‘—processing’, friend, ‘:’, resid, ‘of’, dialog_len, ‘messages left’) all_history += friend_history i +=1 print(‘processed’, i, ‘friends of’, len(friends)) return all_history

Еще по теме:  Можно ли в одном браузере открыть несколько аккаунтов Вконтакте

Разберемся, что здесь происходит.

Автопостинг ВК | Получение access token, выполнение запроса, извлечение шуток

Мы проходим по списку друзей и получаем диалог с каждым из них. Рассматриваем длину диалога. Если диалог короче, чем 200 сообщений, просто переходим к следующему другу, если длиннее, то скачиваем первые 200 сообщений (аргумент count), добавляем их в историю сообщений для данного друга и рассчитываем, сколько еще сообщений осталось скачать (resid). До тех пор пока остаток больше 0, при каждой итерации увеличиваем аргумент offset, который позволяет задать отступ в количестве сообщений от конца диалога, на 200.

Из-за необходимости ожидания после каждого запроса программа работает довольно долго, поэтому я добавил вывод небольшого отчета о текущем шаге, чтобы понимать, что сейчас обрабатывается и сколько еще осталось.

N.B.: у метода messages.get есть аргумент out, с помощью которого можно попросить сервер отдавать только исходящие сообщения. Я решил не использовать его и выделить нужные мне сообщения уже после скачивания по следующим причинам: а) файл все равно придется очищать, т.к. сервер отдает каждое сообщение виде словаря, содержащего много технической информации и б) сообщения собеседников тоже могут представлять интерес для моего исследования.

Каждое скачанное сообщение является словарем и выглядит примерно вот так:
Потому что тут модель вышла довольно непонятная.’, ‘uid’: 111111, ‘mid’: 222222, ‘from_id’: 111111, ‘out’: 1>

Далее осталось только очистить результат и сохранить его в файл. Эта часть работы уже не относится к взаимодействию с VK API, поэтому я не буду останавливаться на ней подробно. Да и что тут рассказывать — просто выбираем нужные элементы (body) для нужного пользователя и с помощью re удаляем переносы строк, которые отмечены тегом
. Сохраняем все в файл.

Полностью код программы выглядит вот так:

import vk import time import re session = vk.Session(access_token=’your_token’) vkapi = vk.API(session) SELF_ID = 111111 SLEEP_TIME = 0.3 friends = vkapi(‘friends.get’) # получение всего списка друзей для текущего пользователя def get_dialogs(user_id): dialogs = vkapi(‘messages.getDialogs’, user_id=user_id) return dialogs def get_history(friends, sleep_time=0.3): all_history = [] i = 0 for friend in friends: friend_dialog = get_dialogs(friend) time.sleep(sleep_time) dialog_len = friend_dialog[0] friend_history = [] if dialog_len > 200: resid = dialog_len offset = 0 while resid > 0: friend_history += vkapi(‘messages.getHistory’, user_id=friend, count=200, offset=offset) time.sleep(sleep_time) resid -= 200 offset += 200 if resid > 0: print(‘—processing’, friend, ‘:’, resid, ‘of’, dialog_len, ‘messages left’) all_history += friend_history i +=1 print(‘processed’, i, ‘friends of’, len(friends)) return all_history def get_messages_for_user(data, user_id): self_messages = [] for dialog in data: if type(dialog) == dict: if dialog[‘uid’] == user_id and dialog[‘from_id’] == user_id: m_text = re.sub(«
«, » «, dialog[‘body’]) self_messages.append(m_text) print(‘Extracted’, len(self_messages), ‘messages in total’) return self_messages def save_to_file(data, file_name=’output.txt’): with open(file_name, ‘w’, encoding=’utf-8′) as f: print(data, file=f) if __name__ == ‘__main__’: all_history = get_history(friends, SLEEP_TIME) save_to_file(all_history, ‘raw.txt’) self_messages = get_messages_for_user(all_history, SELF_ID) save_to_file(self_messages, ‘sm_corpus.txt’)

Еще по теме:  Как посмотреть свой айпи в ВК с телефона

На момент запуска программы у меня в ВК было 879 друзей. На их обработку потребовалось около 25 минут. Файл с необработанным результатом имел объем 74MB. После выделения текста только моих сообщений — 15MB. Всего сообщений в полученном корпусе — около 150 000, а их текст занимает 3707 страниц (в вордовском документе).

Источник: savepearlharbor.com

нужно получить ID всех пользователей в беседе через токен группы

мне нужно получить ID всех участников беседы в вк я пробовал получить с помощью методов «messages.getChat» и «messages.getChatUsers мне выдаёт вот такую ошибку: [27] Group authorization failed: method is unavailable with group auth. пожалуйста помогите с кодом

Отслеживать

задан 7 авг 2022 в 7:47

Дима Абдукаримов Дима Абдукаримов

36 5 5 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Эта ошибка возникает, так как вы пытаетесь использовать API методы, которые могут быть вызваны только с ключом доступа пользователя (не сообщества). Написано в документации здесь и здесь. Есть 2 решения:

  1. Создать Standalone приложение и получить ключ через него (Нужны права доступа messages, а такие права могут получить только приложения, прошедшие модерацию);
  2. Использовать метод messages.getConversationMembers (Документация).

Отслеживать

ответ дан 8 авг 2022 в 18:19

30 5 5 бронзовых знаков

Источник: ru.stackoverflow.com

Есть способ получить полный список участников группы?

но ведь есть боты которые могут.. тут же ссылки запрещены?

14:07 04.03.2022
Mars BATYA [NYА]
а знаешь конкретные циферки? юзеру — 50, боту — 5.

П@#$%ц слоумод жёсткий, минуту ждать. Не знаю. Год назад было 5

14:08 04.03.2022

У ботов ограничение на количество упоминаний

Любых? Или только по айди?

14:08 04.03.2022
Evgen Fil // hugs please
Любых? Или только по айди?

По айди. Евген, убери слоумод, это пытка какая-то, я ответить не могу

14:09 04.03.2022
Имя (обязательно) Фамилия (необязательно) Автор вопроса

По айди. Евген, убери слоумод, это пытка какая-то.

есть бот такой — ему если написать «калл» он упомянет всех участников группы, вот я хочу понять, как он список ID пользователей получает?

14:11 04.03.2022
Имя (обязательно) Фамилия (необязательно)
есть бот такой — ему если написать «калл» он упомя.

через клиент апи (pyrogram/telethon), но их тут обсуждать нельзя

14:12 04.03.2022

По айди. Евген, убери слоумод, это пытка какая-то.

Имхо минута норм, но если прям так сильно плохо, могу опустить до 30с (Пока что двое за смягчение лимитов, ставьте если тоже «за»)

Еще по теме:  Как в ВК сделать невидимым время посещения

14:12 04.03.2022
Имя (обязательно) Фамилия (необязательно)
есть бот такой — ему если написать «калл» он упомя.

мтропто (юб) может получать всех юзеров группы ботапи — нет

14:12 04.03.2022
Mars BATYA [NYА]
через клиент апи (pyrogram/telethon), но их тут об.

Не «нельзя», а «нежелательно», потому что для этого есть специальные чаты

14:12 04.03.2022
Имя (обязательно) Фамилия (необязательно)
есть бот такой — ему если написать «калл» он упомя.

Не делай таких ботов и тот бот везде где можешь удали, это гребанное издевательство над пользователями

14:13 04.03.2022
Axel
мтропто (юб) может получать всех юзеров группы бо.

А мтпрото с бот токеном может?

14:13 04.03.2022
Имя (обязательно) Фамилия (необязательно) Автор вопроса
Mars BATYA [NYА]
через клиент апи (pyrogram/telethon), но их тут об.

чтобы юзербот работал мне же придется присоединиться к группе? писать нельзя но можно изменять

14:13 04.03.2022
Alex
Не делай таких ботов и тот бот везде где можешь уд.

Ну хз, у нас есть локальный чатик на ~10 человек, удобно так делать

14:13 04.03.2022
Evgen Fil // hugs please
Имхо минута норм, но если прям так сильно плохо, м.
14:14 04.03.2022
Имя (обязательно) Фамилия (необязательно)
чтобы юзербот работал мне же придется присоединить.

это не юзербот, это бот, который работает мимо ботапи

14:14 04.03.2022
Evgen Fil // hugs please
Ну хз, у нас есть локальный чатик на ~10 человек, .

Это если локальный среди своих, а прикинь если тут, а многие именно так и делают

14:14 04.03.2022
Имя (обязательно) Фамилия (необязательно) Автор вопроса
Mars BATYA [NYА]
это не юзербот, это бот, который работает мимо бот.

аа ок благодарю

14:14 04.03.2022
Имя (обязательно) Фамилия (необязательно) Автор вопроса

а в чем вообще разница между Клиент апи и Бот апи, если первый может с токеном бота работать?

14:18 04.03.2022

до 200 юзеров на изи

14:18 04.03.2022
Mars BATYA [NYА]
до 200 юзеров на изи
14:18 04.03.2022
Имя (обязательно) Фамилия (необязательно)
а в чем вообще разница между Клиент апи и Бот апи.

ограничения остаются же

14:19 04.03.2022
Имя (обязательно) Фамилия (необязательно) Автор вопроса
Axel
ограничения остаются же
14:19 04.03.2022

Зачем, если всё равно не сможешь их упомянуть?

несколько сообщений можно

14:23 04.03.2022

с первым немного больше возможностей, потому что ты напрямую с телеграмом взаимодействуешь. а ботапи это http интерфейс между ботом и телегой, чтобы ты даже из браузера мог управлять ботом. вот тут больше инфы

Источник: telq.org

Рейтинг
( Пока оценок нет )
Загрузка ...