Spaces:
Runtime error
Runtime error
File size: 7,367 Bytes
5493c06 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
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")
|