master
jinql 2025-09-18 18:49:46 +08:00
parent c5dd60a82d
commit 3455cb8b50
2 changed files with 16 additions and 8 deletions

View File

@ -8,7 +8,7 @@ import re
import socket import socket
import time import time
from typing import Tuple, Optional, Dict from typing import Tuple, Optional, Dict
from urllib.parse import urlparse from urllib.parse import urlparse, unquote
import aiohttp import aiohttp
import requests import requests
@ -199,11 +199,17 @@ class Favicon:
_content, _ct = None, None _content, _ct = None, None
try: try:
# 处理base64编码的图片 # 处理base64编码的图片
if self.icon_url.startswith('data:image') and 'base64,' in self.icon_url: if self.icon_url.startswith('data:image'):
data_uri = self.icon_url.split(',') data_uri = self.icon_url.split(',')
if len(data_uri) == 2: if len(data_uri) == 2:
if 'svg+xml,' in self.icon_url:
_content = unquote(data_uri[-1])
elif 'base64,' in self.icon_url:
_content = base64.b64decode(data_uri[-1]) _content = base64.b64decode(data_uri[-1])
if ';' in self.icon_url:
_ct = data_uri[0].split(';')[0].split(':')[-1] _ct = data_uri[0].split(';')[0].split(':')[-1]
else:
_ct = data_uri[0].split(':')[-1]
else: else:
_content, _ct = await _req_get(self.icon_url, domain=self.domain) _content, _ct = await _req_get(self.icon_url, domain=self.domain)

View File

@ -131,6 +131,7 @@ default_icon_md5 = [
'71e9c45f29eadfa2ec5495302c22bcf6', '71e9c45f29eadfa2ec5495302c22bcf6',
'ababc687adac587b8a06e580ee79aaa1', 'ababc687adac587b8a06e580ee79aaa1',
'43802bddf65eeaab643adb8265bfbada', '43802bddf65eeaab643adb8265bfbada',
'669f77638e6c6eb274ed3ca36827cd72',
] ]
@ -329,15 +330,16 @@ async def get_icon_async(entity: Favicon, _cached: bytes = None) -> Optional[byt
# 尝试不同的图标获取策略 # 尝试不同的图标获取策略
strategies = [ strategies = [
# 1. 从原始网页标签链接中获取 # 0. 从原始网页标签链接中获取
lambda: (icon_url, "原始网页标签") if icon_url else (None, None), lambda: (icon_url, "原始网页标签") if icon_url else (None, None),
# 2. 从 gstatic.cn 接口获取 # 从 gstatic.cn 接口获取
lambda: ( lambda: (
f'https://t3.gstatic.cn/faviconV2?client=SOCIAL&fallback_opts=TYPE,SIZE,URL&type=FAVICON&size=128&url={entity.get_base_url()}', f'https://t3.gstatic.cn/faviconV2?client=SOCIAL&fallback_opts=TYPE,SIZE,URL&type=FAVICON&size=128&url={entity.get_base_url()}',
"gstatic接口"), "gstatic接口"),
# 3. 从网站默认位置获取 # 从网站默认位置获取
lambda: ('', "网站默认位置/favicon.ico"), lambda: ('', "网站默认位置/favicon.ico"),
# 4. 从其他api接口获取 # 从其他api接口获取
lambda: (f'https://favicon.is/{entity.domain}', "第三方API"),
lambda: (f'https://ico.kucat.cn/get.php?url={entity.get_base_url()}', "第三方API"), lambda: (f'https://ico.kucat.cn/get.php?url={entity.get_base_url()}', "第三方API"),
# 99. 最后的尝试cloudflare workers # 99. 最后的尝试cloudflare workers
# lambda: (f'https://favicon.cary.cc/?url={entity.get_base_url()}', "cloudflare"), # lambda: (f'https://favicon.cary.cc/?url={entity.get_base_url()}', "cloudflare"),