Add proxymanager
This commit is contained in:
113
database.py
Normal file
113
database.py
Normal file
@@ -0,0 +1,113 @@
|
||||
import os
|
||||
import psycopg2
|
||||
from psycopg2.extras import RealDictCursor
|
||||
from typing import Optional, Dict
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv()
|
||||
|
||||
def get_db_connection():
|
||||
return psycopg2.connect(
|
||||
host=os.getenv("DB_HOST", "localhost"),
|
||||
port=os.getenv("DB_PORT", "5432"),
|
||||
database=os.getenv("DB_NAME", "postgres"),
|
||||
user=os.getenv("DB_USER", "postgres"),
|
||||
password=os.getenv("DB_PASSWORD", ""),
|
||||
cursor_factory=RealDictCursor
|
||||
)
|
||||
|
||||
def get_latest_proxy() -> Optional[Dict]:
|
||||
try:
|
||||
conn = get_db_connection()
|
||||
cursor = conn.cursor()
|
||||
|
||||
cursor.execute("""
|
||||
SELECT
|
||||
id, ip_address, port, protocol, username, password,
|
||||
country_code, country_name, city, is_active, is_anonymous,
|
||||
response_time_ms, last_checked_at, last_successful_at,
|
||||
failure_count, success_count, usage, source, notes,
|
||||
created_at, updated_at
|
||||
FROM proxies
|
||||
WHERE is_active = TRUE
|
||||
ORDER BY
|
||||
last_successful_at DESC NULLS LAST,
|
||||
response_time_ms ASC NULLS LAST,
|
||||
(CASE WHEN success_count + failure_count > 0
|
||||
THEN CAST(success_count AS FLOAT) / (success_count + failure_count)
|
||||
ELSE 0 END) DESC,
|
||||
created_at DESC
|
||||
LIMIT 1
|
||||
""")
|
||||
|
||||
proxy = cursor.fetchone()
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
return dict(proxy) if proxy else None
|
||||
except Exception as e:
|
||||
print(f"Erro ao buscar proxy: {e}")
|
||||
return None
|
||||
|
||||
def delete_proxy(proxy_id: int) -> bool:
|
||||
try:
|
||||
conn = get_db_connection()
|
||||
cursor = conn.cursor()
|
||||
|
||||
cursor.execute("""
|
||||
UPDATE proxies
|
||||
SET is_active = FALSE,
|
||||
failure_count = failure_count + 1,
|
||||
last_checked_at = NOW(),
|
||||
updated_at = NOW()
|
||||
WHERE id = %s
|
||||
""", (proxy_id,))
|
||||
conn.commit()
|
||||
|
||||
updated = cursor.rowcount > 0
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
print(f"Proxy {proxy_id} desativado: {updated}")
|
||||
return updated
|
||||
except Exception as e:
|
||||
print(f"Erro ao desativar proxy {proxy_id}: {e}")
|
||||
return False
|
||||
|
||||
def format_proxy_url(proxy: Dict) -> str:
|
||||
protocol = proxy.get('protocol', 'http').lower()
|
||||
ip_address = proxy.get('ip_address')
|
||||
port = proxy.get('port')
|
||||
username = proxy.get('username')
|
||||
password = proxy.get('password')
|
||||
|
||||
if username and password:
|
||||
return f"{protocol}://{username}:{password}@{ip_address}:{port}"
|
||||
else:
|
||||
return f"{protocol}://{ip_address}:{port}"
|
||||
|
||||
def mark_proxy_success(proxy_id: int) -> bool:
|
||||
try:
|
||||
conn = get_db_connection()
|
||||
cursor = conn.cursor()
|
||||
|
||||
cursor.execute("""
|
||||
UPDATE proxies
|
||||
SET success_count = success_count + 1,
|
||||
last_successful_at = NOW(),
|
||||
last_checked_at = NOW(),
|
||||
updated_at = NOW(),
|
||||
is_active = TRUE
|
||||
WHERE id = %s
|
||||
""", (proxy_id,))
|
||||
conn.commit()
|
||||
|
||||
updated = cursor.rowcount > 0
|
||||
cursor.close()
|
||||
conn.close()
|
||||
|
||||
print(f"Proxy (id {proxy_id}) marcado como sucesso")
|
||||
return updated
|
||||
except Exception as e:
|
||||
print(f"Erro ao marcar proxy {proxy_id} como sucesso: {e}")
|
||||
return False
|
||||
Reference in New Issue
Block a user