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

Обновлено: 30.06.2024

Fixed/reworked VkTools.get_all_slow_iter method

Сначала я заметил, что в текущей реализации обрезаются первые max_count результатов. Это исправил в первом коммите.

Затем, мне там же не понравились две вещи:

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

Так что вторым коммитом идёт моя реализация этого метода

Методы VkAudio возвращают пустую строку вместо ссылки на аудиозапись

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

Окружение

Пример

Бан аккаунта

Использую авторизацию через логин, пароль. Вчера вечером просто массово забанили 4 акка, за лимиты не выходил, да и никаких рассылок или других вещей не делал. У кого ещё такая проблема? Есть мнение из за чего это произошло?

Vk Bot Api Bug

Ошибка в BotLongpoll появляется даже при выполнении кода, приведенного в примере

Add support for downloading Music Albums

Загрузка по профилю ( owner_id ) остаётся на месте и всё так же чудесно работает

Прикрепляю example для теста

Update README.md

Мой код примерно такой:

Появляется ошибка даже в коде из примера [911] Keyboard format is invalid

Игнорируется аргумент attachment в vk.messages.send

Как сделать авторизацию по сервисному ключу

В поле токен вставляется сервисный ключ полученный из настроек приложения Выдает: User authorization failed: no access_token passed. Если убрать логин то вообще отказывается авторизовываться Как это все нормально сделать?

VkAudioUrlDecodeError

i get this error:

File "C:\Users\xxxxx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\vk_api\audio_url_decoder.py", line 44, in decode_audio_url 'Unknown decode cmd: "<>"; Please send bugreport'.format(cmd) vk_api.exceptions.VkAudioUrlDecodeError: Unknown decode cmd: "i"; Please send bugreport

Возникает exception в данном куске кода.

При этом продолжает корректно работать.

Возвращает список подписчиков корректно

Описание примеров, keyboard в docs

Получение документов по ID

Не могу вытащить документы по ID, в обоих случаях [] В коде ничего не нашел, в документации тоже

Bots LongPool Access denied

Подскажите что делаю не так. Поставил LongPool Api 5.80 в настройках. Сам LongPoll Api включен. Авторизация через ключ доступа.

vk_api.exceptions.ApiError: [15] Access denied: no access to call this method

Изменение рассчета ограничений по времени

@python273 , Можно делать 3 запроса в секунду, а не 3 обработанных запроса.

Я еще не сильно потестил, но вроде это так. Предлагаю обсудить, в частности, как проверить.

P.S. Я качаю в 32 потока, и, учитывая потокоНЕбезопасность пакета, я вообще не понимаю, почему все работает: ведь до тех пор, пока обработается первый запрос и переустановится self.last_request , набежит еще до 31-го запроса. (а значение self.last_request всё то же). Следующим пунктом я-таки займусь потокобезопасностью.

Не работает Bot LongPoll

В группе все включено, токен группы валиден, лонгпул включен и работает на версии 5.84. При запуске скрипта из примера в консоль ничего не выводится.

К сожалению не работает tools.get_all для команды board.getComments

tools = vk_api.VkTools(vk_session) comments = tools.get_all('board.getComments', 100, )

Внутри эта команда возвращает response пустой (поле items=None): response = self.vk.method('execute', )

Вообще аналогичная команда из API работает нормально: response = vk.board.getComments(group_id=22522055, topic_id=28354335, count=100)

но так как скачивать много, то хотелось использовать пакетный режим по 25 команд

Привет! Использую эту библиотеку уже день и вот только что на коде, который работал несколько секунд назад сыпятся ошибки:

Что я делаю не так? xD

Type error for bot_longpoll

When I launch a bot in my group in the example bot_longpoll and write a message to the group, I get a " File "C:\Program Files (x86)\Python37-32\lib\site-packages\vk_api\bot_longpoll.py", line 160, in init if self.obj.peer_id

Не работает двойная аутентификация, отдает ответ что не удалось зайти

Enter authentication code: 656897 Two factor authentication failed

[911] Keyboard format is invalid: row 4 contains too much columns

AttributeError: 'Event' object has no attribute 'type'

Music API

Опять пишу с той же проблемой. На этот раз ВКонтакте начинает дополнительно шифровать до пяти первых аудиозаписей неизвестным шифром

О полях кроме response и error

Не все зпросы характеризуются только полями response и error . Например, метод execute может отдавать с двумя полями: response и execute_errors (хотя это незадокументировано.

  1. Добавить метод low_method (или иное название), возвращающий сырой ответ, а не значение поля response /выбрасывающий исключение.
  2. Внедрить использование метода low_method в метод method (и другие?)

Готов подготовить патч.

added audio.get and search methods

Sphinx documentation

Здесь буду докладывать о работе над документацией

Документация

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

Файлоподобные объекты

self.vk_upload.photo_market('uploading.jpg', self.group_id) Когда пытаюсь передать вместо path файлоподобный объект который получаю от urlopen(request), то постоянно пишет, что проблема с картинкой и т.д. Проверьте точно ли функция работает с file-like объектами

module 'requests' has no attribute 'Session'

Добрый день. Работаю над проектом django в котором кто-то ранее зачем-то назвал одно из приложений "requests". Теперь это приводит к конфликту имен как я понял, так как ваша библиотека в свою очередь импортирует библиотеку requests. Переименовывать теперь requests не реально, (много где задействован + записи в базе, миграции) как поступить? Буду благодарен любому совету с вашей стороны.

Окружение

Пример

tools.getAll('users.getSubscriptions')

Не работает метод users.getSubscriptions. Выдает ошибку: ApiError: [13] Runtime error occurred during code invocation: Method slice requires an array

Окружение

Пример

Вот пример нерабочего кода:

Собственно при вызове этой функции и появляется ошибка описанная выше. При этом если сделать идентичный запрос через requests, всё работает. Вот уже рабочий код с requests:

r = requests.post(url, headers=headers, data=data)

print(r.text) вернет следующую строку:

Я не исключаю, что как-то неправильно составил запрос в рамках api, надеюсь информация будет полезна. всем мир

Эта работа посвящена основам анализа социальных сетей на примере взаимодействия с API ВКонтакте.

Запросы к API ВКонтакте имеют следующий формат (из документации):

  • METHOD_NAME - это название метода API, к которому Вы хотите обратиться (например, получить список друзей).
  • PARAMETERS - входные параметры соответствующего метода API, последовательность пар name=value , объединенных амперсандом & (например, количество друзей).
  • ACCESSS_TOKEN - ключ доступа.
  • V - используемая версия API.

Например, чтобы получить список друзей, с указанием их пола, нужно выполнить следующий запрос:

Так как токен доступа ( access_token ) ненастоящий, то этот запрос работать не будет. Чтобы получить токен доступа вы можете воспользоваться написанным для вас скриптом access_token.py следующим образом:

где вместо YOUR_CLIENT_ID необходимо подставить идентификатор вашего приложения.

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


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

Далее приведено содержимое файла access_token.py :

Полученный токен доступа вставьте в поле access_token файле vkapi/config.py :

Прогнозирования возраста

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

Список пользователей можно получить с помощью метода friends.get . Ниже приведен пример обращения к этому методу для получения списка всех друзей указанного пользователя:

Функция requests.get выполняет GET запрос и возвращает объект Response , который представляет собой ответ сервера на посланный нами запрос.

Объект Response имеет множество атрибутов:

Нас будет интересовать только метод response.json , который возвращает JSON объект:

Поле count содержит число записей, а items список словарей с информацией по каждому пользователю.

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

  • есть неполадки в сети;
  • удаленный сервер по какой-то причине не может обработать запрос;
  • мы слишком долго ждем ответ от сервера.

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

Ваша задача реализовать класс сесии, который позволит выполнять GET и POST-запросы к указанному адресу, а при необходимости повторять запрос указанное число раз по алгоритму экспоненциальной задержки:

Описание лучших практик при использовании модуля requests можно найти тут.

На текущий момент вы должны заполнить тело функции get_friends так, чтобы она возвращала список друзей для указанного пользователя:

Так как дата рождения пользователя может быть не указана или указаны только день и месяц, то для обработки таких ситуаций вы можете использовать конструкцию try. except , где except будет содержать только pass .

Построение социального графа

Одним из ограничений метода friends.getMutual является ограничение на максимальное количество идентификаторов пользователей, с которыми необходимо искать общих друзей, то есть target_uids должен содержать не более 100 идентификаторов. Ваша реализация не должна ограничивать размер этого списка, но учитывать, что к методам API ВК с ключом доступа пользователя или сервисным ключом доступа можно обращаться не чаще 3-х раз в секунду:

В приведенном примере мы оставляем только активных пользователей, фильтруя их по полю deactivated , чтобы не получить ошибку User was deleted or banned , а затем получаем список общих пользователей за два запроса.

Теперь вашей задачей является реализация функции ego_network() , которая позволяет построить эгоцентричный граф друзей для указанного пользователя (по умолчанию текущего) и заданного множества его друзей (по умолчанию всех друзей). Граф должен быть представлен в виде списка ребер:


Очевидно, что в полученном графе есть сообщества (в качестве примеров сообществ можно привести: школьных и университетских друзей, коллег по работе, членов семьи и т.д.). Поиск сообществ на графе (community detection) является хорошо изученной задачей, а ряд наиболее известных алгоритмов реализован в библиотеке community :


Вы можете воспользоваться готовыми фукциями для просмотра информации о пользователях в сообществах:

Тематическое моделирование

Тематическое моделирование (topic modeling) одно из современных приложений машинного обучения к анализу текстов, активно развивающееся с конца 90-х годов. Тематическая модель (topic model) коллекции текстовых документов определяет, к каким темам относится каждый документ и какие слова (термины) образуют каждую тему.

Ниже приведен пример всех необходимых конструкций (дополнительно про VKScript можно почитать тут):

Пример запроса с использованием execute :

Напишите функцию get_wall_execute , которая собирает записи со стены указанного сообщества:

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

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

В качестве тематической модели мы будем использовать модель латентного размещения Дирихле (LDA, Latent Dirichlet Allocation), реализацию которой можно найти в библиотеке gensim.

Хочу поделиться опытом, как я использовал Питона в одном из своих проектов по рекламе в VK. Для тех кто не в курсе, Питон — это такой язык программирования.

Данная статья может пригодиться тем, кто учится программировать на Питоне или занимается рекламой в VK.

Описание задачи и пути решения

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

По каждой группе мне важна следующая информация:

Сначала, я начал искать группы используя стандартный поиск. Но это оказалось очень не быстро. На пятой группе я призадумался о более быстром способе.

В конечном итоге, я решил использовать VK API в Python, чтобы решать подобные задачи за секунды.

Как использовать VK API через браузер

Для работы с VK API через браузер, прежде всего, необходимо получить так называемый access_token.

Делается это очень просто. Нужно просто указанный ниже код вставить в адресную строку браузера.

После успешной авторизации ваш браузер будет перенаправлен на другую страницу, а ключ доступа к VK API будет передан в качестве фрагмента URL-ссылки. Смотрите пример ниже. Ключ выделен жирным.

Полученный ключ доступа следует сохранить в надёжном месте. Он будет использоваться при каждом запросе к методам API. Заменяйте ключ из примера своим ключом, чтобы всё работало.

Метод database.getCities

Этот метод я использовал, чтобы получить код (id) города, в котором искать нужные мне группы. Привожу для примера свой запрос. Вам нужно будет поменять ключ доступа access_token и город q на свой.

В случае успешного запроса будет выдан следующий ответ:

Как видно из примера, id города равен 24. Будем использовать это номер в качестве параметра city_id при вызове следующего метода.

Метод groups.search

Этот метод я использовал, чтобы получить id групп соответствующих запросу по ключевому слову. В нижеприведённом примере нужно будет заменить аргументы access_token, city_id и q на соответствующие ваши.

Успешный ответ может быть очень большим. Поэтому привожу его для примера в сокращенном виде.

Это пример выводе первой группы, а всего их может быть до 500. Группы сортируются по отношению дневной посещаемости к количеству пользователей (sort=2).


Открыть полученный файл можно с помощью Excel.

На данном этапе нас интересует только первый столбик id. Нам нужно получить его в виде значений разделённых запятыми, чтобы использовать затем в качестве аргумента при вызове следующего метода VK API.

Полученный файл можно открыть с помощью Блокнота. Там будет текст следующего вида:

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

Метод groups.getById

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

Ответ будет получен, как обычно, в формате json. Его нужно будет преобразовать в формат csv, способом описанным выше.

Для сохранения порядка сортировки групп по отношению дневной посещаемости к количеству пользователей, я в полученный csv-файл добавил столбец ‘sort2’ , в котором последовательно пронумеровал все строки. Образец файла ниже.

sort2idtypeis_closedscreen_namenamemembers_countcontacts
1147347745group0club147347745Установка дверей, ремонт балконов. Балашиха, ВАО218[]
296779849group0bastionsdoorsСтальные двери Бастион-C2653[, ]
384074989group0timartdveryДвери Надмосковья782[, ]
477485430page0dveriarmadaДвери Армада. Выбираем правильно!111[]
595963951group0club95963951Межкомнатные и металлические двери.СТРОЙВЕСТ.2588[]
6139751651group0dveri_v_balashiheМежкомнатные двери в Балашихе71[, ]
7130165257group0dverin1Мир дверей26[]
888654849group0club88654849BARIER-HOUSE стальные двери в Москве15[]


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

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

Как использовать VK API в Python

Реализация описанного выше алгоритма на Python-е оказалась проще, чем я ожидал. От начала программирования до рабочей версии программы прошло около 40 минут. Получается, если бы я сразу начал программировать, то всё получилось бы быстрее часа на два. Это даже несмотря на то, что пришлось тратить время на изучение самого языка.

Для реализации взял первую попавшуюся библиотеку для работы с VK в Python-е. Установил её следующей командой:

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

Следующим этапом было подключиться к VK API. Тут всего две строчки, но на них я застрял минут на 20. Сразу не понял как работает библиотека. Здесь соответственно мой access_token нужно поменять на ваш.

Дальше просто идёт реализация алгоритма описанного выше. В конце я дам полный листинг программы. А по ходу просто буду пояснять отдельные моменты реализации.

Получение кода города:

Метод database.getCities возвращает Словарь (dict), в котором под ключом ‘items’ хранится список городов, которые соответствуют ключевому слову запроса. Обратите внимания, что переменной Cities я присваиваю уже этот список, а не весь Словарь.

Вот ещё интересная реализация получения списка id групп методом
groups.search:

Очень мне понравилась эта конструкция. При реализации через браузер на эту операцию уходило больше всего времени. А тут одной строчкой. Классно.

Ещё мне понравилась реализация работы с csv-файлами методом DictWriter. Сначала задаётся заголовок…

А затем целая группа сохраняется в файл одной строчкой:

В целом, остальное должно быть понятно без слов. Просто привожу листинг.

Если что-то непонятно, то пишите в комментариях. Буду подробно отвечать

Пути развития программы

Программа полностью выполняет свою задачу. Но это не значить, что её нельзя сделать лучше. Я здесь вижу несколько направлений развития.

Классическое консольное приложение

Задавать параметры в коде программы вполне приемлемый способ для программиста. Однако, для простого пользователя — это слишком. Не мудрено ненароком испортить программу. Поэтому лучше реализовать передачу параметров через командную строку, как в классическом консольном приложении.

Контакты в отдельный файл

Контакты групп часто нужны, чтобы не показывать на них рекламу. Для этого нужно собрать id всех пользователей из контактов в отдельный файл. В текущей реализации это придётся делать вручную. Между тем добавить такой функционал совсем несложно и займёт минут 15.

Расширение функционала

По мере необходимости можно расширять функционал программы. Например, добавить возможность извлекать пользователей — членов групп и делать их пересечение. Строить списки пользователей, которые состоят в 2-х группах и тому подобное. Пока такой необходимости не было, но если понадобится, то дописать код будет гораздо быстрее, чем делать всё вручную.

Графический или WEB интерфейс

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

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

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

Важно: мы заметили, что при поиске по ФИ + ДР Вконтакте выдаст подходящих пользователей, даже если их дата рождения скрыта. Это можно было использовать, только нужно обеспечить связь с данными поискового запроса. Для работы с API VK мы решили использовать Python с библиотекой vk_api (установка: pip install vk_api). Итого нам потребуются 2 библиотеки:

Далее – импорт входных данных в формате ID, Имя, Фамилия, Отчество (можно оставить пустым, так как Вконтакте отчество отсутствует), День рождения, Месяц рождения, Год рождения. Пример: (0,Пет, Петрови, ,1,1,1950)

Читайте также: