From 062e7ed1aab969b2d4d096ad0f21b5905718d3b4 Mon Sep 17 00:00:00 2001 From: John Smith Date: Wed, 28 Sep 2022 00:11:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=B4=E6=97=B6=E4=BF=AE=E5=A4=8D=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=A4=B4=E5=83=8F=E8=AF=B7=E6=B1=82=E8=A2=AB=E5=B1=8F?= =?UTF-8?q?=E8=94=BD=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/chat.py | 5 +++-- services/avatar.py | 15 ++++++++++++--- utils/request.py | 14 ++++++++++++++ 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/api/chat.py b/api/chat.py index e02f3c1..f76eed6 100644 --- a/api/chat.py +++ b/api/chat.py @@ -308,8 +308,9 @@ class RoomInfoHandler(api.base.ApiHandler): # noqa async with utils.request.http_session.get( blivedm_client.ROOM_INIT_URL, headers={ - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)' - ' Chrome/102.0.0.0 Safari/537.36' + **utils.request.BILIBILI_COMMON_HEADERS, + 'Origin': 'https://live.bilibili.com', + 'Referer': f'https://live.bilibili.com/{room_id}' }, params={ 'room_id': room_id diff --git a/services/avatar.py b/services/avatar.py index e47d332..ae1ee76 100644 --- a/services/avatar.py +++ b/services/avatar.py @@ -150,11 +150,15 @@ async def _do_get_avatar_url_from_web(user_id): async with utils.request.http_session.get( 'https://api.bilibili.com/x/space/acc/info', headers={ - 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)' - ' Chrome/102.0.0.0 Safari/537.36' + **utils.request.BILIBILI_COMMON_HEADERS, + 'Origin': 'https://space.bilibili.com', + 'Referer': f'https://space.bilibili.com/{user_id}/' }, params={ - 'mid': user_id + 'mid': user_id, + 'token': '', + 'platform': 'web', + 'jsonp': 'jsonp' } ) as r: if r.status != 200: @@ -168,6 +172,11 @@ async def _do_get_avatar_url_from_web(user_id): except (aiohttp.ClientConnectionError, asyncio.TimeoutError): return None + if data['code'] != 0: + # 这里虽然失败但不会被ban一段时间 + logger.info('Failed to fetch avatar: code=%d %s uid=%d', data['code'], data['message'], user_id) + return None + avatar_url = process_avatar_url(data['data']['face']) update_avatar_cache(user_id, avatar_url) return avatar_url diff --git a/utils/request.py b/utils/request.py index d2fe098..3ca3fa8 100644 --- a/utils/request.py +++ b/utils/request.py @@ -1,4 +1,18 @@ # -*- coding: utf-8 -*- import aiohttp +# 不带这堆头部有时候也能成功请求,但是带上后成功的概率更高 +BILIBILI_COMMON_HEADERS = { + 'Origin': 'https://www.bilibili.com', + 'Referer': 'https://www.bilibili.com/', + 'Sec-CH-UA': '"Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"', + 'Sec-CH-UA-Mobile': '?0', + 'Sec-CH-UA-Platform': '"Windows"', + 'Sec-Fetch-Dest': 'empty', + 'Sec-Fetch-Mode': 'cors', + 'Sec-Fetch-Site': 'same-site', + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko)' + ' Chrome/105.0.0.0 Safari/537.36' +} + http_session = aiohttp.ClientSession(timeout=aiohttp.ClientTimeout(total=10))