python

Бесплатная музыка ВК или как сделать бота, отправляющего ссылку на скачивание музыки

  • четверг, 10 января 2019 г. в 00:19:39
https://habr.com/post/435566/
  • API
  • Python


Привет читатель запятая путник запятая странник. Сегодня я помогу тебе окунуться в мир бесплатного софта, и музыки.Или как говорится:
Cтатья не может быть хорошей без Линуса смотрящего налево"
image

Некоторая предыстория


Все мы с вами знаем что с 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})

Вот в общем-то и все, однако любой код требует оптимизации. К примеру файл после отправки нужно удалять, давать нормальные названия переменным, и отправлять ответ в файле не так уж и круто.

Но в целом сейчас это уже завершенный проект, которым можно пользоваться.

Вот ссылка на его гитхаб.
И главное не забывайте что музыка, как и мороженное, приятнее когда бесплатно.