diff --git a/bot.py b/bot.py index d7a3fce..23ed7b1 100644 --- a/bot.py +++ b/bot.py @@ -75,8 +75,7 @@ async def get_max_photo(obj, keyword='photo'): async def get_content(url, docname='tgvkbot.document', chrome_headers=True, rewrite_name=False, custom_ext=''): try: - with aiohttp.ClientSession(headers={ - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'} if chrome_headers else {}) as session: + with aiohttp.ClientSession(headers=CHROME_HEADERS if chrome_headers else {}) as session: r = await session.request('GET', url) direct_url = str(r.url) tempdir = tempfile.gettempdir() diff --git a/config.py b/config.py index b78617c..075a1de 100644 --- a/config.py +++ b/config.py @@ -34,17 +34,21 @@ AUDIO_URL = os.environ.get('AUDIO_URL', 'http://thatmusic.akentev.com/id/{owner_ AUDIO_ACCESS_URL = os.environ.get('AUDIO_ACCESS_URL', 'http://thatmusic.akentev.com/access_id/{token}/{owner_id}/{audio_id}') TOKEN_REFRESH_URL = os.environ.get('TOKEN_REFRESH_URL', 'http://thatmusic.akentev.com/refresh') - +AUDIO_SEARCH_URL = os.environ.get('AUDIO_SEARCH_URL', 'https://thatmusic.akentev.com/search/') +AUDIO_PROXY_URL = os.environ.get('AUDIO_PROXY_URL', 'https://thatmusic.akentev.com/proxy/') AUDIO_HEADERS = { 'user-agent': 'KateMobileAndroid/52.1 lite-445 (Android 4.4.2; SDK 19; x86; unknown Android SDK built for x86; en)'} +CHROME_HEADERS = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'} BOT_TOKEN = os.environ.get('BOT_TOKEN') SETTINGS_VAR = os.environ.get('SETTINGS_VAR', 'DJANGO_TGVKBOT_SETTINGS_MODULE') MAX_FILE_SIZE = os.environ.get('MAX_FILE_SIZE', 52428800) -API_VERSION = os.environ.get('API_VERSION', '5.78') +API_VERSION = os.environ.get('API_VERSION', '5.71') +AUDIO_API_VERSION = os.environ.get('API_VERSION', '5.78') # https://www.miniwebtool.com/django-secret-key-generator/ # Возможно достаточно заглушки в стиле 'tgvkbot-super-secret-key(nope)' diff --git a/telegram.py b/telegram.py index b965464..3fd1f1a 100644 --- a/telegram.py +++ b/telegram.py @@ -530,7 +530,7 @@ async def send_welcome(msg: types.Message): if not existing_vkuser: link = 'https://oauth.vk.com/authorize?client_id={}&' \ 'display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=friends,messages,offline,docs,photos,video,stories,audio' \ - '&response_type=token&v={}'.format(VK_APP_ID, API_VERSION) + '&response_type=token&v={}'.format(VK_APP_ID, AUDIO_API_VERSION) mark = InlineKeyboardMarkup() login = InlineKeyboardButton('ВХОД', url=link) mark.add(login) diff --git a/vk_messages.py b/vk_messages.py index 3d41939..7562e4b 100644 --- a/vk_messages.py +++ b/vk_messages.py @@ -4,6 +4,7 @@ from aiovk.longpoll import LongPoll from bot import * from aiogram.utils.markdown import quote_html, hlink +import urllib log = logging.getLogger('vk_messages') inline_link_re = re.compile('\[([a-zA-Z0-9_]*)\|(.*?)\]', re.MULTILINE) @@ -706,7 +707,11 @@ async def process_message(msg, token=None, is_multichat=None, vk_chat_id=None, u elif attachment['type'] == 'audio': await bot.send_chat_action(to_tg_chat, ChatActions.UPLOAD_DOCUMENT) tg_message = await tgsend(bot.send_audio, to_tg_chat, audio=attachment['content'], - reply_to_message_id=main_message, disable_notification=disable_notify) + caption=attachment.get('caption', None), + performer=attachment.get('artist', None), + title=attachment.get('title', None), + reply_to_message_id=main_message, disable_notification=disable_notify, + parse_mode='HTML') Message.objects.create( vk_chat=vk_chat_id, vk_id=vk_msg_id, @@ -762,6 +767,19 @@ async def check_vk_url(url): return False +def form_audio_title(data: dict, delimer=' '): + result = data.get('artist') + if result: + if 'title' in data: + result += delimer + data['title'] + else: + if 'title' in data: + result = data['title'] + else: + return + return result + + async def process_attachment(attachment, token=None): atype = attachment.get('type') if atype == 'photo': @@ -769,6 +787,22 @@ async def process_attachment(attachment, token=None): return {'content': photo_url, 'type': 'photo'} elif atype == 'audio': + if attachment[atype].get('url') and AUDIO_PROXY_URL: + try: + with aiohttp.ClientSession() as session: + r = await session.request('GET', AUDIO_PROXY_URL, + params={'url': urllib.parse.quote(attachment[atype]['url']), + 'artist': urllib.parse.quote(attachment[atype].get('artist', '')), + 'title': urllib.parse.quote(attachment[atype].get('title', ''))}, + headers=CHROME_HEADERS) + if r.status != 200: + raise Exception + audio = await r.read() + audio = io.BytesIO(audio) + return {'content': audio, 'type': 'audio'} + except: + pass + if AUDIO_ACCESS_URL: if token: try: @@ -783,7 +817,7 @@ async def process_attachment(attachment, token=None): return {'content': audio, 'type': 'audio'} except: pass - elif AUDIO_URL: + if AUDIO_URL: try: with aiohttp.ClientSession() as session: r = await session.request('GET', AUDIO_URL.format(owner_id=attachment[atype]['owner_id'], @@ -795,6 +829,38 @@ async def process_attachment(attachment, token=None): return {'content': audio, 'type': 'audio'} except: pass + if AUDIO_SEARCH_URL: + try: + search = form_audio_title(attachment[atype]) + if not search: + raise Exception + with aiohttp.ClientSession() as session: + r = await session.request('GET', AUDIO_SEARCH_URL, params={'q': urllib.parse.quote(search)}) + if r.status != 200: + raise Exception + audios = await r.json() + if audios['success'] and audios['data']: + if attachment[atype]['duration']: + audio = min(audios['data'], + key=lambda x: abs(x['duration'] - attachment[atype]['duration'])) + else: + audio = audios['data'][0] + else: + raise Exception + with aiohttp.ClientSession() as session: + r = await session.request('GET', audio["download"]) + if r.status != 200: + raise Exception + audio = await r.read() + audio = io.BytesIO(audio) + # search = form_audio_title(attachment[atype], ' - ') + # caption = '🔍 {}'.format(quote_html(search)) + caption = '🔍' + return {'content': audio, 'type': 'audio', 'caption': caption, + 'artist': attachment[atype].get('artist', None), + 'title': attachment[atype].get('title', None)} + except: + pass return {'content': 'Аудио', 'type': 'text'}