From 5cbb03f7742e3683560ec8e06fd98bdfe7f663a9 Mon Sep 17 00:00:00 2001 From: iRaven4522 Date: Wed, 30 Apr 2025 20:15:41 -0500 Subject: [PATCH] Updated for Pi-Hole v6! --- main.py | 136 +++++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 111 insertions(+), 25 deletions(-) diff --git a/main.py b/main.py index f20e577..6fa4cb4 100644 --- a/main.py +++ b/main.py @@ -49,12 +49,34 @@ def loginToNPM(apiurl, user, pw): # To retrieve NPM's API session token return None - -def loginToPihole(apiurl, phpassword): +def loginToPihole(serveraddr, phpassword, session): + # NEW Method as of Pi-Hole version 6.0 and newer. + # I truly appreciate them fixing but this broke so many things. + apiurl = "http://" + serveraddr + "/api/auth" + passwordjson = {"password": phpassword} + loginrq = session.request("POST", apiurl, json=passwordjson, verify=False) + log.debug("Sent POST for getting Pi-hole API authorization.") + if loginrq.status_code == 200: # yay + log.debug("API returned a 200, proceeding.") # We're good c: + log.info("Logged into Pi-hole API on "+serveraddr+"!") + fullresponse = loginrq.json() + phpsessid = fullresponse["session"]["sid"] + token = fullresponse["session"]["csrf"] + log.debug("phpsessid: " + phpsessid + " Token: "+ token) + return {'phpsessid': phpsessid, "csrftoken": token} + elif loginrq.status_code == 401: # Unauthorized + log.debug("Pi-hole returned a 401, halting!") + log.error("The Pi-hole retured an unauthorized error!") + log.error("Please make sure your Pi-hole password in conf.json is correct and accurate.") + return None + else: + log.error("Pi-hole returned this " + str(apireq.status_code) + " in error: "+ apireq.text) + +def loginToPiholeOld(apiurl, phpassword): # For whatever reason, Pi-hole's web CSRF token is in a hidden
element returned by the login.php in the homepage right after you login. # This took *WAY* too long to figure out. This should be in the header for ease-of-use. session = requests.Session() - url = apiurl + "/login.php" + url = "http://" + apiurl + "/admin/login.php" loginrq = session.post(url,data={"pw": phpassword}) phpsessid = (str(loginrq.cookies.get_dict()["PHPSESSID"])) regex = r'(