104 lines
3.5 KiB
Python
104 lines
3.5 KiB
Python
import requests
|
|
import utils
|
|
import pathlib
|
|
|
|
|
|
def get_blocklists(path_to_blocklists: str = None):
|
|
# __file__ is a special variable that is the path to the current file
|
|
# list_directory = pathlib.Path(__file__).parent.parent.joinpath("blocklists")
|
|
|
|
list_directory = pathlib.Path(path_to_blocklists)
|
|
for file in list_directory.iterdir():
|
|
blocklists = utils.convert_to_list(file)
|
|
return blocklists
|
|
|
|
|
|
def apply_whitelists(blocklists, whitelist: str = None):
|
|
whitelist = utils.convert_to_list(
|
|
# pathlib.Path(__file__).parent.parent.joinpath("whitelist.txt")
|
|
pathlib.Path(whitelist)
|
|
)
|
|
blocklists = [x for x in blocklists if x not in whitelist]
|
|
return blocklists
|
|
|
|
|
|
def split_list(blocklists):
|
|
lists = []
|
|
lists.extend(
|
|
[blocklists[i : i + 1000] for i in range(0, len(blocklists), 1000)]
|
|
) # This is the same as the for loop below
|
|
# for i in range(0, len(blocklists), 1000):
|
|
# # This is appending a list of 1000 domains to the lists list. It is doing this by slicing the blocklists list to get the first 1000 domains, then the next 1000 domains, etc.
|
|
# lists.append(blocklists[i:i + 1000])
|
|
return lists
|
|
|
|
|
|
def upload_to_cloudflare(lists, account_id: str, token: str) -> None:
|
|
# A: It's iterating over the lists and uploading them to Cloudflare, the enumerate function is used to get the index of the list since lists is a list of lists
|
|
for i, lst in enumerate(lists):
|
|
list_name = f"adblock-list-{i + 1}"
|
|
url = (
|
|
f"https://api.cloudflare.com/client/v4/accounts/{account_id}/gateway/lists"
|
|
)
|
|
headers = {
|
|
"Authorization": f"Bearer {token}",
|
|
"Content-Type": "application/json",
|
|
}
|
|
|
|
data = {
|
|
"name": list_name,
|
|
"type": "DOMAIN",
|
|
"description": "A blocklist of ad domains",
|
|
# Writing this program, I have noticed how powerful list comprehension is.
|
|
"items": [
|
|
{
|
|
"value": x,
|
|
}
|
|
for x in lst
|
|
],
|
|
}
|
|
response = requests.post(url, headers=headers, json=data, timeout=10)
|
|
print(f"Uploaded {list_name} to Cloudflare")
|
|
if response.status_code != 200:
|
|
print(f"Error uploading {list_name}: {response.text}")
|
|
|
|
|
|
def create_dns_policy(lists, account_id: str, token: str) -> None:
|
|
url = f"https://api.cloudflare.com/client/v4/accounts/{account_id}/gateway/rules"
|
|
headers = {
|
|
"Authorization": f"Bearer {token}",
|
|
"Content-Type": "application/json",
|
|
}
|
|
# Construct the traffic string
|
|
traffic = ""
|
|
for i, lst in enumerate(lists):
|
|
if i != 0:
|
|
# ' or ' cannot be seen in the Zero Trs Dashboard
|
|
traffic += " or "
|
|
traffic += f'any(dns.domains[*] in ${lst["id"]})'
|
|
# print(traffic)
|
|
data = {
|
|
"name": "Block Ads",
|
|
"description": "Block ad domains",
|
|
"action": "block",
|
|
"traffic": traffic,
|
|
"enabled": True,
|
|
}
|
|
response = requests.post(url, headers=headers, json=data, timeout=10)
|
|
if response.status_code != 200:
|
|
print(f"Error creating DNS policy: {response.text}")
|
|
|
|
|
|
def main():
|
|
blocklists = get_blocklists()
|
|
blocklists = apply_whitelists(blocklists)
|
|
lists = split_list(blocklists)
|
|
upload_to_cloudflare(lists)
|
|
cloud_lists = utils.get_lists()
|
|
cloud_lists = utils.filter_adblock_lists(cloud_lists)
|
|
create_dns_policy(cloud_lists)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|