Skip to content

Instantly share code, notes, and snippets.

@allen0099
Last active June 23, 2020 12:47
Show Gist options
  • Save allen0099/d267a704b4701edd1d4d6313421f9159 to your computer and use it in GitHub Desktop.
Save allen0099/d267a704b4701edd1d4d6313421f9159 to your computer and use it in GitHub Desktop.
PTT aid 跟 url 互相轉換的工具
import base64
import re
STANDARD_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
CUSTOM_ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-_"
ENCODE = str.maketrans(STANDARD_ALPHABET, CUSTOM_ALPHABET)
DECODE = str.maketrans(CUSTOM_ALPHABET, STANDARD_ALPHABET)
def base64_encode(s: str) -> str:
return base64.b64encode(str.encode(s)).decode("utf-8").translate(ENCODE)
def base64_decode(s: str) -> str:
return base64.b64decode(str.encode(s.translate(DECODE))).decode("utf-8")
def random_encode(s: str) -> str:
return base64.b64encode(int(s, 16).to_bytes(3, "big")).decode("utf-8").translate(ENCODE)[2:]
def random_decode(s: str) -> str:
s = "00" + s
return str(hex(int.from_bytes(base64.b64decode(str.encode(s.translate(DECODE))), "big")))[2:].upper()
def timestamp_encode(s: str) -> str:
return base64.b64encode(int(s, 10).to_bytes(6, "big")).decode("utf-8").translate(ENCODE)[2:]
def timestamp_decode(s: str) -> str:
s = "00" + s
return str(int.from_bytes(base64.b64decode(str.encode(s.translate(DECODE))), "big"))
def url2aid(url: str) -> str:
# example M.1419434423.A.DF0.html
# example https://www.ptt.cc/bbs/Steam/M.1592910404.A.AD6.html
# example https://www.ptt.cc/man/C_Chat/DE98/DFF5/DB61/M.1419434423.A.DF0.html
v1 = re.findall(r"(?<=[MG]\.)\d{10}", url, re.MULTILINE)[0] # timestamp
v2 = re.findall(r"(?<=\.A\.)[A-Fa-f0-9]{3}", url, re.MULTILINE)[0] # random
result = f"#{timestamp_encode(v1)}{random_encode(v2)}"
s = url.split("/")
if len(s) >= 4:
result += f"({s[4]})"
return result
def aid2fn(aid: str) -> str:
v1 = re.findall(r"(?<=#)[0-9A-Za-z\-_]{8}", aid, re.MULTILINE)[0]
_time = v1[:-2]
_random = v1[-2:]
result = f"M.{timestamp_decode(_time)}.A.{random_decode(_random)}.html"
return result
def aid2url(aid: str) -> str:
if "(" in aid:
board = re.findall(r"(?<=\().+(?=\))", aid, re.MULTILINE)[0]
result = f"https://www.ptt.cc/bbs/{board}/{aid2fn(aid)}"
else:
result = aid2fn(aid)
return result
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment