fix: Usunięto Session z decode_google_news_url, dodano max_depth

- Zamieniono requests.Session() na bezpośredni requests.get()
- Dodano max_depth=3 jako zabezpieczenie przed nieskończoną rekurencją
- Jawne zamykanie response.close() po każdym request

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
Maciej Pienczyn 2026-01-15 07:45:02 +01:00
parent af4c0d157a
commit 8055589a08

View File

@ -46,7 +46,7 @@ HEADERS = {
REQUEST_TIMEOUT = 15 REQUEST_TIMEOUT = 15
def decode_google_news_url(google_url: str) -> str | None: def decode_google_news_url(google_url: str, max_depth: int = 3) -> str | None:
""" """
Dekoduj URL Google News do oryginalnego źródła. Dekoduj URL Google News do oryginalnego źródła.
@ -54,9 +54,15 @@ def decode_google_news_url(google_url: str) -> str | None:
1. /rss/articles/CBMi... - Base64 encoded 1. /rss/articles/CBMi... - Base64 encoded
2. /articles/CBMi... - Base64 encoded 2. /articles/CBMi... - Base64 encoded
3. Przekierowania przez consent.google.com 3. Przekierowania przez consent.google.com
"""
# Metoda 1: Dekodowanie Base64 z URL Args:
google_url: URL do zdekodowania
max_depth: Maksymalna głębokość (zabezpieczenie przed nieskończoną pętlą)
"""
if max_depth <= 0:
return None
# Metoda 1: Dekodowanie Base64 z URL (preferowana - bez HTTP request)
try: try:
# Znajdź zakodowaną część # Znajdź zakodowaną część
match = re.search(r'/articles/([A-Za-z0-9_-]+)', google_url) match = re.search(r'/articles/([A-Za-z0-9_-]+)', google_url)
@ -73,7 +79,6 @@ def decode_google_news_url(google_url: str) -> str | None:
decoded = base64.urlsafe_b64decode(encoded) decoded = base64.urlsafe_b64decode(encoded)
# Szukaj URL-ów w zdekodowanych danych # Szukaj URL-ów w zdekodowanych danych
# Format: często zaczyna się od \x08 i zawiera URL po kilku bajtach
urls = re.findall(rb'https?://[^\x00-\x1f\s"\'<>]+', decoded) urls = re.findall(rb'https?://[^\x00-\x1f\s"\'<>]+', decoded)
for url in urls: for url in urls:
@ -82,9 +87,9 @@ def decode_google_news_url(google_url: str) -> str | None:
# Pomijamy URL-e Google # Pomijamy URL-e Google
if 'google.' not in url_str and len(url_str) > 20: if 'google.' not in url_str and len(url_str) > 20:
# Wyczyść URL # Wyczyść URL
url_str = url_str.split('\x00')[0] # Usuń null bytes url_str = url_str.split('\x00')[0]
url_str = url_str.split('\r')[0] # Usuń CR url_str = url_str.split('\r')[0]
url_str = url_str.split('\n')[0] # Usuń LF url_str = url_str.split('\n')[0]
if url_str.startswith('http'): if url_str.startswith('http'):
return url_str return url_str
except: except:
@ -94,30 +99,32 @@ def decode_google_news_url(google_url: str) -> str | None:
except Exception as e: except Exception as e:
pass pass
# Metoda 2: Podążaj za przekierowaniami # Metoda 2: Podążaj za przekierowaniami (tylko jeśli Base64 nie zadziałał)
# UWAGA: Ta metoda wykonuje HTTP request
try: try:
# Użyj context manager żeby zamknąć sesję po użyciu response = requests.get(
with requests.Session() as session: google_url,
session.headers.update(HEADERS) headers=HEADERS,
timeout=REQUEST_TIMEOUT,
allow_redirects=True
)
final_url = response.url
response.close()
response = session.get(google_url, timeout=REQUEST_TIMEOUT, allow_redirects=True) # Jeśli wylądowaliśmy na consent.google.com, wyciągnij URL z parametrów
final_url = response.url if 'consent.google.com' in final_url:
response.close() # Jawne zamknięcie odpowiedzi parsed = urlparse(final_url)
params = parse_qs(parsed.query)
if 'continue' in params:
continue_url = unquote(params['continue'][0])
# Iteracyjnie dekoduj (nie rekurencyjnie!)
if 'news.google.com' in continue_url:
return decode_google_news_url(continue_url, max_depth - 1)
return continue_url
# Jeśli wylądowaliśmy na consent.google.com, szukaj URL w parametrach # Jeśli to nie jest Google, mamy oryginalny URL
if 'consent.google.com' in final_url: if 'google.com' not in final_url:
parsed = urlparse(final_url) return final_url
params = parse_qs(parsed.query)
if 'continue' in params:
continue_url = unquote(params['continue'][0])
# Rekurencyjnie dekoduj
if 'news.google.com' in continue_url:
return decode_google_news_url(continue_url)
return continue_url
# Jeśli to nie jest Google, mamy oryginalny URL
if 'google.com' not in final_url:
return final_url
except Exception as e: except Exception as e:
pass pass