登录时报错:需要行为验证码验证
Traceback (most recent call last): File "E:\senbei310\lib\site-packages\starlette\routing.py", line 734, in lifespan async with self.lifespan_context(app) as maybe_state: File "C:\Users\Administrator\AppData\Local\Programs\Python\Python310\lib\contextlib.py", line 199, in aenter return await anext(self.gen) File "E:\senbei310\lib\site-packages\nonebot\drivers\fastapi.py", line 153, in _lifespan_manager await self._lifespan.startup() File "E:\senbei310\lib\site-packages\nonebot\internal\driver_lifespan.py", line 42, in startup await self._run_lifespan_func(self._startup_funcs) File "E:\senbei310\lib\site-packages\nonebot\internal\driver_lifespan.py", line 36, in _run_lifespan_func await cast(ASYNC_LIFESPAN_FUNC, func)() File "E:\mcbot\senbeibot\src\plugins\nonebot_plugin_multincm\data_source.py", line 255, in _ await login() File "E:\mcbot\senbeibot\src\plugins\nonebot_plugin_multincm\data_source.py", line 200, in login await run_sync(LoginViaCellphone)( File "E:\senbei310\lib\site-packages\nonebot\utils.py", line 182, in _wrapper result = await loop.run_in_executor(None, partial(context.run, pfunc)) File "C:\Users\Administrator\AppData\Local\Programs\Python\Python310\lib\concurrent\futures\thread.py", line 58, in run result = self.fn(*self.args, **self.kwargs) File "E:\senbei310\lib\site-packages\pyncm\apis\login.py", line 176, in LoginViaCellphone WriteLoginInfo(login_status, session) File "E:\senbei310\lib\site-packages\pyncm\apis\login.py", line 28, in WriteLoginInfo raise LoginFailedException(session.login_info["content"]) pyncm.apis.LoginFailedException: {'code': 8821, 'message': '需要行为验证码验证', 'redirectUrl': 'https://qa-yyy.igame.163.com/anquanhuanjingfengxian'}
用这里的 手机登录.py 例子的验证码登陆可正常登录
一个非常摆烂的方案: 用 pyqt5 的 QtWebEngineWidgets 加载 https://music.163.com/#/login, 在用户扫码登录后获取 cookie 并关闭窗口.
QtWebEngineWidgets 有相关信号实现可以监测 cookie 的添加, 经实验可知在 https://music.163.com/#/login 登陆后会自动跳转到 https://music.163.com/discover, 并且 QtWebEngineWidgets 同样有相关信号实现可以监测 url 的变化, 所以实际上可以先记录所有添加的 cooki, 然后在 url 变化的时候返回所有被记录的 cookie 并关闭窗口 (我是直接将 cookie 注入一个新的 session, 然后返回这个 session )
但是 pyqt5 真的很臃肿, 对于命令行程序来讲塞这么一个东西真的难受, chatgpt 说可以用 pywebview 实现相同的功能并且比 pyqt5 更轻量化, 但是没试过, 不知道效果如何