https://habr.com/post/435566/Привет читатель запятая путник запятая странник. Сегодня я помогу тебе окунуться в мир бесплатного софта, и музыки.Или как говорится:
Cтатья не может быть хорошей без Линуса смотрящего налево"
Некоторая предыстория
Все мы с вами знаем что с 16 декабря 2016 года вк запретила публичный доступ к аудио с помощью своего API, и наложила некоторое табу на скачивание музыки из своего клиента.Не все так плохо, и кампания предостовляет вам 1 месяц free trial`а, после которого нужно будет платить 150 рублей в месяц. Но что же делать после этого месяца, ведь платить не хочется, в стране и так
демографический экономический кризис. Однако решение таковой проблемы вскоре нашлось и особенно хорошие люди начали создавать различные сервисы такие как например vrit.me
Вот ссылка если что.
Именно этим сервисом мы воспользуемся для создания собственного приложения-бота который всего лишь по ID страницы вк может дать ссылки на прямое скачивание файла. Эта статья появилась после прочтения мною статьи другого автора.
Вот ссылка на неё и вероятнее всего вы подумали что-то вроде «Хэй чувак, если кто-то сделал уже статью на эту тему, зачем нам нужен ты.». Но способ использованый автором теперь не работает, ведь vrit.me изменил формат ответа со своего php скрипта. И к тому же я расскажу вам как из этого сделать вк бота с лонгполом и реквестами.
Перечень всего что вам может понадобиться
- Python версии 3.6
- Библиотека vk_api.
Устанавливается вот такpip3 intsall vk_api
- Библиотека BeutifullSoup.
Устанавливается вот такpip3 install bs4
- Немного чая(это важно) и терпения
Начнем с авторизации на сайте в вк в качестве группы
Думаю вы уже создали группу в вк и получили ключ для авторизации. Если нет то
вот часть документации которая все вам объяснит.
Теперь к коду.
Создаем файл main.py и пишем
import vk_api # импортирование библиотеки в проект
KEY = 'Тут ключ для авторизации который вы получили'
vk = vk_api.VkApi(token=key) # собственно сама авторизация
Теперь после авторизации нам нужно понять как мы будем получать события происходящие с нашим ботом. Такие как полученное сообщение к примеру. Вк предоставляет вам выбор между Longpoll и Callback. В этом случае я буду использовать Longpoll.
def check(): # функция возвращающая последнее пришедшее сообщение и ID пользователя который его отправил
answer = {}
longpoll = VkLongPoll(vk)
for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW:
if event.from_user:
answer['id'] = event.user_id
answer['message'] = event.text
return answer
В итоге любой ответ функции будет словарь выглядящий примерно так
{'id':2469812 , 'message':'Мама я в телевизоре'}
С этим уже можно работать и нам остается только достроить логику и можно уже перейти к самому главному.
Добавляем вот такие вот строки
while True:
serverUp = check()
if serverUp.get('message') == 'музыка':
message = musicGet(serverUp.get('id')) # эта строка пока может быть вам не понятна, ничего страшного
Теперь осталось только создать функцию musicGet, в которой и заключается смысл статьи. В начале файла также импортируйте еще 3 библиотеки
import requests
import bs4
import json
MUSIC_URL = 'https://vrit.me'
def musicGet(id): # функция будет принимать только id пользователя
siteUrl = requests.get(MUSIC_URL + '/audios{0}'.format(id)) # открытие сайта
htmlMusicContent = bs4.BeautifulSoup(siteUrl.text , 'html.parser')
allLinks = htmlMusicContent.find_all('a') # выбор всех ссылок
allTitles = htmlMusicContent.find_all('div' , attrs={'class':'title'}) # выбор всех названий песен
reallyLinks = allLinks[7:-1] # отсев настоящих ссылок
i = 0
answer = []
while i < len(reallyLinks):
value = {'title': allTitles[i+1].getText(), 'link':MUSIC_URL + reallyLinks[i]['href']}
answer.append(value)
i += 1
# создание ответа
return answer
Под отсевом настоящих ссылок имеется в виду то что первые 8 — это не настоящие ссылки на песню. Да это костыль, но другой идеи как это решить у меня не было.
Осталось только придумать как отсылать это пользователю. Вариант отправлять все как есть отпадает, потому что вк ограничивает количество символов в сообщении. Поэтому коллективно(я и кот) было решено отправлять файл. Напишем функции которая будет его создавать.
def writeFile(text):
with open('file.txt' , 'w') as file:
for c in text:
file.write(c['title'] + ' ' + c['link'] + '\n\n')
Теперь нужно загрузить этот документ на сайт ВК.
def uploadDoc(user_id):
document = vk.method('docs.getMessagesUploadServer' , {'peer_id': user_id})
# получаем ссылку на загрузку файла
upload = requests.post(document['upload_url'] , files = {'file':open('file.txt','rb')})
# загружаем его
result = json.loads(upload.text)
file = result['file']
# достаем ссылку
document = vk.method('docs.save' , {'file':file, 'title':'Документ'})[0]
theAnswer = {'owner_id':document['owner_id'] , 'id':document['id']}
# сохраняем файл и получаем owner_id и peer_id
return theAnswer
Осталось пару штрихов, вернуться к блоку логики и отправить файл
if __name__ == '__main__':
while True:
serverUp = check()
x = uploadDoc( serverUp['id'])
if serverUp.get('message') == 'музыка':
message = musicGet(serverUp['id']) # эта строка пока может быть вам не понятна, ничего страшного
writeFile(message)
attach = 'doc'+str(x['owner_id'])+'_'+str(x['id'])
vk.method('messages.send' , {'user_id':serverUp['id'] , 'message':'Вот держи' , 'attachment':attach})
Вот в общем-то и все, однако любой код требует оптимизации. К примеру файл после отправки нужно удалять, давать нормальные названия переменным, и отправлять ответ в файле не так уж и круто.
Но в целом сейчас это уже завершенный проект, которым можно пользоваться.
Вот ссылка на его
гитхаб.
И главное не забывайте что музыка, как и мороженное, приятнее когда бесплатно.