Skip to content

Instantly share code, notes, and snippets.

@KokoseiJ
Created September 8, 2023 21:20
Show Gist options
  • Save KokoseiJ/77d8fb35c6e2db2a31582c7182160bc4 to your computer and use it in GitHub Desktop.
Save KokoseiJ/77d8fb35c6e2db2a31582c7182160bc4 to your computer and use it in GitHub Desktop.
Automatically update Cloudflare DNS record for Dynamic IP environment
import re
import json
import requests
IP_REGEX = re.compile(r"\nip=((?:[0-9]{,3}\.){3}[0-9]{,3})\n")
token = ""
zone = ""
CDN_CGI = "https://cloudflare.com/cdn-cgi/trace"
API_BASE = f"https://api.cloudflare.com/client/v4/zones/{zone}"
target_record = "example.com"
session = requests.Session()
session.headers.update({"Authorization": f"Bearer {token}"})
trace = session.get(CDN_CGI)
current_ip = IP_REGEX.search(trace.text).group(1)
print("Currently detected external IP:", current_ip)
records = session.get(API_BASE + "/dns_records")
record_id, record_ip = [
(record['id'], record['content']) for record in records.json()['result']
if record['name'] == target_record
][0]
print("Record ID:", record_id, "Registered IP:", record_ip)
if record_ip != current_ip:
print("IP changed! Updating DNS record...")
r = session.put(
API_BASE + f"/dns_records/{record_id}",
json={
"name": target_record,
"content": current_ip,
"type": "A"
}
)
print(json.dumps(r.json(), indent=4))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment