def follows(self, user_name=None): """ 用户所关注人数,被关注的人数 :param user_slug: :param profile_url: :return: {"follower_count": int} >>> follows(user_name = "高日日") """ if not user_name: raise ZhihuError("至少指定一个关键字参数") user_slug = self._get_token(user_name) response = requests.get(URL.user_followed_number(user_slug), headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36' }) if response.ok: soup = BeautifulSoup(response.text, 'lxml') init_data_renshu = soup.select('div[class="NumberBoard-value"]') lst0 = ["关注人数"] lst1 = ["关注者"] for i in init_data_renshu: if len(lst0) < 2: lst0.append(str(i.get_text())) else: lst1.append(str(i.get_text())) print(','.join(lst0)) print(','.join(lst1)) else: raise ZhihuError("操作失败:%s" % response.text)
def send_message(self, content, user_id=None, profile_url=None, user_slug=None, **kwargs): """ 给指定的用户发私信 :param content 私信内容 :param user_id 用户id :param profile_url :用户主页地址 :param user_slug : 用户的个性域名 >>> send_message(profile_url = "https://www.zhihu.com/people/xiaoxiaodouzi") >>> send_message(user_slug = "xiaoxiaodouzi") >>> send_message(user_id = "1da75b85900e00adb072e91c56fd9149") """ if not any([user_id, profile_url, user_slug]): raise ZhihuError("至少指定一个关键字参数") if user_id is None: user_slug = self._user_slug( profile_url) if user_slug is None else user_slug user_id = self._user_id(user_slug) data = {"type": "common", "content": content, "receiver_hash": user_id} response = self._session.post(URL.message(), json=data, **kwargs) if response.ok: return response.json() self.log("发送成功") else: self.log("发送失败") raise ZhihuError("操作失败:%s" % response.text)
def profile(self, user_slug=None, user_url=None): """ 获取用户信息 :param user_slug : 用户的个性域名 :param user_url: 用户主页地址 :return:dict {'avatar_url_template': 'https://pic1.zhimg.com/v2-ca13758626bd7367febde704c66249ec_{size}.jpg', 'name': '我是小号', 'is_advertiser': False, 'url': 'http://www.zhihu.com/api/v4/people/1da75b85900e00adb072e91c56fd9149', 'gender': -1, 'user_type': 'people', 'url_token': 'xiaoxiaodouzi', 'headline': '', 'avatar_url': 'https://pic1.zhimg.com/v2-ca13758626bd7367febde704c66249ec_is.jpg', 'is_org': False, ' type': 'people', 'badge': [], 'id': '1da75b85900e00adb072e91c56fd9149'} >>> user(profile_url = "https://www.zhihu.com/people/xiaoxiaodouzi") >>> user(user_slug = "xiaoxiaodouzi") """ response = self._execute(method="get", url=URL.profile(user_slug)) if response.ok: return response.json() else: raise ZhihuError("操作失败:%s" % response.text)
def follow_question(self, **kwargs): """关注某问题""" r = self._execute(url=URL.follow_question(self.id), **kwargs) if r.ok: return r.json() else: raise ZhihuError("操作失败:%s" % r.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): lg = login.Login() result, session= lg.zhihu(account, password, 'pc') print(result, session) for cookie in session.cookies: self.cookies.set_cookie( cookie ) self.cookies.save(ignore_discard=True) # 保存登录信息cookies self.cookies.load(filename=settings.COOKIES_FILE, ignore_discard=True) return result # return self._login_api(account, password) else: raise ZhihuError("无效的用户名")
def follow(self): """关注某专栏""" r = self._execute(method="put", url=URL.follow_column(self.slug)) if r.ok: print("关注专栏成功") else: raise ZhihuError("操作失败:%s" % r.text)
def unfollow(self): """取消关注某专栏""" r = self._execute(method="delete", url=URL.unfollow_column(self.slug)) if r.ok: print("取消关注专栏成功") else: raise ZhihuError("操作失败:%s" % r.text)
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_dc0(), "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_DATA) 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, slug=None, url=None): super(Column, self).__init__() slug = slug if slug is not None else self._extract_slug(url) if not slug: raise ZhihuError("没有指定专栏的的slug或者url") self.slug = slug self.headers = ZHUANLAN_HEADERS self.headers["x-xsrf-token"] = self._get_xsrf()
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) self.url = url super(Answer, self).__init__()
def _user_slug(self, user_url): pattern = re.compile("https?://www.zhihu.com/people/([\w-]+)") match = pattern.search(user_url) if match: user_slug = match.group(1) return user_slug else: raise ZhihuError("invalid url")
def thank_cancel(self): """ 感谢取消 """ r = self._execute(method="delete", url=URL.thank_cancel(self.id)) if r.ok: return r.json() else: raise ZhihuError("操作失败:%s" % r.text)
def nothelp_cancel(self, **kwargs): """ 撤销没有帮助 """ r = self._execute(method="delete", url=URL.nothelp_cancel(self.id), **kwargs) if r.ok: return r.json() else: raise ZhihuError("操作失败:%s" % r.text)
def nothelp(self): """ 没有帮助 """ r = self._execute(method="delete", url=URL.nothelp(self.id)) if r.ok: return r.json() else: raise ZhihuError("操作失败:%s" % r.text)
def unfollow_question(self, **kwargs): """取消关注某问题""" r = self._execute(method="delete", url=URL.unfollow_question(self.id), **kwargs) if r.ok: return r.json() else: raise ZhihuError("操作失败:%s" % r.text)
def wrapper(self, *args, **kwargs): if "user_url" not in kwargs and 'user_slug' not in kwargs: raise ZhihuError("至少指定[user_url, user_slug]中的任意一个关键字参数") if 'user_slug' not in kwargs: user_slug = self._user_slug(user_url=kwargs.get("user_url")) kwargs['user_slug'] = user_slug return func(self, *args, **kwargs)
def vote_neutral(self, **kwargs): """ 中立 """ r = self._execute(url=URL.vote_neutral(self.id), data={"type": "neutral"}, **kwargs) if r.ok: return r.json() else: raise ZhihuError("操作失败:%s" % r.text)
def thank(self, **kwargs): """ 感谢 """ r = self._execute(url=URL.thank(self.id), **kwargs) if r.ok: return r.json() else: raise ZhihuError("操作失败:%s" % r.text)
def nothelp(self, **kwargs): """ 没有帮助 """ r = self._execute(url=URL.nothelp(self.id), **kwargs) if r.ok: return r.json() else: raise ZhihuError("操作失败:%s" % r.text)
def thank(self): """ 感谢 """ r = self._execute(method="post", url=URL.thank(self.id)) if r.ok: return r.json() else: raise ZhihuError("操作失败:%s" % r.text)
def follow(self, user_slug=None, profile_url=None, **kwargs): """ 关注用户 :param user_slug: :param profile_url: :return: {"follower_count": int} >>> follow(profile_url = "https://www.zhihu.com/people/xiaoxiaodouzi") >>> follow(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.post(URL.follow_people(user_slug), **kwargs) if response.ok: return response.json() else: raise ZhihuError("操作失败:%s" % response.text)
def vote_neutral(self, ): """ 中立 """ r = self._execute(method="post", url=URL.vote_neutral(self.id), json={"type": "neutral"}) if r.ok: return r.json() else: raise ZhihuError("操作失败:%s" % r.text)
def vote_down(self): """ 反对 """ r = self._execute(method="post", url=URL.vote_down(self.id), json={"type": "down"}) if r.ok: return r.json() else: raise ZhihuError("操作失败:%s" % r.text)
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 _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 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 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 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 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 __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__()