FlareSolverr/src/flaresolverr.py
2022-09-24 16:18:36 +02:00

96 lines
2.6 KiB
Python

import json
import logging
import os
import sys
from bottle import run, response, Bottle, request
from bottle_plugins.error_plugin import error_plugin
from bottle_plugins.logger_plugin import logger_plugin
from dtos import IndexResponse, V1RequestBase
import flaresolverr_service
import utils
class JSONErrorBottle(Bottle):
"""
Handle 404 errors
"""
def default_error_handler(self, res):
response.content_type = 'application/json'
return json.dumps(dict(error=res.body, status_code=res.status_code))
app = JSONErrorBottle()
# plugin order is important
app.install(logger_plugin)
app.install(error_plugin)
@app.route('/')
def index():
"""
Show welcome message
"""
res = flaresolverr_service.index_endpoint()
return utils.object_to_dict(res)
@app.route('/health')
def health():
"""
Healthcheck endpoint.
This endpoint is special because it doesn't print traces
"""
res = flaresolverr_service.health_endpoint()
return utils.object_to_dict(res)
@app.post('/v1')
def controller_v1():
"""
Controller v1
"""
req = V1RequestBase(request.json)
res = flaresolverr_service.controller_v1_endpoint(req)
if res.__error_500__:
response.status = 500
return utils.object_to_dict(res)
if __name__ == "__main__":
# validate configuration
log_level = os.environ.get('LOG_LEVEL', 'info').upper()
log_html = utils.get_config_log_html()
headless = utils.get_config_headless()
server_host = os.environ.get('HOST', '0.0.0.0')
server_port = int(os.environ.get('PORT', 8191))
# configure logger
logger_format = '%(asctime)s %(levelname)-8s %(message)s'
if log_level == 'DEBUG':
logger_format = '%(asctime)s %(levelname)-8s ReqId %(thread)s %(message)s'
logging.basicConfig(
format=logger_format,
level=log_level,
datefmt='%Y-%m-%d %H:%M:%S',
handlers=[
logging.StreamHandler(sys.stdout)
]
)
# disable warning traces from urllib3
logging.getLogger('urllib3').setLevel(logging.ERROR)
logging.getLogger('selenium.webdriver.remote.remote_connection').setLevel(logging.WARNING)
logging.getLogger('undetected_chromedriver').setLevel(logging.WARNING)
logging.info(f'FlareSolverr {utils.get_flaresolverr_version()}')
logging.debug('Debug log enabled')
# test browser installation
flaresolverr_service.test_browser_installation()
# start webserver
# default server 'wsgiref' does not support concurrent requests
run(app, host=server_host, port=server_port, quiet=True, server='waitress')