login.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on 2024-10-10
  4. ---------
  5. @summary:
  6. ---------
  7. @author: Dzr
  8. """
  9. import json
  10. from pathlib import Path
  11. from DrissionPage import ChromiumPage, ChromiumOptions
  12. from DrissionPage._functions.tools import PortFinder
  13. account_pool = [
  14. ('18530014520', 'qp!4LXH_'),
  15. ]
  16. def auto_login(username, password, proxy=False, headless=False, auto_quit=False, accident_url=None):
  17. co = ChromiumOptions()
  18. port, _ = PortFinder(path='./').get_port()
  19. co.set_paths(
  20. local_port=port,
  21. user_data_path=f'./chrome/{username}',
  22. download_path=f'./download/{username}'
  23. )
  24. # 禁用密码保存弹窗
  25. co.set_argument('--disable-extensions')
  26. if proxy:
  27. proxies = {
  28. 'https': 'socks5://58.221.59.179:8860',
  29. 'http': 'socks5://58.221.59.179:8860'
  30. }
  31. co.set_argument('--proxy-server', value=proxies['https'])
  32. else:
  33. proxies = None
  34. if headless:
  35. co.set_argument('--headless', value='new')
  36. co.set_user_agent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36')
  37. page = ChromiumPage(addr_or_opts=co)
  38. try:
  39. targets = [
  40. 'website-seo/v2/cm/getcatid',
  41. 'rest/detail/alltypesdetail/detail',
  42. 'rest/account/companySpace/checkNewUser'
  43. ]
  44. page.listen.start(targets=targets, res_type=['Document', 'XHR']) # 开启路由监听
  45. success = page.get('https://vip.qianlima.com/') # 访问用户管理界面
  46. if not success:
  47. return
  48. login = page.wait.ele_displayed('x://span[text()="登录"]', timeout=5)
  49. if login:
  50. page.ele('x://input[@name="username"]').input(username, clear=True)
  51. page.ele('x://input[@name="password"]').input(password, clear=True)
  52. page.ele('x://span[text()="登录"]/parent::*').click()
  53. loaded = page.wait.ele_displayed(f'x://p[contains(text(), "{username}")]') # 等待页面加载完成
  54. if not loaded:
  55. print(f'登录失败>{username}')
  56. return
  57. # page.get('http://www.qianlima.com/zb/detail/20241016_454396207.html')
  58. packet = page.listen.wait()
  59. root = Path(__file__).parent
  60. if not (root / 'account').exists():
  61. (root / 'account').mkdir(exist_ok=True)
  62. file = (root / f'account/{username}.json').absolute()
  63. with open(file, 'w') as f:
  64. print(packet.url) # 打印数据包url
  65. # print(packet.response.body)
  66. headers = dict(packet.request.headers)
  67. print(f'** headers ** \n{json.dumps(headers, indent=4)}')
  68. cookies = page.cookies(as_dict=True)
  69. print(f'** cookies ** \n{json.dumps(cookies, indent=4)}')
  70. user = {
  71. 'cookies': cookies,
  72. 'headers': headers,
  73. 'proxies': proxies
  74. }
  75. f.write(json.dumps(user, indent=4))
  76. if accident_url is not None:
  77. while True:
  78. page.get(accident_url) # 人工处理意外情况
  79. if input('异常已处理?[Y|N]').upper() == 'Y':
  80. break
  81. if not auto_quit:
  82. f.flush()
  83. while True:
  84. if input("退出? >>>"):
  85. break
  86. except KeyboardInterrupt:
  87. pass
  88. finally:
  89. page.quit()
  90. print('关闭浏览器')
  91. if __name__ == '__main__':
  92. for username, password in account_pool:
  93. auto_login(username, password, proxy=True, auto_quit=False, headless=False)