luogu.session 源代码

from http.cookies import SimpleCookie
from io import BytesIO

import requests

from .constants import USER_AGENT
from .models.main import Problem, User
from .models.paste import Paste
from .utils import get_csrf_token


[文档]class Session: """会话 :param cookies: Cookies :type cookies: str | dict[str, str] | None :var requests.cookies.RequestsCookieJar cookies: Cookies :var requests.Session session: 会话 """ def __init__(self, cookies: "str | dict[str, str] | None" = None) -> None: self.cookies = requests.cookies.cookiejar_from_dict( {k: v.value for k, v in SimpleCookie(cookies).items()} ) self.session = requests.Session() self.session.headers["User-Agent"] = USER_AGENT self.session.headers["referer"] = "http://www.luogu.com.cn/" self.session.cookies = self.cookies self.Paste._session = self.session self.Problem._session = self.session self.User._session = self.session
[文档] class Paste(Paste): pass
[文档] class Problem(Problem): pass
[文档] class User(User): pass
[文档] def captcha(self, show: bool = True) -> bytes: """获取验证码 :param bool show: 值为真时使用 :meth:`PIL.Image.Image.show` 显示验证码;否则仅返回图片的二进制数据 :rtype: bytes """ r = self.session.get("https://www.luogu.com.cn/api/verify/captcha") r.raise_for_status() if show: from PIL import Image Image.open(BytesIO(r.content)).show(title="CAPTCHA") return r.content
[文档] def login(self, username: str, password: str, captcha: str) -> "dict[str]": """登录 :param str username: 用户名 :param str password: 密码 :param str captcha: 验证码 :rtype: dict[str] """ r = self.session.post( "https://www.luogu.com.cn/api/auth/userPassLogin", headers={ "x-csrf-token": get_csrf_token( self.session, "https://www.luogu.com.cn/auth/login" ), }, json={ "username": username, "password": password, "captcha": captcha, }, ) r.raise_for_status() return r.json()
[文档] def logout(self) -> "dict[str, bool]": """登出 :rtype: dict[str, bool] """ r = self.session.post( "https://www.luogu.com.cn/api/auth/logout", headers={"x-csrf-token": get_csrf_token(self.session)}, ) r.raise_for_status() return r.json()