Всем здравствуйте. Сегодня я попытаюсь как я реализовывал отправку голосовых сообщений в Python с помощью библиотеки vk_api. Взял идею отсюда.
План
1. Входим в аккаунт.
2. Получаем ссылку(url1), на которую будем загружать аудио файл.
3. Переводим текст в аудио файл (gtts module).
4. Загружаем файл на url1.
5. Получаем документ, которой отправим с помощью метода messages.send.
Config.py
Для удобства я использую отдельный файл с «конифгом».
LOGIN = '' # логин от VK
PASSWORD = '' # пароль от VK
LANG = '' # Язык, на котором будут голосовые сообщения ru,en, etc.
Приступим к самому коду
main.py
Создадим класс (для удобства) и инициализируем переменные, импортируем модули.
import vk_api
from gtts import gTTS
from config import *
import time
import requests
import json
import os
class SendMessage():
def __init__(self,LOGIN,PASSWORD,LANG):
self.LOGIN = LOGIN
self.PASSWORD = PASSWORD
self.LANG = LANG
def LoginingANDgetUploadURL(self):
self.vk = vk_api.VkApi(app_id=3116505,login=self.LOGIN , password= self.PASSWORD , scope="friends,audio,docs,messages" ) # Входим в аккаунт
self.vk.auth()
self.url = self.vk.method('docs.getUploadServer',{'type':'audio_message'})['upload_url'] # получаем ссылку для загрузки файла
Далее надо получить текст и человека(беседа, группа), которому будем отправлять голосовое сообщение. Для себя я ввел условные обозначения:
1. /Имя Фамилия (если лень искать id)
2. ^ Название_Группы (если лень искать id)
def getTextAndID(self):
self.text2 = str(input('Enter the text you want to send by TEXT message (This field can be left blank) :')) # обычный текст
self.text = str(input('Enter the text you want to send by VOICE message:')) # текст, который будет превращен в mp3 файл
self.ID = str(input("""In order to send a voice message to the chat you need n to know the chat's chat and then add 2000000000 to this number n
Example: chat room 1, then you need to write 2000000001n
In order to send a voice message to the group, you need to know his name and be n subscribed to this community. at the beginning, write down ^ and the name of the groupn
Example: ^ Lentach n Enter the person's id or write his name and surname by putting the symbol '/' n Example: /Peter Ivanovn""" )) # id человека/ беседы/ группы (peer_id).
Дальше надо что-то сделать с полученными данными. Текст перевести в файл, а id обработать на ошибки.
def uploadMP3onSERVER(self):
self.tts = gTTS(text=self.text, lang=self.LANG)
self.name = str(int(time.time())) + ".mp3" # имя файла
self.tts.save(self.name) # сохраняем файл
self.files = [('file', (self.name, open(self.name, 'rb')))] # записываем этот файл в переменную
self.url_2 = requests.post(self.url , files=self.files).text # загружаем файл и получаем ответ
os.remove(self.name) # удаляем файл (я не позаботился о том, что он уже может быть удален
self.RESPONSE = json.loads(self.url_2)['file'] # получаю ответ и перевожу в json
self.RESPONSE_2 = self.vk.method('docs.save',{'file': self.RESPONSE }) # сохраняю файл на сервере
self._id = self.RESPONSE_2[0]['id'] # получаю id файла
self.owner_id = self.RESPONSE_2[0]['owner_id'] # получаю owner_id файла
Проверка на id. Кончено, стоило бы проверить на существование, но я не стал заморачиваться
def CheckingID(self):
self.k = 0 # счетчик
self.ID = self.ID.strip() # удаляю от лишних пробелов
if self.ID[0] == '^': # если это группа
self.ID = list(self.ID) #удаляю от символа ^
self.k = 1 # прибавляю 1
del(self.ID[0])
self.ID = ''.join(self.ID)
self.ID = self.ID.strip() # еще раз избавляюсь от пробелов
self.listgroup = self.vk.method('groups.get',{'extended':1,'fields':'can_message,id'})['items'] # получаю список групп у человека
for x in range(len(self.listgroup)):
self.can_message = (self.listgroup[x]['can_message']) # можно ли писать в эту группу сообщение
self.id_group1 = self.listgroup[x]['id'] # id группы
self.name_group = self.listgroup[x]['name'] # Имя группы
if (self.name_group==self.ID) and (self.can_message==1):
self.ID_EDIT = int('-' + str(self.id_group1)) # получаю id группы
break
if self.ID[0]=="/" and self.k!=1: # если человек ищется по фамилии и имени
self.ID = list(self.ID)
self.k=1
del(self.ID[0])
self.ID = ''.join(self.ID)
self.ID = self.ID.strip()
self.friends = self.vk.method('friends.get',{'order':'hints','fields':'nickname'})['items'] # получаю список его друзей
for x in range(len(self.friends)): # цикл
self.first = self.friends[x]['first_name'] # имя
self.last = self.friends[x]['last_name'] # фамилия
self.full_name = ('%s %s' % (self.first,self.last)) # Имя Фамилия
self.full_name2 = ('%s %s' % (self.last,self.first)) # Фамилия Имя
if (self.full_name == self.ID) or (self.full_name2 == self.ID): # если имена и фамилии совпадают
self.ID_EDIT = self.friends[x]['id'] # то получить id получателя
break
del(self.first)
del(self.last)
elif self.k!=1:
self.ID_EDIT = self.ID
try:
self.ID_EDIT = int(self.ID_EDIT)
except:
print('People or group is not defined')
Остается отправить сообщение
def sendMSG(self):
self.document = 'doc%s_%s' % (str(self.owner_id),str(self._id)) # формирую ссылку на документ
self.vk.method('messages.send', {'peer_id':self.ID_EDIT,'attachment':self.document,'message':self.text2}) # отправляю сообщение
print('Successfully') # Удачно
Все готово (почти).
def main(self):
self.LoginingANDgetUploadURL() # Авторизуемся
while 1:
self.getTextAndID() # Получаем нужные данные
self.uploadMP3onSERVER() # Генерируем аудио файл и загружаем его на сервер.
self.CheckingID() # Обрабатываем id
self.sendMSG() # отправляем сообщение
Готово! Пост, где написано на java.
Автор: Возле ректора