Отправка голосовых сообщение с помощью vk api

в 19:52, , рубрики: python, Вконтакте API

Всем здравствуйте. Сегодня я попытаюсь как я реализовывал отправку голосовых сообщений в 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.

Автор: Возле ректора

Источник

Поделиться

* - обязательные к заполнению поля