Pull to refresh

Отправка голосовых сообщение с помощью vk 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 2000000001\n
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 group\n
Example: ^ Lentach \n Enter the person's id or write his name and surname by putting the symbol '/' \n  Example:  /Peter Ivanov\n""" )) # 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.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.