def vote_up(self): """ 赞同 """ r = self._execute(method="post", url=URL.vote_up(self.id), json={"type": "up"}) if r.ok: return r.json() else: raise ZhihuError("操作失败:%s" % r.text)
def _user_slug(self, profile_url): """ profile_url 转 user_slug :param profile_url: :return: """ pattern = re.compile("https?://www.zhihu.com/people/([\w-]+)") match = pattern.search(profile_url) if match: user_slug = match.group(1) return user_slug else: raise ZhihuError("invalid profile url")
def user(self, user_slug=None, profile_url=None, **kwargs): """ 获取用户信息 :param user_slug : 用户的个性域名 :param profile_url: 用户主页地址 :return:dict >>> user(profile_url = "https://www.zhihu.com/people/xiaoxiaodouzi") >>> user(user_slug = "xiaoxiaodouzi") """ if not any([profile_url, user_slug]): raise ZhihuError("至少指定一个关键字参数") user_slug = self._user_slug(profile_url) if user_slug is None else user_slug response = self._session.get(URL.profile(user_slug), **kwargs) if response.ok: return response.json() else: raise ZhihuError("操作失败:%s" % response.text)
def unfollow(self, user_slug=None, profile_url=None, **kwargs): """ 取消关注用户 :param user_slug: :param profile_url: :return: {"follower_count": int} >>> unfollow(profile_url = "https://www.zhihu.com/people/xiaoxiaodouzi") >>> unfollow(user_slug = "xiaoxiaodouzi") """ if not any([profile_url, user_slug]): raise ZhihuError("至少指定一个关键字参数") user_slug = self._user_slug( profile_url) if user_slug is None else user_slug response = self._session.delete(URL.follow_people(user_slug), **kwargs) if response.ok: data = response.json() data['followed'] = False return data else: raise ZhihuError("操作失败:%s" % response.text)
def login(self, account, password): """ 账户登录 :param account: email或者手机号码 :param password: :return: """ email_regex = r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)" phone_regex = r"\+?\d{10,15}$" email_pattern = re.compile(email_regex) phone_pattern = re.compile(phone_regex) if email_pattern.match(account) or phone_pattern.match(account): return self._login_api(account, password) else: raise ZhihuError("无效的用户名")
def follow(self, user_slug=None, user_url=None): """ 关注用户 :param user_slug: :param user_url: :return: {"follower_count": int} >>> follow(profile_url = "https://www.zhihu.com/people/xiaoxiaodouzi") >>> follow(user_slug = "xiaoxiaodouzi") """ response = self._execute(method="post", url=URL.follow_people(user_slug)) if response.ok: data = response.json() data['followed'] = True return data else: raise ZhihuError("操作失败:%s" % response.text)
def followers(self, user_slug=None, limit=20, offset=0, user_url=None): """ 获取某个用户的粉丝列表 :param user_slug: :param user_url: :param limit: 最大返回数量 :param offset:游标 :param kwargs: :return: { "paging": { "is_end": true, "totals": 1381207, "is_start": false, }, "data": [{ "avatar_url_template": "https://pic1.zhimg.com/fdbce7544_{size}.jpg", "badge": [], "name": "OPEN", "is_advertiser": false, "url": "http://www.zhihu.com/api/v4/people/0fcb310a722c5bb99d864ace7bb2d89c", "url_token": "open", "user_type": "people", "answer_count": 50, "headline": "上知乎,恍然大悟!", "avatar_url": "https://pic1.zhimg.com/fdbce7544_is.jpg", "is_org": false, "gender": 1, "follower_count": 78, "type": "people", "id": "0fcb310a722c5bb99d864ace7bb2d89c" }, ] } """ r = self._execute(method="get", url=URL.followers(user_slug), params={ "limit": limit, "offset": offset }) if r.ok: return r.json() else: raise ZhihuError("操作失败:%s" % r.text)
def unfollow(self, user_slug=None, profile_url=None, **kwargs): """ 取消关注用户 :param user_slug: :param profile_url: :return: {"follower_count": int} >>> unfollow(profile_url = "https://www.zhihu.com/people/xiaoxiaodouzi") >>> unfollow(user_slug = "xiaoxiaodouzi") """ if not any([profile_url, user_slug]): raise ZhihuError("至少指定一个关键字参数") user_slug = self._user_slug(profile_url) if user_slug is None else user_slug response = self._session.delete(URL.follow_people(user_slug), **kwargs) if response.ok: return response.json() else: self.log(u"取消关注失败, status code: %s" % response.status_code)
def register(self, name=None, phone_num=None, password=None): data = { "fullname": name, "phone_num": phone_num, "password": password, "_xsrf": super(Account, self)._get_xsrf(), "captcha": super(Account, self)._get_captcha(_type="register"), "captcha_source": "register", } valid = self._register_validate(data) if valid: self.log("账号验证成功,发送短信验证码") params = {"phone_num": phone_num, "captcha_source": "register"} # 发送验证码 r = self._execute(method="get", url=URL.register_sms_code(), params=params) self.log(r.json().get("msg")) code = input("输入短信验证码:") data['verification_code'] = code data.pop("captcha") r = self._execute(method="post", url=URL.register(), data=data, data_type=RequestDataType.FORM) if r.ok and r.json().get("r") == 0: self.log("注册成功") return r.json() else: if r.ok and r.json().get("r") != 0: self.log(r.json().get("msg"), level=logging.ERROR) if not r.ok: self.log("请求失败", level=logging.ERROR) return r.json() else: raise ZhihuError("验证失败,请查看日志")
def __init__(self, id=None, url=None): id = id if id is not None else self._extract_id(url) if not id: raise ZhihuError("没有指定问题的id或者url") self.id = str(id) super(Question, self).__init__()
def __init__(self, id=None, url=None): id = id if id is not None else self._extract_id(url) if not id: raise ZhihuError("没有指定回答的id") self.id = str(id) super(Answer, self).__init__()
def __init__(self, slug=None, url=None): slug = slug if slug is not None else self._extract_slug(url) if not slug: raise ZhihuError("没有指定专栏的的slug或者url") self.slug = slug super(Column, self).__init__(headers=ZHUANLAN_HEADERS)