login.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. from typing import List
  2. import ujson as json
  3. from browser import Browser, BrowserContext
  4. class Login(object):
  5. def __init__(self, context: BrowserContext = None):
  6. self.context = context
  7. def _login(self, url_login="https://sso.douyin.com/", url_ok="https://www.douyin.com/passport/sso/login"):
  8. page = self.context.new_page()
  9. with page.expect_request_finished(lambda request: url_ok in request.url, timeout=0):
  10. page.goto(url_login, wait_until='domcontentloaded')
  11. cookies = self.get_cookies()
  12. page.close()
  13. return cookies
  14. def check_login(self):
  15. url = 'https://sso.douyin.com/check_login/'
  16. res = self.context.request.get(url).json()
  17. is_login: bool = res.get("has_login", False)
  18. if is_login: # 重新登录(有些朋友偶尔出现无法采集的情况,重新登陆后就正常,所以加入此功能)
  19. # self.context.request.get(res.get("redirect_url", url))
  20. self._login(url_login=res.get("redirect_url", "https://sso.douyin.com/"))
  21. return is_login
  22. @staticmethod
  23. def save_cookies(cookies: List, key: List[str] = None):
  24. """
  25. 默认保存全部cookie,可选仅保存指定key
  26. """
  27. if key:
  28. session = []
  29. for i in cookies:
  30. if i['name'] in key:
  31. session.append({"name": i['name'], "value": i['value'], "domain": ".douyin.com", "path": "/"})
  32. else:
  33. session = cookies
  34. s = {"cookies": session}
  35. with open("./auth.json", 'w', encoding='utf-8') as f:
  36. json.dump(s, f, ensure_ascii=False)
  37. def get_cookies(self):
  38. cookies = self.context.cookies()
  39. cookies.append({"name": "LOGIN_STATUS", "value": "1", "domain": ".douyin.com", "path": "/"})
  40. cookies.append({"name": "SEARCH_RESULT_LIST_TYPE", "value": "%22multi%22", "domain": ".douyin.com", "path": "/"})
  41. # self.save_cookies(cookies)
  42. self.save_cookies(cookies, key=['toutiao_sso_user_ss', 'toutiao_sso_user']) # 重新登陆时只需要一条cookie
  43. return cookies
  44. def new_login(self) -> None:
  45. edge = Browser(channel="msedge", need_login=False, headless=False, image=True)
  46. self.context = edge.context
  47. cookies = self._login()
  48. edge.stop()
  49. return cookies
  50. if __name__ == "__main__":
  51. Login().new_login()