Bump version to v1.7.1

This commit is contained in:
Oliver 2025-08-28 11:18:30 +02:00
parent a46d919118
commit d65c55d315
No known key found for this signature in database
10 changed files with 1520 additions and 75 deletions

51
utils/config.py Normal file
View file

@ -0,0 +1,51 @@
import os
from typing import Dict, List
from dotenv import load_dotenv
load_dotenv()
def validate_env() -> Dict:
"""Validiert sicherheitsrelevante .env-Variablen.
Returns dict with: ok: bool, errors: List[str], warnings: List[str], summary: Dict[str, bool]
"""
errors: List[str] = []
warnings: List[str] = []
wp_base_url = os.getenv("WP_BASE_URL", "").strip()
wp_user = os.getenv("WP_USERNAME", "").strip()
wp_pass = os.getenv("WP_PASSWORD", "").strip()
wp_b64 = os.getenv("WP_AUTH_BASE64", "").strip()
openai_key = os.getenv("OPENAI_API_KEY", "").strip()
# WP_BASE_URL Pflicht
if not wp_base_url:
errors.append("WP_BASE_URL fehlt in .env")
elif not (wp_base_url.startswith("http://") or wp_base_url.startswith("https://")):
errors.append("WP_BASE_URL muss mit http:// oder https:// beginnen")
# Auth-Creds: entweder Base64 ODER Username+Password
if not wp_b64 and not (wp_user and wp_pass):
errors.append("Entweder WP_AUTH_BASE64 oder WP_USERNAME + WP_PASSWORD in .env setzen")
# Empfehlungen
if not wp_b64 and (wp_user and wp_pass):
warnings.append("WP_AUTH_BASE64 nicht gesetzt Empfehlung: Base64 nutzen (Application Password)")
if not openai_key:
warnings.append("OPENAI_API_KEY ist nicht gesetzt Umschreibungsfunktion ist deaktiviert")
summary = {
"WP_BASE_URL": bool(wp_base_url),
"WP_USERNAME": bool(wp_user),
"WP_PASSWORD": bool(wp_pass),
"WP_AUTH_BASE64": bool(wp_b64),
"OPENAI_API_KEY": bool(openai_key),
}
return {"ok": len(errors) == 0, "errors": errors, "warnings": warnings, "summary": summary}
__all__ = ["validate_env"]

View file

@ -11,17 +11,16 @@ from dotenv import load_dotenv
load_dotenv()
# WordPress API Konfiguration
WP_BASE_URL = os.getenv("WP_BASE_URL", "https://vanityontour.de")
WP_USERNAME = os.getenv("WP_USERNAME", "ogiertz")
WP_PASSWORD = os.getenv("WP_PASSWORD", "whNEx9aZCIUXViV89Z3e7Z03")
WP_AUTH_BASE64 = os.getenv("WP_AUTH_BASE64", "b2dpZXJ0ejp3aE5FeDlhWkNJVVhWaVY4OVozZTdaMDM=")
WP_API_ENDPOINT = f"{WP_BASE_URL}/wp-json/wp/v2"
# WordPress API Konfiguration ausschließlich aus .env
WP_BASE_URL = os.getenv("WP_BASE_URL")
WP_USERNAME = os.getenv("WP_USERNAME")
WP_PASSWORD = os.getenv("WP_PASSWORD")
WP_AUTH_BASE64 = os.getenv("WP_AUTH_BASE64")
# Request-Konfiguration
REQUEST_TIMEOUT = 30
MAX_RETRIES = 3
USER_AGENT = 'RSS-Feed-Manager/1.6.1'
USER_AGENT = 'RSS-Feed-Manager/1.7.x'
class WordPressUploader:
"""
@ -30,41 +29,43 @@ class WordPressUploader:
"""
def __init__(self):
self.base_url = WP_BASE_URL
self.api_endpoint = WP_API_ENDPOINT
# Basis-URL validieren und Endpunkt bauen
if not WP_BASE_URL:
raise ValueError("WP_BASE_URL nicht gesetzt. Bitte .env konfigurieren.")
self.base_url = WP_BASE_URL.rstrip('/')
self.api_endpoint = f"{self.base_url}/wp-json/wp/v2"
# Zugangsdaten (aus .env)
self.username = WP_USERNAME
self.password = WP_PASSWORD
self.auth_base64 = WP_AUTH_BASE64
if not self.auth_base64 and not (self.username and self.password):
raise ValueError("WordPress-Authentifizierung nicht konfiguriert. WP_AUTH_BASE64 oder WP_USERNAME + WP_PASSWORD setzen.")
# Session für bessere Performance
self.session = requests.Session()
# Authentifizierung über Authorization Header mit Base64
if self.auth_base64:
# Verwende bereitgestellten Base64-String
self.session.headers.update({
'Authorization': f'Basic {self.auth_base64}',
'User-Agent': USER_AGENT,
'Content-Type': 'application/json',
'Accept': 'application/json'
})
logging.info("✅ WordPress-Authentifizierung: Verwende bereitgestellten Base64-String")
logging.info("✅ WordPress-Authentifizierung: Base64-String verwendet")
else:
# Fallback: Generiere Base64 aus Username/Password
if self.username and self.password:
credentials = f"{self.username}:{self.password}"
encoded_credentials = base64.b64encode(credentials.encode('utf-8')).decode('utf-8')
self.session.headers.update({
'Authorization': f'Basic {encoded_credentials}',
'User-Agent': USER_AGENT,
'Content-Type': 'application/json',
'Accept': 'application/json'
})
logging.info("✅ WordPress-Authentifizierung: Base64 aus Username/Password generiert")
else:
logging.error("❌ WordPress-Authentifizierung: Weder Base64-String noch Username/Password verfügbar")
raise ValueError("WordPress-Authentifizierung nicht konfiguriert")
credentials = f"{self.username}:{self.password}"
encoded_credentials = base64.b64encode(credentials.encode('utf-8')).decode('utf-8')
self.session.headers.update({
'Authorization': f'Basic {encoded_credentials}',
'User-Agent': USER_AGENT,
'Content-Type': 'application/json',
'Accept': 'application/json'
})
logging.info("✅ WordPress-Authentifizierung: Base64 aus Username/Password generiert")
# Standard-Kategorie ID ermitteln
self.default_category_id = self._get_default_category_id()
@ -335,11 +336,7 @@ class WordPressUploader:
Testet die Verbindung zur WordPress API mit Base64-Authentifizierung
"""
try:
logging.info("🔧 Teste WordPress-API-Verbindung mit Base64-Auth...")
# Debug: Auth-Header prüfen
auth_header = self.session.headers.get('Authorization', 'Nicht gesetzt')
logging.info(f"🔑 Authorization Header: {auth_header[:20]}..." if len(auth_header) > 20 else f"🔑 Authorization Header: {auth_header}")
logging.info("🔧 Teste WordPress-API-Verbindung...")
# Einfache Abfrage der Kategorien als Test
response = self.session.get(
@ -349,7 +346,6 @@ class WordPressUploader:
)
logging.info(f"📡 API-Response Status: {response.status_code}")
logging.info(f"📡 API-Response Headers: {dict(response.headers)}")
if response.status_code == 200:
logging.info("✅ WordPress-API-Verbindung erfolgreich")
@ -465,4 +461,4 @@ def upload_single_article_to_wordpress(article: Dict) -> Tuple[bool, str, Option
return False, connection_msg, None
# Artikel hochladen
return uploader.upload_article(article)
return uploader.upload_article(article)