Хакер 90-х, ВКонтакте (анонсирую нового хакера)
Доброго времени суток, дорогие друзья.
Всем знакома ситуация, когда занимаясь чем-то важным получаешь сообщение в ВК, но, как правило, возможности открыть и прочесть нет. Для решения данной проблемы я создал программу.
Давайте более детально разберёмся.
Необходимо сделать 4 вещи:
- Скачать и установить язык программирования Python 2.7
- Установить необходимые модули для Python
- Создать и включить приложение в ВКонтакте.
- Скачать и запустить скрипт.
Может звучит страшно, но делается за 5 минут и по силам даже гуманитарию.
Скачиваем здесь язык программирования Python 2.7 и устанавливаем на компьютере.
Устанавливаем необходимые модули для Python.
Переходим в папку, куда установили Python (по умолчанию устанавливается в C:\Python27), далее в папку Script. Из папки запускаем окно команд (зажимаем shift, далее ПКМ и выбираем Открыть окно команд). Пишем строчку: pip install vk pygame yandex_speech. Нажимаем Enter. Начнется автоматическое скачивание и установка модулей.
Создаем и включаем приложение в ВКонтакте.
Переходим по ссылке -> "Создать приложение" -> Вводим любое название, платформу не меняем -> "Подключить приложение" -> "Подтвердить через SMS" -> Подтверждаем.
Далее появляется информация о приложение. Переходим в настройки -> Меняем критерий Состояние на Приложение включено и видно всем -> "Сохранить изменения".
В настройках видим пункт ID приложения. Запоминаем для дальнейшего использования.Скачиваем и запускаем скрипт.
Скачиваем архив со скриптом и распаковываем в любую папку все файлы архива. Запускаем ListenVK.py.
Готово.
Теперь, получив сообщение в ВКонтакте не надо отвлекаться на переключение между вкладками.
Время разобраться с кодом.
# -*- coding: utf-8 -*-
import vk
import time
import pygame
from yandex_speech import TTS
session = vk.AuthSession('ID приложения','Логин','Пароль', scope='messages' )
api = vk.API(session)
tts = TTS("zahar" , "mp3" , "05808c62-a502-4724-a85c-3b8ac74343e9" )
def say( message ):
tts.generate(mes)
tts.save("speech.mp3")
pygame.mixer.init()
pygame.mixer.music.load("speech.mp3")
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
time.sleep(1)
pygame.mixer.music.load("some.mp3")
def getName( id ):
name = api.users.get(user_ids=str(id))
return name[0][u'first_name'] + u' ' + name[0][u'last_name']
if __name__ == '__main__':
print "Script ready"
while True:
messages = api.messages.get( time_offset = '3' )
for message in messages[1:]:
mes = message[u'body'].replace(u'
',u'. ')
mes = "{0}.{1}".format( getName(message[u'uid']) , mes )
say(mes)
time.sleep(5)
Код получился компактным. В первых строчках импортируются модули, которые скачиваются в во втором пункте.
vk - Модуль для взаимодействия с ВКонтакте
pygame - Модуль для воспроизведения голоса.
yandex_speech - Модуль для перевода текста в голос.
session = vk.AuthSession('ID приложения','Логин','Пароль', scope='messages' )
api = vk.API(session)
tts = TTS("zahar" , "mp3" , "05808c62-a502-4724-a85c-3b8ac74343e9" )
Здесь происходит инициализация необходимых инструментов: vkapi и tts яндекса. Если объяснить простым языком - инструменты, которыми будем доставать информацию из ВКонтакте и переводить текст в голос.
В первой строке необходимо добавить наши данные. Вместо 'ID приложения', 'Ваш логин' и 'Ваш пароль' пишем свои реальные данные. ID приложения это тот самый ID, который запоминали в 3 пункте.
Получится примерно так:
session = vk.AuthSession( '6310131' , 'IvanIvanov@mail.ru' , 'Qwerty1992' , scope='messages' ).
В третей строке функция TTS имеет три параметра:
- Каким голосом будет зачитываться текст.
Возможные значения Женщин: "jane", "oksana", "alyss", "omazh" или Мужчины: "zahar", "ermil". - Формат сохранения записи: "mp3", "wav", "opus".
- API ключ.
Можно использовать мой. Также стоит добавить параметры:
"emotion" - С какими эмоциями будет зачитан текст. Возможные значения: "neutral" (по умолчанию), "evil", "good". - Скорость чтения ("speed" ).
Возможные значения: от 0.1 (медленно) до 3.0 (быстро).
Идем дальше. Программа имеет две функции:
- say( message ) - функция, которая зачитывает строку message.
- getName( id ) - функция, которая возвращает имя и фамилию аккаунта ВК с id, который передаем.
Их разберём позже.
if __name__ == '__main__':
print "Script ready"
while True:
messages = api.messages.get( time_offset = '5' )
for message in messages[1:]:
mes = message[u'body'].replace(u'
',u'. ')
mes = "{0}.{1}".format( getName(message[u'uid']) , mes )
say(mes)
time.sleep(5)
Как можно заметить, сначала выводится строка "Script ready". Сигнализирует об удачной инициализации скрипта и начале работы.
Затем происходит бесконечный цикл.
messages = api.messages.get( time_offset = '5' )
Получаем сообщения, отправленные в течение 5 последних секунд.
for message in messages[1:]:
Перебираем все полученные сообщения.
mes = message[u'body'].replace(u'
',u'. ')
mes = "{0}.{1}".format( getName(message[u'uid']) , mes )
say(mes)
Формируем текст, который далее будет озвучен. Сначала имя и фамилия человека, который нам написал. Затем текст сообщения.
def say( message ):
tts.generate(mes)
tts.save("speech.mp3")
pygame.mixer.init()
pygame.mixer.music.load("speech.mp3")
pygame.mixer.music.play()
while pygame.mixer.music.get_busy():
time.sleep(1)
pygame.mixer.music.load("some.mp3")
Рассмотрим функцию say( message ).
tts.generate(mes)
tts.save("speech.mp3")
Генерируем запись голоса и сохраняем в файл.
pygame.mixer.init()
pygame.mixer.music.load("speech.mp3")
pygame.mixer.music.play()
Инициализируем pygame, загружаем запись и воспроизводим.
while pygame.mixer.music.get_busy():
time.sleep(1)
Метод get_busy() возвращает True, если запись воспроизводится. В этом случае ждем одну секунду, и проверяем снова, до тех пор, пока get_busy() не вернет False (запись закончит воспроизводится).
pygame.mixer.music.load("some.mp3")
Извиняюсь. Костыль. Если открывать два раза подряд файл speech.mp3 - появляется ошибка. Пытался исправить, но тщетно.
Если знаете как исправить - пишите в комментариях. Буду признателен. =)
def getName( id ):
name = api.users.get(user_ids=str(id))
return name[0][u'first_name'] + u' ' + name[0][u'last_name']
Вторая функция. Здесь все просто: api.users.get(id) - возвращает информацию аккаунта по id.
name[0][u'first_name'] - Имя
name[0][u'last_name'] - Фамилия
Ну вот и всё))
Всего доброго. До свидания =))
Студенты ушли на каникулы, а я продолжаю привлекать авторов в голос. Игрока в Омаху и любителя ставок, бизнесменов из турфирмы и дошли руки до юного кодера из враждебно настроенного университета политехнического. Пока vp-cosmos на каникулах - буду поддерживать авторов через свой блог.
Материал куплен на бирже Протея за 40 GBG, вычитка @sergesfnv, команда @sci-populi