Last active
November 3, 2020 07:18
-
-
Save TomoTom0/e4ff047353c82747d1c28e21eafbf6ea to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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