#!/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/") @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/") @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)