Skip to content

Instantly share code, notes, and snippets.

@TomoTom0
Last active November 3, 2020 07:18
Show Gist options
  • Save TomoTom0/e4ff047353c82747d1c28e21eafbf6ea to your computer and use it in GitHub Desktop.
Save TomoTom0/e4ff047353c82747d1c28e21eafbf6ea to your computer and use it in GitHub Desktop.
from requests import Session
import os
import re
class HackMDSession(Session):
"""HackMDSession"""
def __init__(self, server_url=""):
self.server_url = server_url or \
os.environ.get("HMD_CLI_SERVER_URL") or \
"https://hackmd.io"
Session.__init__(self)
def login(self, email="", password=""):
"""Login with environ variable"""
email_in = email or os.environ.get("HMD_CLI_ID")
password_in = password or os.environ.get("HMD_CLI_PASSWORD")
if email_in == "" or password_in == "":
print("email or password is wrong")
return
login_info = {"email": email_in, "password": password_in}
orig_headers = {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'}
data = self.remake_data(login_info)
res = self.post(f"{self.server_url}/login", data=data,
headers=self.remake_headers(orig_headers))
if not self.isLogin():
print("Login Failed")
return
print("Login Successed")
def remake_data(self, orig_data={}):
return "&".join([f"{k}={v}" for k, v in orig_data.items()]).encode('utf-8')
def remake_headers(self, orig_headers={}):
res_tmp = self.get(self.server_url)
try:
csrf = re.findall(r'(?<=csrf-token. content=").+(?=")',
res_tmp.content.decode("utf-8"))[0]
except:
print("There is no csrf token")
csrf = ""
orig_headers.update(
{'User-Agent': f"Python Jupyter", 'X-XSRF-Token': csrf.encode("utf-8")})
return orig_headers
def isLogin(self):
"""check Logined or not"""
res_tmp = self.get(f"{self.server_url}/me")
if res_tmp.json()["status"] == "ok":
return True
else:
return False
def create(self, orig_content="", tags=[]):
"""create new note"""
if not self.isLogin():
print("Not Logined")
return
content = f"---\nlang:ja-jp\n###### tags: {' '.join([f'`{s}`' for s in tags])}\n---\n{orig_content}"
orig_data = {"content": content}
orig_headers = {
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'}
res = self.post(f"{self.server_url}/new", data=self.remake_data(
orig_data), headers=self.remake_headers(orig_headers))
return res
def get_history(self):
"""return list of id, title, date and tags"""
if not self.isLogin():
print("Not Logined")
return
res = self.get(f"{self.server_url}/history")
try:
self.history = res.json()["history"]
return res.json()["history"]
except Exception as e:
print(f"Error Occured : {e}")
return res
def download(self, note_id, dl_format="md"):
"""download with note_id"""
if not self.isLogin():
print("Not Logined")
return
if dl_format == "pdf": # if in hackmd.io, not pdf
res = self.get(f"{self.server_url}/{note_id}/pdf")
elif dl_format == "slide":
res = self.get(f"{self.server_url}/{note_id}/slide")
elif dl_format == "md":
res = self.get(f"{self.server_url}/{note_id}/download")
return res.content
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment