Повторный фикс url

This commit is contained in:
2025-12-05 12:00:11 +03:00
parent 9c095a7229
commit cff2c73b6a
2 changed files with 245 additions and 1 deletions

View File

@@ -0,0 +1,243 @@
#!/usr/bin/env python3
"""
Diagnostic script to test LyngSat parser connectivity in Docker environment.
Run this inside the container to verify FlareSolver connection.
Usage:
# Inside Docker container:
python test_lyngsat_connection.py
# Or with Django environment:
python manage.py shell < test_lyngsat_connection.py
"""
import os
import sys
import requests
from datetime import datetime
# Add Django project to path
sys.path.insert(0, '/app')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dbapp.settings.production')
def test_connection(url: str, timeout: int = 10) -> dict:
"""Test connection to a given URL"""
result = {
"url": url,
"success": False,
"status_code": None,
"error": None,
"response_time": None
}
try:
start_time = datetime.now()
response = requests.get(url, timeout=timeout)
end_time = datetime.now()
result["success"] = True
result["status_code"] = response.status_code
result["response_time"] = (end_time - start_time).total_seconds()
except requests.exceptions.ConnectionError as e:
result["error"] = f"Connection Error: {str(e)}"
except requests.exceptions.Timeout as e:
result["error"] = f"Timeout Error: {str(e)}"
except Exception as e:
result["error"] = f"Unexpected Error: {str(e)}"
return result
def test_flaresolverr(base_url: str) -> dict:
"""Test FlareSolver API endpoint"""
result = {
"base_url": base_url,
"success": False,
"error": None,
"response_time": None
}
try:
start_time = datetime.now()
payload = {
"cmd": "request.get",
"url": "https://www.lyngsat.com/europe.html",
"maxTimeout": 60000
}
response = requests.post(f"{base_url}/v1", json=payload, timeout=30)
end_time = datetime.now()
result["success"] = response.status_code == 200
result["status_code"] = response.status_code
result["response_time"] = (end_time - start_time).total_seconds()
if response.status_code == 200:
json_response = response.json()
result["solution_status"] = json_response.get("status")
result["has_solution"] = "solution" in json_response
except requests.exceptions.ConnectionError as e:
result["error"] = f"Connection Error: {str(e)}"
except requests.exceptions.Timeout as e:
result["error"] = f"Timeout Error: {str(e)}"
except Exception as e:
result["error"] = f"Unexpected Error: {str(e)}"
return result
def print_result(title: str, result: dict):
"""Pretty print test result"""
print(f"\n{'='*60}")
print(f" {title}")
print(f"{'='*60}")
for key, value in result.items():
if value is not None:
status_icon = "" if (key == "success" and value) else ("" if key == "success" else "")
print(f"{status_icon} {key}: {value}")
def main():
print("\n" + "="*60)
print(" LyngSat Parser Connection Diagnostic")
print("="*60)
print(f"Timestamp: {datetime.now().isoformat()}")
print(f"Python: {sys.version}")
# Environment info
print("\n" + "-"*60)
print("Environment Variables:")
print("-"*60)
env_vars = [
"DJANGO_SETTINGS_MODULE",
"CELERY_BROKER_URL",
"REDIS_URL",
"FLARESOLVERR_URL",
"DB_HOST",
"DB_NAME"
]
for key in env_vars:
value = os.environ.get(key, "NOT SET")
print(f" {key}: {value}")
# Try to load Django settings
print("\n" + "-"*60)
print("Django Settings:")
print("-"*60)
try:
import django
django.setup()
from django.conf import settings
print(f" FLARESOLVERR_URL from settings: {getattr(settings, 'FLARESOLVERR_URL', 'NOT SET')}")
print(f" CELERY_BROKER_URL from settings: {getattr(settings, 'CELERY_BROKER_URL', 'NOT SET')}")
print(f" DEBUG: {settings.DEBUG}")
except Exception as e:
print(f" ✗ Cannot load Django settings: {str(e)}")
# Test different FlareSolver URLs
test_urls = [
("localhost:8191", "http://localhost:8191"),
("flaresolverr:8191 (Docker service)", "http://flaresolverr:8191"),
("127.0.0.1:8191", "http://127.0.0.1:8191"),
]
print("\n" + "-"*60)
print("Testing Basic Connectivity:")
print("-"*60)
for name, url in test_urls:
result = test_connection(url)
print_result(f"Connection Test: {name}", result)
# Test FlareSolver API
print("\n" + "-"*60)
print("Testing FlareSolver API:")
print("-"*60)
api_urls = [
("localhost", "http://localhost:8191"),
("flaresolverr (Docker)", "http://flaresolverr:8191"),
]
for name, url in api_urls:
result = test_flaresolverr(url)
print_result(f"FlareSolver API Test: {name}", result)
# Test with actual parser
print("\n" + "-"*60)
print("Testing LyngSat Parser:")
print("-"*60)
try:
from lyngsatapp.parser import LyngSatParser
from django.conf import settings
# Get URL from settings
settings_url = getattr(settings, 'FLARESOLVERR_URL', 'http://flaresolverr:8191/v1')
print(f"\nUsing FLARESOLVERR_URL from settings: {settings_url}")
# Test with different URLs
test_parser_urls = [
("Settings URL", settings_url),
("localhost", "http://localhost:8191/v1"),
("flaresolverr", "http://flaresolverr:8191/v1"),
]
for name, url in test_parser_urls:
print(f"\nTesting parser with {name} ({url})...")
try:
parser = LyngSatParser(flaresolver_url=url, regions=["europe"], target_sats=["express-am6"])
print(f" ✓ Parser initialized")
# Try to get one region page (with timeout)
print(f" → Fetching region page (this may take 10-30 seconds)...")
html_pages = parser.get_region_pages(["europe"])
if html_pages and html_pages[0]:
print(f" ✓ Successfully fetched page (length: {len(html_pages[0])} chars)")
# Check if it contains expected content
if "lyngsat" in html_pages[0].lower():
print(f" ✓ Page contains expected LyngSat content")
break # Success, no need to test other URLs
else:
print(f" ✗ Failed to fetch page (empty response)")
except Exception as e:
print(f" ✗ Parser error: {str(e)}")
import traceback
print(f" Traceback: {traceback.format_exc()}")
except ImportError as e:
print(f" ✗ Cannot import parser: {str(e)}")
except Exception as e:
print(f" ✗ Unexpected error: {str(e)}")
# Recommendations
print("\n" + "="*60)
print(" Recommendations:")
print("="*60)
print("""
1. If 'flaresolverr:8191' works but 'localhost:8191' doesn't:
→ Update parser to use 'flaresolverr:8191' in Docker environment
2. If none work:
→ Check if FlareSolver container is running: docker ps | grep flaresolverr
→ Check Docker network: docker network inspect <network_name>
→ Check FlareSolver logs: docker logs flaresolverr
3. To fix in code:
→ Use environment variable for FlareSolver URL
→ Default to 'flaresolverr:8191' in production
→ Use 'localhost:8191' only in local development
""")
print("\n" + "="*60)
print(" Diagnostic Complete")
print("="*60 + "\n")
if __name__ == "__main__":
main()