README.md
· 6.4 KiB · Markdown
Raw
This is a test of Jupyter generating a cool blog post about a neat python project or something.
```python
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'
```python
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')))
```
<img src='data:image/png;base64,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'/>
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
· 453 B · Python
Raw
#!/usr/bin/env python3
# txtrecord_decode.py output.png logo.example.com
import dns.resolver # pip3 install dnspython
import base64
import sys
q = dns.resolver.query(sys.argv[2],"TXT").response.answer[0]
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
with open(sys.argv[1],"wb") as f:
f.write(base64.b64decode(out))
| 1 | #!/usr/bin/env python3 |
| 2 | # txtrecord_decode.py output.png logo.example.com |
| 3 | import dns.resolver # pip3 install dnspython |
| 4 | import base64 |
| 5 | import sys |
| 6 | q = dns.resolver.query(sys.argv[2],"TXT").response.answer[0] |
| 7 | out = b"" |
| 8 | for 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 |
| 14 | with open(sys.argv[1],"wb") as f: |
| 15 | f.write(base64.b64decode(out)) |
txtrecord_encode.py
· 440 B · Python
Raw
#!/usr/bin/env python3
# txtrecord_encode.py input.png logo.example.com
import base64
import sys
from textwrap import wrap
with open(sys.argv[1],"rb") as f:
enc = base64.b64encode(f.read()).decode("utf-8")
# '%04d' and '247' may need to be updated for large files to ensure the line count doesn't push the length
# longer than 255 bytes
print("\n".join("%s. IN TXT '{%04d}%s'" % (sys.argv[2], n,s) for n,s in enumerate(wrap(enc,247))))
| 1 | #!/usr/bin/env python3 |
| 2 | # txtrecord_encode.py input.png logo.example.com |
| 3 | import base64 |
| 4 | import sys |
| 5 | from textwrap import wrap |
| 6 | with 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 |
| 11 | print("\n".join("%s. IN TXT '{%04d}%s'" % (sys.argv[2], n,s) for n,s in enumerate(wrap(enc,247)))) |