10 KiB
ProtonVPN-Integration: Troubleshooting & FAQ
Inhaltsverzeichnis
- Häufige Probleme
- Konfiguration Debug
- Extension-Selektoren aktualisieren
- Performance-Tipps
- Testing ohne VPN
Häufige Probleme
Problem 1: Extension wird nicht gefunden
Symptom: Failed to navigate to ProtonVPN extension popup
Ursache:
- Extension nicht installiert
- Falsche Extension-ID in Konfiguration
- Chrome lädt Extension nicht automatisch
Lösung:
# 1. Extension ID überprüfen
# Chrome öffnen → chrome://extensions/ → ProtonVPN Details anklicken
# Extension ID kopieren und in .env eintragen
PROTONVPN_EXTENSION_ID=ghmbeldphafepmbegfdlkpapadhbakde # Aktualisieren!
# 2. Manuell in Chrome installieren
# https://chrome.google.com/webstore/detail/protonvpn/ghmbeldphafepmbegfdlkpapadhbakde
Problem 2: "Disconnect button not found" oder "Connect button not found"
Symptom: Extension-Buttons werden nicht gefunden
Ursache:
- Extension UI hat sich geändert (Update)
- XPath-Selektoren sind veraltet
- HTML-Struktur unterscheidet sich zwischen Browser-Versionen
Lösung:
// 1. Browser DevTools öffnen
// Chrome: F12 → Öffne chrome-extension://[ID]/popup.html
// 2. HTML inspizieren:
// Right-click auf Button → Inspect Element
// 3. XPath-Selektoren aktualisieren
// In src/scraper/protonvpn_extension.rs:
//
// Falls neuer HTML-Struktur, z.B.:
// <button class="vpn-connect-btn">Connect</button>
//
// Neuer XPath:
let xpath = "//button[@class='vpn-connect-btn']";
// Oder alternative Strategien hinzufügen zur find_and_click_button()-Funktion
Modifizierte find_and_click_button() für neue Selektoren:
async fn find_and_click_button(&self, client: &Client, text: &str) -> Result<()> {
let lower_text = text.to_lowercase();
let xpath_strategies = vec![
// Text-basiert (case-insensitive)
format!(
"//button[contains(translate(text(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '{}')]",
lower_text
),
// CSS-Klassen (AnpassEN nach Bedarf)
format!("//button[contains(@class, '{}')]", text),
// Data-Attribute
format!("//*[@data-action='{}']", lower_text),
// Aria-Label
format!("//*[@aria-label='{}']", text),
// SVG + Text (für moderne UIs)
format!("//*[contains(., '{}')][@role='button']", text),
];
for xpath in xpath_strategies {
if let Ok(element) = client.find(fantoccini::LocatorStrategy::XPath(&xpath)).await {
element.click().await?;
debug!("Clicked: {}", text);
return Ok(());
}
}
Err(anyhow!("Button '{}' not found", text))
}
Problem 3: VPN verbindet sich nicht oder Timeout
Symptom: Failed to connect to ProtonVPN server 'US' within 15 seconds
Ursachen:
- ProtonVPN-Server überlastet
- Netzwerk-Latenz
- Falsche Server-Name
- Browser-Erweiterung nicht vollständig geladen
Lösungen:
A. Timeout erhöhen:
// In protonvpn_extension.rs, connect_to_server():
// Erhöhe von 30 auf 60 Versuche
for attempt in 0..60 { // 30s → 60 Versuche = 30s timeout
sleep(Duration::from_millis(500)).await;
if self.is_connected(client).await.unwrap_or(false) {
return Ok(());
}
}
B. Server-Namen überprüfen:
# Gültige ProtonVPN-Server (für Free-Tier):
# US, UK, JP, NL, etc.
#
# Oder mit Nummern:
# US-Free#1, US-Free#2, UK-Free#1
# US#1, US#2 (für Plus-Tier)
# In .env überprüfen:
VPN_SERVERS=US,UK,JP,NL
# NICHT: VPN_SERVERS=US-Free#1, UK-Free#1 (zu viele Leerzeichen)
C. Extension-Status überprüfen:
// Debug: Printe HTML vor Connect-Versuch
let extension_url = format!("chrome-extension://{}/popup.html", self.extension_id);
client.goto(&extension_url).await?;
sleep(Duration::from_secs(1)).await;
let html = client.source().await?;
println!("=== EXTENSION HTML ===");
println!("{}", html);
println!("=====================");
Problem 4: IP-Adresse wird nicht extrahiert
Symptom: Failed to extract IP from whatismyipaddress.com
Ursache: HTML-Struktur hat sich geändert
Lösung:
// In protonvpn_extension.rs, get_current_ip():
// Füge Debug-Ausgabe hinzu:
let page_source = client.source().await?;
println!("=== PAGE SOURCE ===");
println!("{}", page_source);
println!("===================");
// Dann neue Regex/Extraction-Logik basierend auf aktuellem HTML
Alternative IP-Check-Services:
// icanhazip.com (gibt nur IP zurück)
client.goto("https://icanhazip.com/").await?;
sleep(Duration::from_secs(1)).await;
let ip = client.source().await?.trim().to_string();
// ifconfig.me
client.goto("https://ifconfig.me/").await?;
sleep(Duration::from_secs(1)).await;
let ip = client.source().await?.trim().to_string();
// checkip.amazonaws.com
client.goto("https://checkip.amazonaws.com/").await?;
sleep(Duration::from_secs(1)).await;
let ip = client.source().await?.trim().to_string();
Problem 5: Session-Manager erstellt Sessions, aber VPN verbindet nicht
Symptom: VPN session created, but is_connected() returns false
Ursache:
- WebDriver-Client hat Extension nicht geladen
- ChromeDriver-Instanz verwirrt zwischen mehreren Sessions
Lösung:
Sicherstellen, dass jeder WebDriver-Client die Extension hat:
// In webdriver.rs, ChromeInstance::new() oder new_with_extension():
// Extension-Pfad muss zu Chrome-Start mitgegeben werden
let mut cmd = Command::new("chromedriver-win64/chromedriver.exe");
cmd.arg("--port=0");
// Hinweis: Extension wird automatisch geladen, wenn in Chrome installiert
// Für Testing kann man auch Headless-Modus deaktivieren:
// cmd.arg("--headless=false"); // Damit man Browser sieht
Konfiguration Debug
Enable Debug Logging
# Terminal
RUST_LOG=debug cargo run
# Oder in code:
tracing_subscriber::fmt()
.with_max_level(tracing::Level::DEBUG) // Statt INFO
.init();
Überprüfen Sie die geladene Konfiguration
# .env Datei überprüfen
cat .env
# Oder Ausgabe am Start ansehen
cargo run
# Output sollte zeigen:
# ✓ Config loaded | VPN: enabled | Max Parallel: 3
Test-Konfigurationen
Minimal (ohne VPN):
ENABLE_VPN_ROTATION=false
MAX_PARALLEL_TASKS=1
Mit VPN, aber langsam:
ENABLE_VPN_ROTATION=true
VPN_SERVERS=US,UK
TASKS_PER_VPN_SESSION=5
MAX_PARALLEL_TASKS=1 # Nur eine Instanz für Testing
RUST_LOG=debug
Mit VPN, normal:
ENABLE_VPN_ROTATION=true
VPN_SERVERS=US,UK,JP,NL,DE
TASKS_PER_VPN_SESSION=10
MAX_PARALLEL_TASKS=3
Extension-Selektoren aktualisieren
Wie man neue Selektoren findet
-
Chrome öffnen:
chrome://extensions/ → ProtonVPN → Details -
Popup öffnen:
Navigate to: chrome-extension://[ID]/popup.html -
DevTools öffnen (F12):
- Elements Tab
- Inspect Element (Button rechts oben)
- Klicke auf Button im Popup
-
HTML kopieren:
<!-- Beispiel neuer Button --> <button class="btn btn-primary" id="connect-btn"> <i class="icon-vpn"></i> Connect </button> -
Neuen XPath erstellen:
// Option 1: Nach ID "//button[@id='connect-btn']" // Option 2: Nach Klasse "//button[@class='btn btn-primary']" // Option 3: Nach Text "//button[contains(text(), 'Connect')]" -
In find_and_click_button() hinzufügen:
let xpath_strategies = vec![ "//button[@id='connect-btn']".to_string(), "//button[@class='btn btn-primary']".to_string(), // ... other strategies ];
Performance-Tipps
1. Batch-Processing statt paralleles Threading
// ❌ LANGSAM: Zu viele parallele Instances
let pool = ChromeDriverPool::new(10).await?;
// ✅ SCHNELLER: Weniger Instances, mehr Tasks pro Instance
let pool = ChromeDriverPool::new(3).await?;
config.max_tasks_per_instance = 20; // Recycel nach 20 Tasks
2. VPN-Verbindung optimieren
// ❌ LANGSAM: Jeder Task rotiert IP
TASKS_PER_VPN_SESSION=1
// ✅ SCHNELLER: Mehrere Tasks pro IP
TASKS_PER_VPN_SESSION=10
3. Timing anpassen
// Zu aggressive:
sleep(Duration::from_millis(100)).await;
// Besser (für VPN):
sleep(Duration::from_millis(500)).await;
// Für Disconnect/Connect Sequenzen:
// Mindestens 2-3 Sekunden zwischen Operationen
4. Server-Auswahl
# ❌ Problematic: Zu viele ähnliche Server
VPN_SERVERS=US-Free#1,US-Free#2,US-Free#3,US-Free#4
# ✅ Better: Mix aus verschiedenen Ländern
VPN_SERVERS=US-Free#1,UK-Free#1,JP-Free#1,NL-Free#1
Testing ohne VPN
1. VPN deaktivieren für Testing
ENABLE_VPN_ROTATION=false
MAX_PARALLEL_TASKS=1
ECONOMIC_LOOKAHEAD_MONTHS=1 # Kleinere Datenmenge
2. Mock-Tests schreiben
#[tokio::test]
async fn test_vpn_session_manager() {
let mgr = VpnSessionManager::new(
vec!["US".to_string(), "UK".to_string()],
3
);
mgr.create_new_session().await.unwrap();
assert!(mgr.get_current_session().await.is_some());
}
3. Extension-Fehler isolieren
# Test nur extension.rs
cargo test --lib scraper::protonvpn_extension
4. Scraping ohne VPN testen
# Setze ENABLE_VPN_ROTATION=false
ENABLE_VPN_ROTATION=false RUST_LOG=info cargo run
Weitere Ressourcen
- ProtonVPN Chrome Extension: https://chrome.google.com/webstore/detail/protonvpn/ghmbeldphafepmbegfdlkpapadhbakde
- Fantoccini (WebDriver): https://docs.rs/fantoccini/latest/fantoccini/
- Tokio Runtime: https://tokio.rs/
- Tracing/Logging: https://docs.rs/tracing/latest/tracing/
Support & Debugging-Checkliste
Bevor Sie ein Issue öffnen:
.envist korrekt konfiguriert- ProtonVPN Extension ist installiert
- Chrome + ChromeDriver sind kompatibel
RUST_LOG=debugwurde ausgeführt um Logs zu sehen- Selektoren wurden mit Browser DevTools überprüft
- Test ohne VPN (
ENABLE_VPN_ROTATION=false) funktioniert - Server-Namen sind korrekt (z.B.
US, nichtUSA)