Spaces:
Runtime error
Runtime error
| import requests | |
| import os | |
| import json | |
| import logging | |
| import re | |
| class Login: | |
| def __init__(self, email: str, passwd: str) -> None: | |
| # self.COOKIE_DIR = os.path.dirname(os.path.abspath(__file__)) + "/usercookies" | |
| # self.COOKIE_PATH = self.COOKIE_DIR + f"/{email}.json" | |
| # if not os.path.exists(self.COOKIE_DIR): | |
| # logging.debug("Cookie directory not found, creating...") | |
| # os.makedirs(self.COOKIE_DIR) | |
| # logging.debug(f"Cookie store path: {self.COOKIE_DIR}") | |
| self.DEFAULT_PATH_DIR = os.path.dirname(os.path.abspath(__file__)) + "/usercookies" | |
| self.DEFAULT_COOKIE_PATH = self.DEFAULT_PATH_DIR + f"/{email}.json" | |
| self.email: str = email | |
| self.passwd: str = passwd | |
| self.headers = { | |
| "Referer": "https://huggingface.co/", | |
| "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.64", | |
| } | |
| self.cookies = requests.sessions.RequestsCookieJar() | |
| def requestsGet(self, url: str, params=None, allow_redirects=True) -> requests.Response: | |
| res = requests.get( | |
| url, | |
| params=params, | |
| headers=self.headers, | |
| cookies=self.cookies, | |
| allow_redirects=allow_redirects, | |
| ) | |
| self.refreshCookies(res.cookies) | |
| return res | |
| def requestsPost(self, url: str, headers=None, params=None, data=None, stream=False, | |
| allow_redirects=True) -> requests.Response: | |
| res = requests.post( | |
| url, | |
| stream=stream, | |
| params=params, | |
| data=data, | |
| headers=self.headers if headers == None else headers, | |
| cookies=self.cookies, | |
| allow_redirects=allow_redirects | |
| ) | |
| self.refreshCookies(res.cookies) | |
| return res | |
| def refreshCookies(self, cookies: requests.sessions.RequestsCookieJar): | |
| dic = cookies.get_dict() | |
| for i in dic: | |
| self.cookies.set(i, dic[i]) | |
| def SigninWithEmail(self): | |
| """ | |
| Login through your email and password. | |
| PS: I found that it doesn't have any type of encrytion till now, | |
| which could expose your password to the internet. | |
| """ | |
| url = "https://huggingface.co/login" | |
| data = { | |
| "username": self.email, | |
| "password": self.passwd, | |
| } | |
| res = self.requestsPost(url=url, data=data, allow_redirects=False) | |
| if res.status_code == 400: | |
| raise Exception("wrong username or password") | |
| def getAuthURL(self): | |
| url = "https://huggingface.co/chat/login" | |
| headers = { | |
| "Referer": "https://huggingface.co/chat/login", | |
| "User-Agent": self.headers["User-Agent"], | |
| "Content-Type": "application/x-www-form-urlencoded" | |
| } | |
| res = self.requestsPost(url, headers=headers, allow_redirects=False) | |
| if res.status_code == 200: | |
| # location = res.headers.get("Location", None) | |
| location = res.json()["location"] | |
| if location: | |
| return location | |
| else: | |
| raise Exception("No authorize url found, please check your email or password.") | |
| elif res.status_code == 303: | |
| location = res.headers.get("Location") | |
| if location: | |
| return location | |
| else: | |
| raise Exception("No authorize url found, please check your email or password.") | |
| else: | |
| raise Exception("Something went wrong!") | |
| def grantAuth(self, url: str) -> int: | |
| res = self.requestsGet(url, allow_redirects=False) | |
| if res.headers.__contains__("location"): | |
| location = res.headers["location"] | |
| res = self.requestsGet(location, allow_redirects=False) | |
| if res.cookies.__contains__("hf-chat"): | |
| return 1 | |
| # raise Exception("grantAuth fatal") | |
| if res.status_code != 200: | |
| raise Exception("grant auth fatal!") | |
| csrf = re.findall('/oauth/authorize.*?name="csrf" value="(.*?)"', res.text) | |
| if len(csrf) == 0: | |
| raise Exception("No csrf found!") | |
| data = { | |
| "csrf": csrf[0] | |
| } | |
| res = self.requestsPost(url, data=data, allow_redirects=False) | |
| if res.status_code != 303: | |
| raise Exception(f"get hf-chat cookies fatal! - {res.status_code}") | |
| else: | |
| location = res.headers.get("Location") | |
| res = self.requestsGet(location, allow_redirects=False) | |
| if res.status_code != 302: | |
| raise Exception(f"get hf-chat cookie fatal! - {res.status_code}") | |
| else: | |
| return 1 | |
| def login(self) -> requests.sessions.RequestsCookieJar: | |
| self.SigninWithEmail() | |
| location = self.getAuthURL() | |
| if self.grantAuth(location): | |
| return self.cookies | |
| else: | |
| raise Exception(f"Grant auth fatal, please check your email or password\ncookies gained: \n{self.cookies}") | |
| def saveCookiesToDir(self, cookie_dir_path: str = None) -> str: | |
| """ | |
| cookies will be saved into: cookie_dir_path/<email>.json | |
| """ | |
| cookie_dir_path = self.DEFAULT_PATH_DIR if not cookie_dir_path else cookie_dir_path | |
| if not cookie_dir_path.endswith("/"): | |
| cookie_dir_path += "/" | |
| cookie_path = cookie_dir_path + f"{self.email}.json" | |
| if not os.path.exists(cookie_dir_path): | |
| logging.info("Cookie directory not exist, creating...") | |
| os.makedirs(cookie_dir_path) | |
| logging.info(f"Cookie store path: {cookie_path}") | |
| with open(cookie_path, "w", encoding="utf-8") as f: | |
| f.write(json.dumps(self.cookies.get_dict())) | |
| return cookie_path | |
| def _getCookiePath(self, cookie_dir_path) -> str: | |
| if not cookie_dir_path.endswith("/"): | |
| cookie_dir_path += "/" | |
| if not os.path.exists(cookie_dir_path): | |
| return "" | |
| files = os.listdir(cookie_dir_path) | |
| for i in files: | |
| if i == f"{self.email}.json": | |
| return cookie_dir_path + i | |
| return "" | |
| def loadCookiesFromDir(self, cookie_dir_path: str = None) -> requests.sessions.RequestsCookieJar: | |
| """ | |
| cookie files needs to be named as: cookie_dir_path/<email>.json | |
| """ | |
| cookie_dir_path = self.DEFAULT_PATH_DIR if not cookie_dir_path else cookie_dir_path | |
| cookie_path = self._getCookiePath(cookie_dir_path) | |
| if not cookie_path: | |
| raise Exception(f"Cookie not found. please check the path given: {cookie_dir_path}.\n" + | |
| f"Cookie file must be named like this: 'your_email'+'.json': '{self.email}.json'") | |
| with open(cookie_path, "r", encoding="utf-8") as f: | |
| try: | |
| js = json.loads(f.read()) | |
| for i in js.keys(): | |
| self.cookies.set(i, js[i]) | |
| logging.info(f"{i} loaded") | |
| return self.cookies | |
| except: | |
| raise Exception("load cookies from files fatal. Please check the format") | |
| if __name__ == "__main__": | |
| EMAIL = os.getenv("EMAIL") | |
| PASSWD = os.getenv("PASSWD") | |