Last active
August 14, 2020 20:01
-
-
Save axlan/402f847f2819ecd59a43f708dd27dae4 to your computer and use it in GitHub Desktop.
PiHole Web Admin Python Control
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import re | |
import urllib.parse | |
import requests | |
class PiHoleControl(): | |
headers = {'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8'} | |
def __get_token(self): | |
resp = self.session.get(f'http://{self.host}/admin/groups-domains.php?type=black') | |
lines = resp.text.splitlines() | |
token = None | |
token_re = re.compile(r'<div id="token" hidden>(.+)</div>') | |
for line in lines: | |
m = token_re.match(line) | |
if m is not None: | |
token = m.group(1) | |
return urllib.parse.quote(token) | |
def __init__(self, host, persistentlogin): | |
self.session = requests.session() | |
self.host = host | |
login_cookie = {'persistentlogin': persistentlogin} | |
requests.utils.add_dict_to_cookiejar(self.session.cookies, login_cookie) | |
self.token = self.__get_token() | |
def get_blacklist_group(self): | |
data = f'action=get_domains&showtype=black&token={self.token}' | |
resp = self.session.post(f'http://{self.host}/admin/scripts/pi-hole/php/groups.php', headers=PiHoleControl.headers, data=data) | |
return resp.json()['data'] | |
def set_blacklist_item_by_id(self, item_id, item_type, comment, enable): | |
if enable: | |
status = 1 | |
else: | |
status = 0 | |
data = f'action=edit_domain&id={item_id}&type={item_type}&comment={comment}&status={status}&token={self.token}' | |
self.session.post(f'http://{self.host}/admin/scripts/pi-hole/php/groups.php', headers=PiHoleControl.headers, data=data) | |
def set_blacklist_item_by_comment(self, comment, enable): | |
black_list = self.get_blacklist_group() | |
domain = None | |
for val in black_list: | |
if val['comment'] == comment: | |
domain = val | |
break | |
if domain is None: | |
print(f'Domain not found matching comment: {comment}') | |
return | |
self.set_blacklist_item_by_id(domain['id'], domain['type'], comment, enable) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment