Hallo Allemaal,
Ik lees graag vaak (ongeregistreerd) mee op het forum, maar lijkt me ook goed nu iets bij te dragen. Ik lever geen support, maar ongetwijfeld dat het mensen in de juiste richting kan helpen. Onderstaande script heb ik gemaakt voor het uitlezen van het TXT bestand (log) van PDW. Je moet hiervoor Python installeren, en een aantal librarys (pip) om dit te laten werken. Dit script lees "live" mee in de logfile, en zodra een melding compleet is post die die in een JSON naar een webapi. Ik gebruik dit script nu in de eerste testfase voor mijn site MeldingsMonitor. Er zit ook een script in welke iedere nacht een nieuwe Bearer AUTH token ophaalt, indien nodig voor je API. Ander zou je dit deel eruit kunnen halen.
De code
import time
import os
import threading
import requests
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
###############################################################################
# INSTELLINGEN
###############################################################################
WATCH_PATH = r"C:\\pdw\\Logfiles"
VALID_EXTENSIONS = (".log", ".txt")
file_offsets = {}
group_buffers = {}
last_activity_time = {}
TIMEOUT_SECONDS = 3
API_URL = "https://apiurlommeldingenteposten.nl"
AUTH_LOGIN_URL = "https://apiurlomauthtokenoptehalen.nl"
EMAIL = "gebruikersnaam"
PASSWORD = "wachtwoord"
HEADERS = {
"Authorization": "",
"Content-Type": "application/json"
}
###############################################################################
# AUTHENTICATIE
###############################################################################
def refresh_auth_token():
global HEADERS
try:
response = requests.post(AUTH_LOGIN_URL, json={"email": EMAIL, "password": PASSWORD})
response.raise_for_status()
auth_token = response.json().get("authToken")
if auth_token:
HEADERS["Authorization"] = f"Bearer {auth_token}"
print(f"[INFO] AUTH_TOKEN vernieuwd.")
else:
print("[ERROR] AUTH_TOKEN niet gevonden in response.")
except Exception as e:
print(f"[ERROR] Kan AUTH_TOKEN niet vernieuwen: {e}")
###############################################################################
# WATCHDOG EVENT HANDLER
###############################################################################
class PDWLogHandler(FileSystemEventHandler):
def on_created(self, event):
if not event.is_directory and event.src_path.lower().endswith(VALID_EXTENSIONS):
initialize_file(event.src_path)
read_new_lines(event.src_path)
def on_modified(self, event):
if not event.is_directory and event.src_path.lower().endswith(VALID_EXTENSIONS):
if event.src_path not in group_buffers:
initialize_file(event.src_path)
read_new_lines(event.src_path)
###############################################################################
# HULPFUNCTIES
###############################################################################
def initialize_file(filepath):
group_buffers[filepath] = []
last_activity_time[filepath] = time.time()
try:
with open(filepath, "rb") as f:
f.seek(0, os.SEEK_END)
file_offsets[filepath] = f.tell()
except:
file_offsets[filepath] = 0
def read_new_lines(filepath):
try:
with open(filepath, "r", encoding="utf-8", errors="replace") as f:
f.seek(file_offsets[filepath])
new_lines = f.readlines()
if new_lines:
last_activity_time[filepath] = time.time()
process_lines(filepath, new_lines)
file_offsets[filepath] = f.tell()
except Exception as e:
print(f"[ERROR] Kon niet lezen uit {filepath}: {e}")
def process_lines(filepath, lines):
current_group = []
for line in lines:
line = line.strip()
if not line:
if current_group:
process_group(filepath, current_group)
current_group = []
else:
current_group.append(line)
if current_group:
process_group(filepath, current_group)
def process_group(filepath, group):
try:
first_line_parts = group[0].split(None, 6)
if len(first_line_parts) < 7:
print(f"[WAARSCHUWING] Onverwacht formaat regel: {group[0]}")
return
time_ = first_line_parts[1]
melding = first_line_parts[-1]
unique_key = f"{time_}_{melding}"
if unique_key in group_buffers.get(filepath, []):
print(f"[INFO] Melding al verwerkt: {unique_key}")
return
group_buffers[filepath].append(unique_key)
capcodes = [line.split(None, 6)[0] for line in group if len(line.split(None, 6)) >= 7]
timestamp = int(time.time() * 1000)
form_data = {
"capcodes": capcodes,
"message": melding,
"location": 0,
"timestamp": timestamp
}
response = requests.post(API_URL, json=form_data, headers=HEADERS)
print(f"\n== VERWERKTE MELDING ==\nTijd: {time_}\nCapcodes: {capcodes}\nMelding: {melding}\nResponse: {response.status_code} {response.text}\n================================\n")
except Exception as e:
print(f"[ERROR] Kon de groep niet verwerken: {e}")
###############################################################################
# TIMEOUT-WORKER
###############################################################################
def timeout_worker():
while True:
now = time.time()
for fp in list(last_activity_time.keys()):
if fp in group_buffers and group_buffers[fp] and now - last_activity_time[fp] > TIMEOUT_SECONDS:
finalize_group(fp)
time.sleep(0.05)
def finalize_group(filepath):
group_buffers[filepath] = []
###############################################################################
# AUTHENTICATION-WORKER
###############################################################################
def auth_worker():
while True:
refresh_auth_token()
time.sleep(86400) # Token vernieuwen elke 24 uur
###############################################################################
# MAIN
###############################################################################
def main():
threading.Thread(target=timeout_worker, daemon=True).start()
threading.Thread(target=auth_worker, daemon=True).start()
observer = Observer()
event_handler = PDWLogHandler()
observer.schedule(event_handler, WATCH_PATH, recursive=False)
observer.start()
print(f"[INFO] Monitoring directory: {WATCH_PATH}")
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
if __name__ == "__main__":
refresh_auth_token() # Initial token ophalen
main()
Resultaat is deze JSON
{
"capcodes": ["123456", "654321", "789012"],
"message": "Voorbeeld meldingstekst",
"location": 0,
"timestamp": 1700000000000
}