baumi's blog

baumi's personal blog … Linux, OS X, Windows, Random things, …

Python Script für automatisierte EU VIES UID Prüfung, Lösung zu Fehlermeldung: MS_MAX_CONCURRENT_REQ, MS_UNAVAILABLE

Problemstellung: der EU VIES Prüfdienst https://ec.europa.eu/taxation_customs/vies der die Gültigkeit von UID Nummern prüfen soll fällt insbesondere für deutsche UID Nummern immer wieder mal aus, gestern/heute scheint er 24h nicht verfügbar gewesen zu sein, weil der deutsche Server hinter dem EU Service überlastet ist oder nicht verfügbar ist … Der EU VIES Dienst ist dann zwar online und verfügbar, im Hintergrund wird aber der deutsche Server aufgerufen der häufig Probleme macht. Anstelle dem Prüfergebnis erhält man dann Fehlermeldungen wie z.B. MS_UNAVAILABLE oder MS_MAX_CONCURRENT_REQ … also probiert man immer wieder vergeblich und verschwendet (mal wieder) kostbate Zeit für von vorneherein vermeidbare Bürokratie 😉

Lösung #1: Falls Sie Interesse an einem ec.europa.eu PROXY Service für Ihren Webshop haben, den man kinderleicht zwischen den EU-Service und den bestehenden eigenen Webshop schalten kann, um die MS_MAX_CONCURRENT_REQ und/oder MS_UNAVAILABLE abzufedern und dadurch keine Kunden/Bestellungen zu verlieren, schreiben Sie mir: info (ät) interssl.com … KEINE Code-Änderung am eigenen Webshop notwendig!

Lösung #2: Ein Script dem man die UID Nummer übergibt, das alle 5 Minuten prüft solange bis der Dienst wieder funktioniert. Das Ergebnis wird dann als Screenshot gemailt, damit man den Nachweis der Prüfung dokumentiert hat und später ggf. nach der UID Nummer in der Mail-Inbox suchen kann.

Script-Aufruf:
python3 vies_check.py DE12345678

Script Code für “vies_check.py”:

#sudo apt update
#sudo apt install python3 python3-pip chromium-driver
#pip3 install selenium

import time
import sys
import smtplib
from email.message import EmailMessage
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# === KONFIGURATION ===
EMAIL_ABSENDER = "info@firma.com"
EMAIL_EMPFAENGER = "info@firma.com"
EMAIL_SERVER = "my.mailserver.com"
EMAIL_PORT = 587
EMAIL_USER = "mailversanduser"
EMAIL_PASSWORT = "mailversandkennwort"

WIEDERHOLUNG_IN_SEKUNDEN = 300  # alle 5 Minuten erneut versuchen

def pruefe_uid(uid):
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-dev-shm-usage")
    
    driver = webdriver.Chrome(options=chrome_options)

    try:
        driver.get("https://ec.europa.eu/taxation_customs/vies/#/vat-validation")
        wait = WebDriverWait(driver, 20)
        driver.set_window_size(1440, 1440)

        # Cookie-Overlay schließen, wenn es erscheint
        try:
            accept_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.wt-cck--btn-accept-all")))
            accept_button.click()
            print("Cookie-Banner akzeptiert.")
            time.sleep(1)  # Kurze Pause nach dem Klick
        except:
            print("Kein Cookie-Banner sichtbar oder bereits geschlossen.")

        # UID in Land + Nummer aufteilen
        laendercode = uid[:2]
        nummer = uid[2:]

        # Container loswerden
        driver.execute_script("""
            let el = document.querySelector('.wt-cck--container');
            if (el) {
                el.style.display = 'none';
            }
        """)

        # Felder ausfüllen
        driver.find_element(By.ID, "select-country").click()
        time.sleep(1)
        driver.find_element(By.XPATH, f"//option[contains(text(), '{laendercode}')]").click()
        driver.find_element(By.XPATH, f"//input[@type='text']").send_keys(nummer)

        # Absenden
        driver.find_element(By.XPATH, f"//button[@type='submit']").click()

        # Auf Ergebnis warten
        time.sleep(20)

        # Prüfen, ob Ergebnis angezeigt wird
        if "gültig" in driver.page_source or "ungültig" in driver.page_source:
            screenshot_path = f"vat_check_{uid}.png"
            driver.save_screenshot(screenshot_path)
            return screenshot_path
        else:
            print("Ergebnis nicht verfügbar oder Server überlastet.")
            return None
    finally:
        driver.quit()


def sende_email(mit_datei, uid):
    msg = EmailMessage()
    msg["Subject"] = f"Manuelle UID Prüfung {uid}"
    msg["From"] = EMAIL_ABSENDER
    msg["To"] = EMAIL_EMPFAENGER
    msg.set_content(f"Anbei das Ergebnis der VAT UID Prüfung für {uid}.")

    with open(mit_datei, "rb") as f:
        file_data = f.read()
        msg.add_attachment(file_data, maintype="image", subtype="png", filename=mit_datei)

    with smtplib.SMTP(EMAIL_SERVER, EMAIL_PORT) as server:
        server.starttls()
        server.login(EMAIL_USER, EMAIL_PASSWORT)
        server.send_message(msg)
        print(f"E-Mail mit Screenshot wurde gesendet an {EMAIL_EMPFAENGER}.")

def main():
    if len(sys.argv) < 2:
        print("Nutzung: python3 vies_check.py ATU12345678")
        sys.exit(1)

    uid = sys.argv[1]

    while True:
        print(f"Versuche UID {uid} zu prüfen...")
        screenshot = pruefe_uid(uid)
        if screenshot:
            sende_email(screenshot, uid)
            break
        else:
            print(f"Fehler bei Prüfung, versuche es erneut in {WIEDERHOLUNG_IN_SEKUNDEN} Sekunden...")
            time.sleep(WIEDERHOLUNG_IN_SEKUNDEN)

if __name__ == "__main__":
    main()

Comments are currently closed.