Last active 1589045305

Encoding and decoding files with txt records

Revision 9bc12e81d9c912a6cc9ea7e06907b7550980e34f

README.md Raw

This is a test of Jupyter generating a cool blog post about a neat python project or something.

import dns.resolver
import base64
from IPython.display import HTML
q = dns.resolver.query("logo.hosttel.com.au","TXT").response.answer[0]
for line in sorted(_.strings[0] for _ in q)[:5]:
    print((line[:20] + b"..." + line[-20:]) if len(line) > 20 else line)
b'test'
b'{00}iVBORw0KGgoAAAAN...sQo8aFRo0+M8YCYKGjiE'
b'{01}Q1CiALGgCAgINfud...ZGAkyJ9sDvO2DzNa4dZk'
b'{02}E+BTF9RgIePCSjO3...UX6911GGr69VMh/3eWDV'
b'{03}bE6tkPWUyTPRkqrY...bw8nGGgoCoYXopEPQ1Q7'
out = b""
for line in sorted(_.strings[0] for _ in q):
    if chr(line[0]) == "{":
        try:
            out += line.split(b"}",1)[1]
        except IndexError:
            pass
HTML("<img src='data:image/png;base64,{0}'/>".format(out.decode('utf-8')))
txtrecord_decode.py Raw
1#!/usr/bin/env python3
2# txtrecord_decode.py output.png logo.example.com
3import dns.resolver # pip3 install dnspython
4import base64
5import sys
6q = dns.resolver.query(sys.argv[2],"TXT").response.answer[0]
7out = b""
8for line in sorted(_.strings[0] for _ in q):
9 if chr(line[0]) == "{":
10 try:
11 out += line.split(b"}",1)[1]
12 except IndexError:
13 pass
14with open(sys.argv[1],"wb") as f:
15 f.write(base64.b64decode(out))
txtrecord_encode.py Raw
1#!/usr/bin/env python3
2# txtrecord_encode.py input.png logo.example.com
3import base64
4import sys
5from textwrap import wrap
6with open(sys.argv[1],"rb") as f:
7 enc = base64.b64encode(f.read()).decode("utf-8")
8
9# '%04d' and '247' may need to be updated for large files to ensure the line count doesn't push the length
10# longer than 255 bytes
11print("\n".join("%s. IN TXT '{%04d}%s'" % (sys.argv[2], n,s) for n,s in enumerate(wrap(enc,247))))