login.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. import json
  2. import re
  3. import threading
  4. from collections import namedtuple
  5. from pathlib import Path
  6. import requests
  7. from requests.utils import dict_from_cookiejar
  8. _lock = threading.Lock()
  9. ROOT_PATH = Path(__file__).parent.parent
  10. JSON_LOGIN_COOKIE = (ROOT_PATH / 'config/login_cookie.json').resolve()
  11. User = namedtuple('User', ['username', 'password'])
  12. def _open_file():
  13. try:
  14. fp = open(JSON_LOGIN_COOKIE, encoding='utf-8')
  15. except FileNotFoundError:
  16. fp = open(JSON_LOGIN_COOKIE, 'w+', encoding='utf-8')
  17. return fp
  18. def load_login_cookies(user_name: str):
  19. fp = _open_file()
  20. try:
  21. cookies: dict = json.load(fp).get(user_name)
  22. return cookies
  23. except json.decoder.JSONDecodeError:
  24. pass
  25. fp.close()
  26. def update_login_cookies(user_name: str, update_val: dict):
  27. """
  28. 更新登录 cookie 内容
  29. Args:
  30. user_name: 账号
  31. update_val: 需要更新的cookie内容
  32. """
  33. with _lock:
  34. fp = open(JSON_LOGIN_COOKIE, encoding='utf-8')
  35. user_maps: dict = json.load(fp)
  36. login_cookies: dict = user_maps.get(user_name)
  37. if login_cookies is not None and len(update_val) > 0:
  38. login_cookies.update(update_val)
  39. user_login_info = {user_name: login_cookies}
  40. user_maps.update(user_login_info)
  41. wp = open(JSON_LOGIN_COOKIE, 'w+', encoding='utf-8')
  42. wp.write(json.dumps(user_maps, indent=4))
  43. wp.close()
  44. fp.close()
  45. def save_login_cookies(user_name: str, login_cookie: dict):
  46. with _lock:
  47. fp = _open_file()
  48. '''内容存在就加载到内存,不存在就设置为空字典'''
  49. try:
  50. user_maps: dict = json.load(fp)
  51. except json.decoder.JSONDecodeError:
  52. user_maps = {}
  53. # print(user_maps)
  54. if user_name not in user_maps:
  55. user_maps.setdefault(user_name, login_cookie)
  56. else:
  57. cookies = {user_name: login_cookie}
  58. user_maps.update(cookies)
  59. wp = open(JSON_LOGIN_COOKIE, 'w+', encoding='utf-8')
  60. wp.write(json.dumps(user_maps, indent=4))
  61. fp.close()
  62. wp.close()
  63. def login_status_check(response):
  64. userid = re.findall('var destoon_userid = (\d+);', response.text)
  65. userid = "".join(userid).strip()
  66. username = re.findall('var destoon_username = \'(.*?)\'', response.text)
  67. username = "".join(username).strip()
  68. # print(">>> _user ", (userid, username))
  69. if userid == '0' and username == '':
  70. # 登录失效
  71. return True
  72. else:
  73. # 登录有效
  74. return False
  75. def login(user_name: str, password: str):
  76. headers = {
  77. "Connection": "keep-alive",
  78. "Accept": "application/json, text/javascript, */*; q=0.01",
  79. "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
  80. "X-Requested-With": "XMLHttpRequest",
  81. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36",
  82. "Origin": "https://www.zbytb.com",
  83. "Referer": "https://www.zbytb.com/member/login.php",
  84. "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8"
  85. }
  86. data = {
  87. "username": str(user_name),
  88. "password": str(password),
  89. "cookietime": "on"
  90. }
  91. login_url = "https://www.zbytb.com/member/ajaxlogin.php"
  92. response = requests.post(login_url, headers=headers, data=data)
  93. login_status = response.json()
  94. # print(user_name + ' ' + login_status.get('msg'))
  95. if login_status.get('msg') == '登录成功':
  96. login_cookie = dict_from_cookiejar(response.cookies)
  97. save_login_cookies(user_name, login_cookie)
  98. return login_cookie