Last active
May 31, 2026 10:59
-
-
Save x-magic/990568de4cd72890e663aeb687c4dfe9 to your computer and use it in GitHub Desktop.
FlareSolverr XML Bridge - Transparently proxy RSS request through FlareSolverr
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import os | |
| from flask import Flask, request, Response | |
| import requests | |
| import logging | |
| # Force all requests to be IPv4 | |
| requests.packages.urllib3.util.connection.HAS_IPV6 = False | |
| app = Flask(__name__) | |
| FS_URL = os.getenv("FS_URL", "http://foobar.local:8191/v1") | |
| logging.basicConfig(level=logging.INFO) | |
| logger = logging.getLogger('waitress') | |
| logger.setLevel(logging.INFO) | |
| @app.route('/get') | |
| def proxy(): | |
| # Use: http://bridge-domain:5191/get?mime=text/html&url=https://site.com | |
| # target URL better to be url-encoded to ensure querystring are properly parsed | |
| target_url = request.args.get('url') | |
| if not target_url: | |
| return "Missing url parameter", 400 | |
| expected_mime = request.args.get('mime') | |
| if not expected_mime: | |
| expected_mime = 'text/html' | |
| payload = { | |
| "cmd": "request.get", | |
| "url": target_url, | |
| "session": "bridge-session", | |
| "maxTimeout": 60000 | |
| } | |
| try: | |
| fs_handle = requests.post(FS_URL, json=payload) | |
| fs_response = fs_handle.json() | |
| logging.info("FS request.get: " + fs_handle.text[:350]) | |
| except Exception as e: | |
| return str(e), 500 | |
| if expected_mime != "application/xml": | |
| return Response( | |
| fs_response['solution']['response'], | |
| status=fs_response['solution']['status'], | |
| mimetype=expected_mime | |
| ) | |
| else: | |
| # re-request XML directly from original website as FS returns false XML output | |
| xml_response = request_true_xml(fs_response) | |
| return Response( | |
| xml_response.text, | |
| status=xml_response.status_code, | |
| mimetype=expected_mime | |
| ) | |
| def create_fs_session(): | |
| # Create a session for future use | |
| payload = { | |
| "cmd": "sessions.create", | |
| "session": "bridge-session" | |
| } | |
| try: | |
| request = requests.post(FS_URL, json=payload) | |
| logging.info("FS sessions.create: " + request.text) | |
| except Exception as e: | |
| logging.error(e) | |
| def request_true_xml(fs_response): | |
| logging.info("Request is XML, re-retrieve raw data") | |
| url = fs_response['solution']['url'] | |
| headers = { | |
| "User-Agent": fs_response['solution']['userAgent'], | |
| "Accept": "application/xml" | |
| } | |
| cookies = {} | |
| for cookie in fs_response['solution']['cookies']: | |
| cookies[cookie["name"]] = cookie['value'] | |
| response = requests.get(url, headers=headers, cookies=cookies) | |
| return response | |
| if __name__ == '__main__': | |
| # create or refresh FS session to ensure it's usable later | |
| create_fs_session() | |
| # and start server | |
| from waitress import serve | |
| serve(app, host='0.0.0.0', port=5191) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/sh | |
| docker run -d \ | |
| --name flaresolverr-xml-bridge \ | |
| -p 5191:5191 \ | |
| -e FS_URL="http://<your-fs-address:port>/v1" \ | |
| --restart unless-stopped \ | |
| python:3-slim \ | |
| sh -c "apt-get update && apt-get install -y curl && \ | |
| mkdir /app && cd /app && \ | |
| curl -sSL https://gist.github.com/x-magic/990568de4cd72890e663aeb687c4dfe9/raw/requirements.txt -o requirements.txt && \ | |
| curl -sSL https://gist.github.com/x-magic/990568de4cd72890e663aeb687c4dfe9/raw/app.py -o app.py && \ | |
| pip install --no-cache-dir -r requirements.txt && \ | |
| python app.py" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| flask | |
| requests | |
| waitress |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment