Как получить последнее сообщение vk api python

Нужно получить последнее сообщение, которое написал пользователь в вк. Прибегал к методу messages.getHistory, но почему-то отсылается последнее сообщение от бота, а не от пользователя.

Отслеживать
задан 25 авг 2022 в 6:29
7 6 6 бронзовых знаков

1 ответ 1

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

Попробуйте через api.messages.get :

session = vk.Session(token) api = vk.API(session) messages = api.messages.get(count=1) last = messages[‘items’][0][‘id’]
Отслеживать
51.3k 194 194 золотых знака 56 56 серебряных знаков 232 232 бронзовых знака
ответ дан 25 авг 2022 в 6:35
user298540 user298540

Зашел в документацию messages.get, а там пишет: «Данный метод устарел и может быть отключён через некоторое время, пожалуйста, избегайте его использования.». Есть ли какой-то другой способ?

25 авг 2022 в 7:02

  • python
  • vkontakte-api
    Важное на Мете

Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Callback API Bot — Уведомления о новых событиях (комментариях, сообщениях) в сообществе ВКонтакте

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

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

Скачиваем историю переписки со всеми пользователями ВКонтакте с помощью Python

Скачиваем историю переписки со всеми пользователями ВКонтакте с помощью Python

2017-03-31 в 14:10, admin , рубрики: api, python, vk api

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

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

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

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

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

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

БОТ ДЛЯ ГРУППЫ VK НА PYTHON ЗА 2 МИНУТЫ


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

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

Мы проходим по списку друзей и получаем диалог с каждым из них. Рассматриваем длину диалога. Если диалог короче, чем 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 страниц (в вордовском документе).

Надеюсь, моя статья окажется для кого-то полезной. Все методы, которые можно использовать для обращения к API ВК, детально описаны в разделе для разработчиков ВКонтакте.

Еще по теме:  Как назвать фейк Вконтакте

Источник: www.pvsm.ru

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для экспертов
  • » Прослушивание сообщения от пользователя. (Vk bot)

#1 Авг. 21, 2019 10:23:07

Прослушивание сообщения от пользователя. (Vk bot)

Здравствуйте. Написал простенького бота для вк группы, вот теперь не могу понять, как реализовать что, человек ввёл команду, после чего бот ждёт от пользователя ещё введённого сообщения и после чего можно вытащить из бота, последнее введённое сообщение?
Вот код:

import vk_api import random from vk_api.longpoll import VkLongPoll, VkEventType import sqlite3 token = ‘. ‘ тут токен vk_session = vk_api.VkApi(token=token) longpoll = VkLongPoll(vk_session) vk = vk_session.get_api() conn = sqlite3.connect(‘stell_game.db’, check_same_thread=False) cursor = conn.cursor() try: cursor.execute(»’CREATE TABLE stellyt (User_ID integer, Score integer, Pin integer) »’) except sqlite3.OperationalError: pass global Random def random_id(): Random = 0 Random += random.randint(0, 10000000) return Random while True: score = 0 pin = 0 for event in longpoll.listen(): if event.type == VkEventType.MESSAGE_NEW and event.to_me: if event.text.lower() == ‘привет’: vk.messages.send( user_id = event.user_id, message = ‘Хаю хай!’, keyboard = open(‘keyboard.json’, ‘r’, encoding=’UTF-8′).read(), random_id = random_id() ) elif event.text.lower() == ‘старт’ or event.text.lower() == ‘start’: us_id = str(event.user_id) args = int(us_id) cursor.execute(«»» SELECT User_ID FROM stellyt WHERE User_ID = ? «»», [args]) row = cursor.fetchone() if row == None: cursor.execute(‘insert into stellyt (User_id, Score, Pin) values (?, ?, ?)’, (us_id, score, pin)) print(cursor.execute(‘select * from stellyt’).fetchall()) conn.commit() vk.messages.send( user_id=event.user_id, message=»Привет! nТы находишься в вк боте от Stelland’a! U0001F603″, keyboard=open(‘keyboard.json’, ‘r’, encoding=’UTF-8′).read(), random_id=random_id() ) else: vk.messages.send( user_id=event.user_id, message=»Привет! nТы находишься в вк боте от Stelland’a! U0001F603″, keyboard=open(‘keyboard.json’, ‘r’, encoding=’UTF-8′).read(), random_id=random_id() ) elif event.text.lower() == ‘помощь по боту’: vk.messages.send( user_id=event.user_id, message=’Здесь будет написана вся инструкция по боту!’, keyboard=open(‘keyboard.json’, ‘r’, encoding=’UTF-8′).read(), random_id=random_id() ) elif event.text.lower() == ‘получить монеты’: sent = vk.messages.send( user_id=event.user_id, message=’Здесь вы будете получать монеты’, keyboard=open(‘keyboard.json’, ‘r’, encoding=’UTF-8′).read(), random_id=random_id() ) vk(sent, get_mess) else: vk.messages.send( user_id=event.user_id, message=’Неизвестная команда’, random_id=random_id() )

Пример: Человек нажимает на кнопку: Купить пин-код.
После чего бот присылает список доступных пин-кодов. И следующим сообщением человек выбирает какой пин код он хочет купить.

#2 Авг. 21, 2019 11:49:01

Прослушивание сообщения от пользователя. (Vk bot)

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

Отредактировано py.user.next (Авг. 21, 2019 11:49:23)

Источник: python.su

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