lzjun567/zhihu-api

尝试发送私信时又上重新登录,且尝试多次仍不能成功。

ahwz001 opened this issue · 7 comments

尝试发送私信时又上重新登录,且尝试多次仍不能成功。

执行 zhihu.user(user_slug='xiaoxiaodouzi')之后 并未出现以下用户信息项,请问我是否登录成功?
目前此项目是不是还能正常使用,还是知乎网站做了限制 ?

{'avatar_url_template': 'https://pic1.zhimg.com/v2-ca13758626bd7367febde704c66249ec_{size}.jpg',
'badge': [],
'name': '我是小号',
'headline': '程序员',
……
}

以下是报错及输入输出全文 :

In [1]: from zhihu import Zhihu

In [2]: zhihu = Zhihu()

In [3]: zhihu.user(user_slug='xiaoxiaodouzi')
请输入email或者手机号码:ah×××××@qq.com
请输入密码:×××××××
验证码:e6gr

In [4]: zhihu.send_message('hello',user_slug='xiaoxiaodouzi')
请输入email或者手机号码:ah×××××@qq.com
请输入密码:×××××××
验证码:×××××××
请输入email或者手机号码:ah×××××@qq.com
请输入密码:×××××××
验证码:8xp6

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-f5af582b8420> in <module>()
----> 1 zhihu.send_message('hello',user_slug='xiaoxiaodouzi')

/usr/local/lib/python3.5/dist-packages/zhihu/auth.py in wrapper(self, *args, **kwargs)
     27                 success = account.Account().login(email, password)
     28         if success:
---> 29             result = func(self, *args, **kwargs)
     30             return result
     31 

/usr/local/lib/python3.5/dist-packages/zhihu/models/common.py in send_message(self, content, user_id, profile_url, user_slug, **kwargs)
     30         if user_id is None:
     31             user_slug = self._user_slug(profile_url) if user_slug is None else user_slug
---> 32             user_id = self._user_id(user_slug)
     33 
     34         data = {"type": "common", "content": content, "receiver_hash": user_id}

/usr/local/lib/python3.5/dist-packages/zhihu/models/__init__.py in _user_id(self, user_slug)
     86         """
     87         profile = self.user(user_slug=user_slug)
---> 88         user_id = profile.get("id")
     89         return user_id
     90 

AttributeError: 'NoneType' object has no attribute 'get'

你好,源码中并未将登录后的cookies进行保存,也就是说没有保存登录状态,这样导致了每次身份验证时都未检测到登录,所以要不断重复登陆。我对登录验证功能进行了完善并pull requests了,这个bug应该已经被修复了,pr目前还未通过,您可以先clone我fork的项目试一下,https://github.com/sherrywong1220/zhihu-api

有保存的呢

这个问题我查了一下,你的pull request 还是不能解决重复登录的问题,因为在装饰器need_login执行后,用户输入帐号密码验证通过后,本地是有保存cookie的,但是当前获取用户信息的session并没有及时去加载cookie信息,所有需要用户重新登录。

我在你的pr基础之上修复了这个问题,并且对于所有请求如果不是返回的response.ok,那么直接以异常的方式抛出。

棒棒的!我先前认为登录之后当前用户的session的cookie会自动update,所以就没有再次加载cookie。现在才反应过来session并不是一个全局变量,只有account类对象的session自动更新了,但其他类的session并没有自动更新。

不过我还是认为当未检测到登录时,应该优先尝试加载本地cookie,而不是直接重新登录。否则会受到创建类实例的顺序影响。

>>> from zhihu import Zhihu
>>> zhihu = Zhihu()    # 此时本地无cookie,实例化对象的session中也无cookie

>>> from zhihu import Answer
>>> data = Answer(id=14005147).vote_down()    # 此时需要登录,登录后,本地有cookie

>>> zhihu.user(user_slug="xiaoxiaodouzi")    # 由于zhihu是在登录前实例化的对象,zhihu依然无登录信息,需要重新登录

有道理

经过安装最新的代码后,测试,本人所提的问题已解决!

至于各位所讨论的,我还在学习中,先继续学习全部代码吧。

感谢各位的辛勤工作!