diff --git a/favicon_app/models/favicon.py b/favicon_app/models/favicon.py index 819e6ef..ebde70c 100644 --- a/favicon_app/models/favicon.py +++ b/favicon_app/models/favicon.py @@ -360,5 +360,5 @@ _pattern_domain = re.compile( def failed_url_cache(_domain: str, _time: int): if _domain: _current_time = int(time.time()) - if (not failed_urls[_domain]) or (_current_time <= failed_urls[_domain]): + if (not failed_urls.get(_domain)) or (_current_time <= failed_urls.get(_domain)): failed_urls[_domain] = _current_time + _time diff --git a/favicon_app/routes/favicon_routes.py b/favicon_app/routes/favicon_routes.py index d6ba8f0..79ea38e 100644 --- a/favicon_app/routes/favicon_routes.py +++ b/favicon_app/routes/favicon_routes.py @@ -63,7 +63,7 @@ async def get_referrer(unique: Optional[str] = Query(None)): try: content = FileUtil.read_file(path, mode='r') or 'None' - if unique in ['true', '1', 'True']: + if unique in ['true', '1']: lines = [line.strip() for line in content.split('\n') if line.strip()] unique_lines = list(set(lines)) unique_content = '\n'.join(unique_lines) diff --git a/favicon_app/routes/favicon_service.py b/favicon_app/routes/favicon_service.py index ebeb394..af53bd4 100644 --- a/favicon_app/routes/favicon_service.py +++ b/favicon_app/routes/favicon_service.py @@ -7,7 +7,6 @@ import random import re import time from queue import Queue -from threading import Lock from typing import Optional, Tuple, Dict, List import bs4 @@ -350,6 +349,7 @@ class FaviconService: 'request_cache_count': self.request_cache_count, 'queue_size': self.icon_queue.qsize(), 'total_queue_size': self.total_queue.qsize(), + 'domain_list': self.domain_list, } async def get_favicon_handler( @@ -362,7 +362,7 @@ class FaviconService: ) -> dict[str, str] | Response: """处理获取图标的请求""" - logger.info(f"队列大小:{self.icon_queue.qsize()} | {self.total_queue.qsize()} | {len(favicon.failed_urls)}") + logger.info(f"队列大小 icon/total/failed:{self.icon_queue.qsize()} | {self.total_queue.qsize()} | {len(favicon.failed_urls)}") self.url_count += 1 @@ -380,18 +380,18 @@ class FaviconService: # 检查内存缓存中的失败URL if entity.domain in favicon.failed_urls: - _expire_time = favicon.failed_urls[entity.domain] + _expire_time = favicon.failed_urls.get(entity.domain) if int(time.time()) <= _expire_time: return self.get_default(self.time_of_7_days) else: del favicon.failed_urls[entity.domain] # 检查缓存 - _cached, cached_icon = self._get_cache_icon(entity.domain_md5, refresh=refresh in ['true', '1', 'True']) + _cached, cached_icon = self._get_cache_icon(entity.domain_md5, refresh=refresh in ['true', '1']) - if cached_icon: + if _cached or cached_icon: # 使用缓存图标 - icon_content = cached_icon + icon_content = cached_icon if cached_icon else _cached self.request_cache_count += 1 # 确定内容类型和缓存时间 @@ -412,38 +412,32 @@ class FaviconService: media_type=content_type if content_type else "image/x-icon", headers=self._get_header(content_type, cache_time)) else: - _referrer = request.headers.get('referrer') or request.headers.get('referer') + # 开始图标处理,加入两个队列 + self.icon_queue.put(entity.domain) + self.total_queue.put(entity.domain) + # 检查sync参数 - is_sync = sync in ['true', '1', 'True'] - if (not is_sync) or (_referrer and not _referrer.startswith('https://api.xinac.net')): + is_sync = sync in ['true', '1'] + if (not is_sync) or (not check_referer(request)): # 返回默认图片并加入后台队列 logger.info(f"返回默认图片并加入后台队列: {entity.domain}") - # 开始图标处理,加入两个队列 - self.icon_queue.put(entity.domain) - self.total_queue.put(entity.domain) bg_tasks.add_task(self.get_icon_sync, entity, _cached) - return self.get_default() + return self.get_default(0) else: # 没有缓存,实时处理,检查队列大小 queue_size = self.icon_queue.qsize() if queue_size >= self.MAX_QUEUE_SIZE: # 加入后台队列并返回默认图片 logger.info(f"队列大小({queue_size})>={self.MAX_QUEUE_SIZE},返回默认图片并加入后台队列: {entity.domain}") - # 开始图标处理,加入两个队列 - self.icon_queue.put(entity.domain) - self.total_queue.put(entity.domain) bg_tasks.add_task(self.get_icon_sync, entity, _cached) - return self.get_default() + return self.get_default(0) else: # 队列 bool: + _referer = request.headers.get('referrer') or request.headers.get('referer') + if _referer: + return (_referer.startswith('https://api.xinac.net') + or _referer.startswith('http://127.0.0.1') + or _referer.startswith('http://localhost')) + return False diff --git a/main.py b/main.py index ba1a6a4..23a393e 100644 --- a/main.py +++ b/main.py @@ -30,9 +30,9 @@ app.include_router(favicon_router) @app.middleware("http") async def log_referer(request: Request, call_next): - _referrer = request.headers.get('referrer') or request.headers.get('referer') - if _referrer: - FileUtil.write_file(referer_log_file, '%s\n' % _referrer, mode='a') + _referer = request.headers.get('referrer') or request.headers.get('referer') + if _referer: + FileUtil.write_file(referer_log_file, '%s\n' % _referer, mode='a') response = await call_next(request) return response