SoulBook/soulbook/views/api_blueprint.py
2024-08-01 19:38:07 +08:00

92 lines
3.3 KiB
Python

#!/usr/bin/env python
from urllib.parse import unquote
from sanic import Blueprint
from soulbook.fetcher.extract_novels import extract_chapters
from soulbook.fetcher.function import get_time, get_netloc
from soulbook.fetcher.decorators import authenticator, auth_params, response_handle
from soulbook.fetcher import UniResponse, ResponseField
from soulbook.fetcher.cache import cache_owllook_novels_chapter
from soulbook.fetcher.novels_tools import get_novels_info
from soulbook.config import LOGGER
api_bp = Blueprint('api_blueprint', url_prefix='api')
@api_bp.route("/owl_bd_novels/<name>")
@authenticator('Owllook-Api-Key')
async def owl_bd_novels(request, name):
"""
百度小说信息接口
:param request:
:param name: 小说名
:return: 小说相关信息
"""
name = unquote(name)
novels_name = 'intitle:{name} 小说 阅读'.format(name=name)
try:
res = await get_novels_info(class_name='baidu', novels_name=novels_name)
parse_result = []
if res:
parse_result = [i for i in res if i]
UniResponse.SUCCESS.update({ResponseField.DATA: parse_result, ResponseField.FINISH_AT: get_time()})
return response_handle(request, UniResponse.SUCCESS, 200)
except Exception as e:
LOGGER.exception(e)
return response_handle(request, UniResponse.SERVER_UNKNOWN_ERR, 500)
@api_bp.route("/owl_novels_chapters", methods=['POST'])
@auth_params('chapters_url', 'novels_name')
@authenticator('Owllook-Api-Key')
async def owl_novels_chapters(request, **kwargs):
"""
返回章节目录 基本达到通用
:param request:
:param chapter_url: 章节源目录页url
:param novels_name: 小说名称
:return: 小说目录信息
"""
request_params = kwargs["request_params"]
chapters_url = request_params.get('chapters_url', None)
novels_name = request_params.get('novels_name', None)
netloc = get_netloc(chapters_url)
try:
res = await cache_owllook_novels_chapter(url=chapters_url, netloc=netloc)
chapters_sorted = []
if res:
chapters_sorted = extract_chapters(chapters_url, res)
UniResponse.SUCCESS.update({ResponseField.DATA: {
'novels_name': novels_name,
'chapter_url': chapters_url,
'all_chapters': chapters_sorted
}, ResponseField.FINISH_AT: get_time()})
return response_handle(request, UniResponse.SUCCESS, 200)
except Exception as e:
LOGGER.exception(e)
return response_handle(request, UniResponse.SERVER_UNKNOWN_ERR, 500)
@api_bp.route("/owl_so_novels/<name>")
@authenticator('Owllook-Api-Key')
async def owl_so_novels(request, name):
"""
360小说信息接口
:param request:
:param name: 小说名
:return: 小说相关信息
"""
name = unquote(name)
novels_name = '{name} 小说 免费阅读'.format(name=name)
try:
res = await get_novels_info(class_name='baidu', novels_name=novels_name)
parse_result = []
if res:
parse_result = [i for i in res if i]
UniResponse.SUCCESS.update({ResponseField.DATA: parse_result, ResponseField.FINISH_AT: get_time()})
return response_handle(request, UniResponse.SUCCESS, 200)
except Exception as e:
LOGGER.exception(e)
return response_handle(request, UniResponse.SERVER_UNKNOWN_ERR, 500)