Пример #1
0
    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)
Пример #2
0
    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)
Пример #3
0
    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)
Пример #4
0
 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)
Пример #5
0
    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("无效的用户名")
Пример #6
0
 def follow(self):
     """关注某专栏"""
     r = self._execute(method="put", url=URL.follow_column(self.slug))
     if r.ok:
         print("关注专栏成功")
     else:
         raise ZhihuError("操作失败:%s" % r.text)
Пример #7
0
 def unfollow(self):
     """取消关注某专栏"""
     r = self._execute(method="delete", url=URL.unfollow_column(self.slug))
     if r.ok:
         print("取消关注专栏成功")
     else:
         raise ZhihuError("操作失败:%s" % r.text)
Пример #8
0
 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("验证失败,请查看日志")
Пример #9
0
 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()
Пример #10
0
    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__()
Пример #11
0
 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")
Пример #12
0
 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)
Пример #13
0
 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)
Пример #14
0
 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)
Пример #15
0
 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)
Пример #16
0
    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)
Пример #17
0
 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)
Пример #18
0
 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)
Пример #19
0
 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)
Пример #20
0
 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)
Пример #21
0
    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)
Пример #22
0
 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)
Пример #23
0
 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)
Пример #24
0
    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)
Пример #25
0
 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")
Пример #26
0
    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("无效的用户名")
Пример #27
0
    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)
Пример #28
0
    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)
Пример #29
0
    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)
Пример #30
0
 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__()