Beispiel #1
0
    def get_gzh_artilce_by_history(self,
                                   keyword=None,
                                   url=None,
                                   deblocking_callback=None,
                                   identify_image_callback=None):
        if url is None:
            gzh_list = self.search_gzh(
                keyword,
                deblocking_callback=deblocking_callback,
                identify_image_callback=identify_image_callback)
            if gzh_list:
                url = gzh_list[0]['url']
            else:
                raise Exception()  # todo use ws exception

        req = requests.session()

        resp = WechatSogouRequest.get(url,
                                      req=req)  # headers=self.__set_cookie()

        if not resp.ok:
            raise WechatSogouRequestsException(
                'WechatSogouAPI get_gzh_artilce_by_history', resp)

        if '请输入验证码' in resp.text:
            self.__deblocking_history(url, resp, req, deblocking_callback,
                                      identify_image_callback)
            resp = WechatSogouRequest.get(
                url, req=req)  # req=req headers=self.__set_cookie()

        return WechatSogouStructuring.get_gzh_info_and_article_by_history(
            resp.text)
 def test_gen_search_article_url_page(self, page):
     if page > 0:
         url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, page)
         assert_in('page={}'.format(page), url)
     else:
         with assert_raises(AssertionError):
             WechatSogouRequest.gen_search_article_url(gaokao_keyword, page)
 def test_gen_search_gzh_url_page(self, page):
     if page > 0:
         url = WechatSogouRequest.gen_search_gzh_url(gaokao_keyword, page)
         assert_in('page={}'.format(page), url)
     else:
         with assert_raises(AssertionError):
             WechatSogouRequest.gen_search_gzh_url(gaokao_keyword, page)
    def test_gen_search_article_url_article_type(self):
        url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, article_type=WechatSogouRequest.TYPE_ALL)
        assert_equal('interation=', url[-11:])

        url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, article_type=WechatSogouRequest.TYPE_IMAGE)
        assert_in('interation=458754', url)

        url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, article_type=WechatSogouRequest.TYPE_VIDEO)
        assert_in('interation=458756', url)

        url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, article_type=WechatSogouRequest.TYPE_RICH)
        assert_in('interation=458754%2C458756', url)
    def test_gen_hot_url(self):
        for hot_index in filter(lambda x: not x.startswith('__'), dir(WechatSogouConst.hot_index)):
            url = WechatSogouRequest.gen_hot_url(hot_index)
            assert_in('http://weixin.sogou.com/wapindex/wap/0612/wap_', url)
            assert_in('0.html', url)

            with assert_raises(AssertionError):
                WechatSogouRequest.gen_hot_url(hot_index, 0)

            for page in range(1, 5):
                url = WechatSogouRequest.gen_hot_url(hot_index, page)
                assert_in('http://weixin.sogou.com/wapindex/wap/0612/wap_', url)
                assert_in('{}.html'.format(page - 1), url)
    def test_gen_hot_url(self):
        for hot_index in filter(lambda x: not x.startswith('__'),
                                dir(WechatSogouConst.hot_index)):
            url = WechatSogouRequest.gen_hot_url(hot_index)
            assert_in('http://weixin.sogou.com/wapindex/wap/0612/wap_', url)
            assert_in('0.html', url)

            with assert_raises(AssertionError):
                WechatSogouRequest.gen_hot_url(hot_index, 0)

            for page in range(1, 5):
                url = WechatSogouRequest.gen_hot_url(hot_index, page)
                assert_in('http://weixin.sogou.com/wapindex/wap/0612/wap_',
                          url)
                assert_in('{}.html'.format(page - 1), url)
    def test_gen_search_article_url_article_type(self):
        url = WechatSogouRequest.gen_search_article_url(
            gaokao_keyword,
            article_type=WechatSogouConst.search_article_type.all)
        assert_equal('interation=', url[-11:])

        url = WechatSogouRequest.gen_search_article_url(
            gaokao_keyword,
            article_type=WechatSogouConst.search_article_type.image)
        assert_in('interation=458754', url)

        url = WechatSogouRequest.gen_search_article_url(
            gaokao_keyword,
            article_type=WechatSogouConst.search_article_type.video)
        assert_in('interation=458756', url)

        url = WechatSogouRequest.gen_search_article_url(
            gaokao_keyword,
            article_type=WechatSogouConst.search_article_type.rich)
        assert_in('interation=458754%2C458756', url)
Beispiel #8
0
    def search_gzh(self, keyword, page=1, unlock_callback=None, identify_image_callback=None, decode_url=True):
        """搜索 公众号

        对于出现验证码的情况,可以由使用者自己提供:
            1、函数 unlock_callback ,这个函数 handle 出现验证码到解决的整个流程
            2、也可以 只提供函数 identify_image_callback,这个函数输入验证码二进制数据,输出验证码文字,剩下的由 wechatsogou 包来解决
        注意:
            函数 unlock_callback 和 identify_image_callback 只需要提供一个,如果都提供了,那么 identify_image_callback 不起作用

        Parameters
        ----------
        keyword : str or unicode
            搜索文字
        page : int, optional
            页数 the default is 1
        unlock_callback : callable
            处理出现验证码页面的函数,参见 unlock_callback_example
        identify_image_callback : callable
            处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example
        decode_url : bool
            是否解析 url

        Returns
        -------
        list[dict]
            {
                'open_id': '', # 微信号唯一ID
                'profile_url': '',  # 最近10条群发页链接
                'headimage': '',  # 头像
                'wechat_name': '',  # 名称
                'wechat_id': '',  # 微信id
                'post_perm': '',  # 最近一月群发数
                'qrcode': '',  # 二维码
                'introduction': '',  # 介绍
                'authentication': ''  # 认证
            }

        Raises
        ------
        WechatSogouRequestsException
            requests error
        """
        url = WechatSogouRequest.gen_search_gzh_url(keyword, page)
        session = requests.session()
        resp = self.__get_by_unlock(url,
                                    unlock_platform=self.__unlock_sogou,
                                    unlock_callback=unlock_callback,
                                    identify_image_callback=identify_image_callback,
                                    session=session)
        gzh_list = WechatSogouStructuring.get_gzh_by_search(resp.text)
        for i in gzh_list:
            if decode_url:
                i['profile_url'] = self.__format_url(i['profile_url'], url, resp.text, unlock_callback=unlock_callback, identify_image_callback=identify_image_callback, session=session)
            yield i
Beispiel #9
0
    def search_gzh(self, keyword, page=1, unlock_callback=None, identify_image_callback=None, decode_url=True):
        """搜索 公众号

        对于出现验证码的情况,可以由使用者自己提供:
            1、函数 unlock_callback ,这个函数 handle 出现验证码到解决的整个流程
            2、也可以 只提供函数 identify_image_callback,这个函数输入验证码二进制数据,输出验证码文字,剩下的由 wechatsogou 包来解决
        注意:
            函数 unlock_callback 和 identify_image_callback 只需要提供一个,如果都提供了,那么 identify_image_callback 不起作用

        Parameters
        ----------
        keyword : str or unicode
            搜索文字
        page : int, optional
            页数 the default is 1
        unlock_callback : callable
            处理出现验证码页面的函数,参见 unlock_callback_example
        identify_image_callback : callable
            处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example
        decode_url : bool
            是否解析 url

        Returns
        -------
        list[dict]
            {
                'open_id': '', # 微信号唯一ID
                'profile_url': '',  # 最近10条群发页链接
                'headimage': '',  # 头像
                'wechat_name': '',  # 名称
                'wechat_id': '',  # 微信id
                'post_perm': '',  # 最近一月群发数
                'qrcode': '',  # 二维码
                'introduction': '',  # 介绍
                'authentication': ''  # 认证
            }

        Raises
        ------
        WechatSogouRequestsException
            requests error
        """
        url = WechatSogouRequest.gen_search_gzh_url(keyword, page)
        session = requests.session()
        resp = self.__get_by_unlock(url,
                                    unlock_platform=self.__unlock_sogou,
                                    unlock_callback=unlock_callback,
                                    identify_image_callback=identify_image_callback,
                                    session=session)
        gzh_list = WechatSogouStructuring.get_gzh_by_search(resp.text)
        for i in gzh_list:
            if decode_url:
                i['profile_url'] = self.__format_url(i['profile_url'], url, resp.text, unlock_callback=unlock_callback, identify_image_callback=identify_image_callback, session=session)
            yield i
Beispiel #10
0
    def test_search_gzh(self):
        url = WechatSogouRequest.gen_search_gzh_url(gaokao_keyword)
        file_name = '{}/{}/{}'.format(os.getcwd(), fake_data_path,
                                      'search-gaokao-gzh.html')
        with io.open(file_name, encoding='utf-8') as f:
            search_gaokao_gzh_error = f.read()
            httpretty.register_uri(httpretty.GET,
                                   url,
                                   body=search_gaokao_gzh_error)

        gzh_list = ws_api.search_gzh(gaokao_keyword)
        assert_equal(10, len(gzh_list))
        assert_equal([
            '山东高考指南', '高考家长圈', '河南高考指南', '高考360', '云天高考', '腾讯高考', '高考快讯',
            '专业中高考教育', '晟嘉高考', '新东方在线高考辅导'
        ], [i['wechat_name'] for i in gzh_list])
Beispiel #11
0
    def get_gzh_artilce_by_hot(self,
                               hot_index,
                               page=1,
                               unlock_callback=None,
                               identify_image_callback=None):
        """获取 首页热门文章

        Parameters
        ----------
        hot_index : WechatSogouConst.hot_index
            首页热门文章的分类(常量):WechatSogouConst.hot_index.xxx
        page : int
            页数

        Returns
        -------
        list[dict]
            {
                'gzh': {
                    'headimage': str,  # 公众号头像
                    'wechat_name': str,  # 公众号名称
                },
                'article': {
                    'url': str,  # 文章临时链接
                    'title': str,  # 文章标题
                    'abstract': str,  # 文章摘要
                    'time': int,  # 推送时间,10位时间戳
                    'open_id': str,  # open id
                    'main_img': str  # 封面图片
                }
            }
        """

        assert hasattr(WechatSogouConst.hot_index, hot_index)
        assert isinstance(page, int) and page > 0

        url = WechatSogouRequest.gen_hot_url(hot_index, page)
        resp = self.__get_by_unlock(
            url,
            is_need_unlock=lambda x: 'antispider' in x.url,
            unlock_platform=self.__unlock_sogou,
            unlock_callback=unlock_callback,
            identify_image_callback=identify_image_callback)

        resp.encoding = 'utf-8'
        return WechatSogouStructuring.get_gzh_artilce_by_hot(resp.text)
Beispiel #12
0
    def get_gzh_artilce_by_hot(self, hot_index, page=1, unlock_callback=None, identify_image_callback=None):
        """获取 首页热门文章

        Parameters
        ----------
        hot_index : WechatSogouConst.hot_index
            首页热门文章的分类(常量):WechatSogouConst.hot_index.xxx
        page : int
            页数

        Returns
        -------
        list[dict]
            {
                'gzh': {
                    'headimage': str,  # 公众号头像
                    'wechat_name': str,  # 公众号名称
                },
                'article': {
                    'url': str,  # 文章临时链接
                    'title': str,  # 文章标题
                    'abstract': str,  # 文章摘要
                    'time': int,  # 推送时间,10位时间戳
                    'open_id': str,  # open id
                    'main_img': str  # 封面图片
                }
            }
        """

        assert hasattr(WechatSogouConst.hot_index, hot_index)
        assert isinstance(page, int) and page > 0

        url = WechatSogouRequest.gen_hot_url(hot_index, page)
        resp = self.__get_by_unlock(url,
                                    is_need_unlock=lambda x: 'antispider' in x.url,
                                    unlock_platform=self.__unlock_sogou,
                                    unlock_callback=unlock_callback,
                                    identify_image_callback=identify_image_callback)

        resp.encoding = 'utf-8'
        return WechatSogouStructuring.get_gzh_artilce_by_hot(resp.text)
Beispiel #13
0
    def get_gzh_artilce_by_history(self,
                                   keyword=None,
                                   url=None,
                                   unlock_callback_sogou=None,
                                   identify_image_callback_sogou=None,
                                   unlock_callback_weixin=None,
                                   identify_image_callback_weixin=None):
        """从 公众号的最近10条群发页面 提取公众号信息 和 文章列表信息

        对于出现验证码的情况,可以由使用者自己提供:
            1、函数 unlock_callback ,这个函数 handle 出现验证码到解决的整个流程
            2、也可以 只提供函数 identify_image_callback,这个函数输入验证码二进制数据,输出验证码文字,剩下的由 wechatsogou 包来解决
        注意:
            函数 unlock_callback 和 identify_image_callback 只需要提供一个,如果都提供了,那么 identify_image_callback 不起作用

        Parameters
        ----------
        keyword : str or unicode
            公众号的id 或者name
        url : str or unicode
            群发页url,如果不提供url,就先去搜索一遍拿到url
        unlock_callback_sogou : callable
            处理出现 搜索 的时候出现验证码的函数,参见 unlock_callback_example
        identify_image_callback_sogou : callable
            处理 搜索 的时候处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example
        unlock_callback_weixin : callable
            处理出现 历史页 的时候出现验证码的函数,参见 unlock_callback_example
        identify_image_callback_weixin : callable
            处理 历史页 的时候处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example

        Returns
        -------
        dict
            {
                'gzh': {
                    'wechat_name': '',  # 名称
                    'wechat_id': '',  # 微信id
                    'introduction': '',  # 描述
                    'authentication': '',  # 认证
                    'headimage': ''  # 头像
                },
                'article': [
                    {
                        'send_id': '',  # 群发id,注意不唯一,因为同一次群发多个消息,而群发id一致
                        'datetime': '',  # 群发datatime
                        'type': '',  # 消息类型,均是49,表示图文
                        'main': 0,  # 是否是一次群发的第一次消息
                        'title': '',  # 文章标题
                        'abstract': '',  # 摘要
                        'fileid': '',  #
                        'content_url': '',  # 文章链接
                        'source_url': '',  # 阅读原文的链接
                        'cover': '',  # 封面图
                        'author': '',  # 作者
                        'copyright_stat': '',  # 文章类型,例如:原创啊
                    },
                    ...
                ]
            }


        Raises
        ------
        WechatSogouRequestsException
            requests error
        """
        if url is None:
            gzh_list = self.get_gzh_info(keyword, unlock_callback_sogou,
                                         identify_image_callback_sogou)
            if 'profile_url' not in gzh_list:
                raise Exception()  # todo use ws exception
            url = gzh_list['profile_url']

        resp = self.__get_by_unlock(
            url,
            WechatSogouRequest.gen_search_article_url(keyword),
            is_need_unlock=lambda x: '请输入验证码' in x.text,
            unlock_platform=self.__unlock_wechat,
            unlock_callback=unlock_callback_weixin,
            identify_image_callback=identify_image_callback_weixin)

        return WechatSogouStructuring.get_gzh_info_and_article_by_history(
            resp.text)
Beispiel #14
0
    def search_article(self,
                       keyword,
                       page=1,
                       timesn=WechatSogouConst.search_article_time.anytime,
                       article_type=WechatSogouConst.search_article_type.all,
                       ft=None,
                       et=None,
                       unlock_callback=None,
                       identify_image_callback=None):
        """搜索 文章

        对于出现验证码的情况,可以由使用者自己提供:
            1、函数 unlock_callback ,这个函数 handle 出现验证码到解决的整个流程
            2、也可以 只提供函数 identify_image_callback,这个函数输入验证码二进制数据,输出验证码文字,剩下的由 wechatsogou 包来解决
        注意:
            函数 unlock_callback 和 identify_image_callback 只需要提供一个,如果都提供了,那么 identify_image_callback 不起作用

        Parameters
        ----------
        keyword : str or unicode
            搜索文字
        page : int, optional
            页数 the default is 1
        timesn : WechatSogouConst.search_article_time
            时间 anytime 没有限制 / day 一天 / week 一周 / month 一月 / year 一年 / specific 自定
            the default is anytime
        article_type : WechatSogouConst.search_article_type
            含有内容的类型 image 有图 / video 有视频 / rich 有图和视频 / all 啥都有
        ft, et : datetime.date or None
            当 tsn 是 specific 时,ft 代表开始时间,如: 2017-07-01
            当 tsn 是 specific 时,et 代表结束时间,如: 2017-07-15
        unlock_callback : callable
            处理出现验证码页面的函数,参见 unlock_callback_example
        identify_image_callback : callable
            处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example

        Returns
        -------
        list[dict]
            {
                'article': {
                    'title': '',  # 文章标题
                    'url': '',  # 文章链接
                    'imgs': '',  # 文章图片list
                    'abstract': '',  # 文章摘要
                    'time': ''  # 文章推送时间
                },
                'gzh': {
                    'profile_url': '',  # 公众号最近10条群发页链接
                    'headimage': '',  # 头像
                    'wechat_name': '',  # 名称
                    'isv': '',  # 是否加v
                }
            }

        Raises
        ------
        WechatSogouRequestsException
            requests error
        """
        url = WechatSogouRequest.gen_search_article_url(
            keyword, page, timesn, article_type, ft, et)
        resp = self.__get_by_unlock(
            url,
            WechatSogouRequest.gen_search_article_url(keyword),
            is_need_unlock=lambda x: 'antispider' in x.url,
            unlock_platform=self.__unlock_sogou,
            unlock_callback=unlock_callback,
            identify_image_callback=identify_image_callback)

        return WechatSogouStructuring.get_article_by_search(resp.text)
Beispiel #15
0
    def search_gzh(self,
                   keyword,
                   page=1,
                   deblocking_callback=None,
                   identify_image_callback=None):
        """搜索 公众号

        对于出现验证码的情况,可以由使用者自己提供:
            1、函数 deblocking_callback ,这个函数 handle 出现验证码到解决的整个流程
            2、也可以 只提供函数 identify_image_callback,这个函数输入验证码二进制数据,输出验证码文字,剩下的由 wechatsogou 包来解决
        注意:
            函数 deblocking_callback 和 identify_image_callback 只需要提供一个,如果都提供了,那么 identify_image_callback 不起作用

        Parameters
        ----------
        keyword : str or unicode
            搜索文字
        page : int, optional
            页数 the default is 1
        deblocking_callback : callable
            处理出现验证码页面的函数,参见 deblocking_callback_example
        identify_image_callback : callable
            处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example

        Returns
        -------
        list[dict]
            {
                'url': '',
                'img': '',
                'name': '',
                'wechat_id': '',
                'post_perm': '',
                'qrcode': '',
                'introduction': '',
                'authentication': ''
            }

        Raises
        ------
        WechatSogouRequestsException
            requests error
        """
        req = requests.session()

        url = WechatSogouRequest.gen_search_gzh_url(keyword, page)
        resp = WechatSogouRequest.get(url,
                                      req=req,
                                      headers=self.__set_cookie())

        if not resp.ok:
            raise WechatSogouRequestsException('WechatSogouAPI search_gzh',
                                               resp)

        if 'antispider' in resp.url:
            self.__deblocking_search(url, resp, req, deblocking_callback,
                                     identify_image_callback)
            resp = WechatSogouRequest.get(
                url, req=req, headers=self.__set_cookie())  # req=req

        return WechatSogouStructuring.get_gzh_by_search(resp.text)
Beispiel #16
0
    def get_gzh_artilce_by_history(self, keyword=None, url=None,
                                   unlock_callback_sogou=None,
                                   identify_image_callback_sogou=None,
                                   unlock_callback_weixin=None,
                                   identify_image_callback_weixin=None):
        """从 公众号的最近10条群发页面 提取公众号信息 和 文章列表信息

        对于出现验证码的情况,可以由使用者自己提供:
            1、函数 unlock_callback ,这个函数 handle 出现验证码到解决的整个流程
            2、也可以 只提供函数 identify_image_callback,这个函数输入验证码二进制数据,输出验证码文字,剩下的由 wechatsogou 包来解决
        注意:
            函数 unlock_callback 和 identify_image_callback 只需要提供一个,如果都提供了,那么 identify_image_callback 不起作用

        Parameters
        ----------
        keyword : str or unicode
            公众号的id 或者name
        url : str or unicode
            群发页url,如果不提供url,就先去搜索一遍拿到url
        unlock_callback_sogou : callable
            处理出现 搜索 的时候出现验证码的函数,参见 unlock_callback_example
        identify_image_callback_sogou : callable
            处理 搜索 的时候处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example
        unlock_callback_weixin : callable
            处理出现 历史页 的时候出现验证码的函数,参见 unlock_callback_example
        identify_image_callback_weixin : callable
            处理 历史页 的时候处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example

        Returns
        -------
        dict
            {
                'gzh': {
                    'wechat_name': '',  # 名称
                    'wechat_id': '',  # 微信id
                    'introduction': '',  # 描述
                    'authentication': '',  # 认证
                    'headimage': ''  # 头像
                },
                'article': [
                    {
                        'send_id': '',  # 群发id,注意不唯一,因为同一次群发多个消息,而群发id一致
                        'datetime': '',  # 群发datatime
                        'type': '',  # 消息类型,均是49,表示图文
                        'main': 0,  # 是否是一次群发的第一次消息
                        'title': '',  # 文章标题
                        'abstract': '',  # 摘要
                        'fileid': '',  #
                        'content_url': '',  # 文章链接
                        'source_url': '',  # 阅读原文的链接
                        'cover': '',  # 封面图
                        'author': '',  # 作者
                        'copyright_stat': '',  # 文章类型,例如:原创啊
                    },
                    ...
                ]
            }


        Raises
        ------
        WechatSogouRequestsException
            requests error
        """
        if url is None:
            gzh_list = self.get_gzh_info(keyword, unlock_callback_sogou, identify_image_callback_sogou)
            if 'profile_url' not in gzh_list:
                raise Exception()  # todo use ws exception
            url = gzh_list['profile_url']

        resp = self.__get_by_unlock(url, WechatSogouRequest.gen_search_article_url(keyword),
                                    is_need_unlock=lambda x: '请输入验证码' in x.text,
                                    unlock_platform=self.__unlock_wechat,
                                    unlock_callback=unlock_callback_weixin,
                                    identify_image_callback=identify_image_callback_weixin)

        return WechatSogouStructuring.get_gzh_info_and_article_by_history(resp.text)
Beispiel #17
0
# -*- coding: utf-8 -*-

from __future__ import absolute_import, unicode_literals, print_function

import os

from wechatsogou.request import WechatSogouRequest
from wechatsogou.structuring import WechatSogouStructuring

ws = WechatSogouRequest()
ws_structuring = WechatSogouStructuring()

empty_search_result_keyword = 'gggggggggggggggggg'
gaokao_keyword = '高考'
fake_data_path = '{}/file'.format(
    os.getcwd() if 'test' in os.getcwd() else '{}/test'.format(os.getcwd()))
Beispiel #18
0
    def search_article(self, keyword, page=1, timesn=WechatSogouConst.search_article_time.anytime,
                       article_type=WechatSogouConst.search_article_type.all, ft=None, et=None,
                       unlock_callback=None,
                       identify_image_callback=None):
        """搜索 文章

        对于出现验证码的情况,可以由使用者自己提供:
            1、函数 unlock_callback ,这个函数 handle 出现验证码到解决的整个流程
            2、也可以 只提供函数 identify_image_callback,这个函数输入验证码二进制数据,输出验证码文字,剩下的由 wechatsogou 包来解决
        注意:
            函数 unlock_callback 和 identify_image_callback 只需要提供一个,如果都提供了,那么 identify_image_callback 不起作用

        Parameters
        ----------
        keyword : str or unicode
            搜索文字
        page : int, optional
            页数 the default is 1
        timesn : WechatSogouConst.search_article_time
            时间 anytime 没有限制 / day 一天 / week 一周 / month 一月 / year 一年 / specific 自定
            the default is anytime
        article_type : WechatSogouConst.search_article_type
            含有内容的类型 image 有图 / video 有视频 / rich 有图和视频 / all 啥都有
        ft, et : datetime.date or None
            当 tsn 是 specific 时,ft 代表开始时间,如: 2017-07-01
            当 tsn 是 specific 时,et 代表结束时间,如: 2017-07-15
        unlock_callback : callable
            处理出现验证码页面的函数,参见 unlock_callback_example
        identify_image_callback : callable
            处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example

        Returns
        -------
        list[dict]
            {
                'article': {
                    'title': '',  # 文章标题
                    'url': '',  # 文章链接
                    'imgs': '',  # 文章图片list
                    'abstract': '',  # 文章摘要
                    'time': ''  # 文章推送时间
                },
                'gzh': {
                    'profile_url': '',  # 公众号最近10条群发页链接
                    'headimage': '',  # 头像
                    'wechat_name': '',  # 名称
                    'isv': '',  # 是否加v
                }
            }

        Raises
        ------
        WechatSogouRequestsException
            requests error
        """
        url = WechatSogouRequest.gen_search_article_url(keyword, page, timesn, article_type, ft, et)
        resp = self.__get_by_unlock(url, WechatSogouRequest.gen_search_article_url(keyword),
                                    is_need_unlock=lambda x: 'antispider' in x.url,
                                    unlock_platform=self.__unlock_sogou,
                                    unlock_callback=unlock_callback,
                                    identify_image_callback=identify_image_callback)

        return WechatSogouStructuring.get_article_by_search(resp.text)
Beispiel #19
0
    def search_article(self,
                       keyword,
                       page=1,
                       timesn=0,
                       article_type=WechatSogouRequest.TYPE_ALL,
                       ft=None,
                       et=None,
                       deblocking_callback=None,
                       identify_image_callback=None):
        """搜索 文章

        对于出现验证码的情况,可以由使用者自己提供:
            1、函数 deblocking_callback ,这个函数 handle 出现验证码到解决的整个流程
            2、也可以 只提供函数 identify_image_callback,这个函数输入验证码二进制数据,输出验证码文字,剩下的由 wechatsogou 包来解决
        注意:
            函数 deblocking_callback 和 identify_image_callback 只需要提供一个,如果都提供了,那么 identify_image_callback 不起作用

        Parameters
        ----------
        keyword : str or unicode
            搜索文字
        page : int, optional
            页数 the default is 1
        timesn : {0, 1, 2, 3, 4, 5}
            时间 0 没有限制 / 1一天 / 2一周 / 3一月 / 4一年 / 5自定
            the default is 0
        article_type : {'image', 'video', 'rich', 'all'}
            含有内容的类型 TYPE_IMAGE 有图 / TYPE_VIDEO 有视频 / TYPE_RICH 有图和视频 / TYPE_ALL 啥都有
        ft, et : datetime.date or None
            当 tsn 是 5 时,ft 代表开始时间,如: 2017-07-01
            当 tsn 是 5 时,et 代表结束时间,如: 2017-07-15
        deblocking_callback : callable
            处理出现验证码页面的函数,参见 deblocking_callback_example
        identify_image_callback : callable
            处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example

        Returns
        -------
        list[dict]
            {
                'url': '',
                'img': '',
                'name': '',
                'wechat_id': '',
                'post_perm': '',
                'qrcode': '',
                'introduction': '',
                'authentication': ''
            }

        Raises
        ------
        WechatSogouRequestsException
            requests error
        """
        req = requests.session()

        url = WechatSogouRequest.gen_search_article_url(
            keyword,
            page,
            timesn=timesn,
            article_type=article_type,
            ft=ft,
            et=et)
        url_referer = WechatSogouRequest.gen_search_article_url(keyword)

        resp = WechatSogouRequest.get(
            url, req=req, headers=self.__set_cookie(referer=url_referer))

        if not resp.ok:
            raise WechatSogouRequestsException('WechatSogouAPI search_article',
                                               resp)

        if 'antispider' in resp.url:
            self.__deblocking_search(url, resp, req, deblocking_callback,
                                     identify_image_callback)
            resp = WechatSogouRequest.get(
                url, req=req,
                headers=self.__set_cookie(referer=url_referer))  # req=req

        return WechatSogouStructuring.get_article_by_search(resp.text)
 def test_gen_search_article_url_keyword(self):
     url = WechatSogouRequest.gen_search_gzh_url(gaokao_keyword)
     assert_equal('http://weixin.sogou.com/weixin?type=1&page=1&ie=utf8&query=%E9%AB%98%E8%80%83', url)
Beispiel #21
0
    def search_article(self, keyword, page=1, timesn=WechatSogouConst.search_article_time.anytime,
                       article_type=WechatSogouConst.search_article_type.all, ft=None, et=None,
                       unlock_callback=None,
                       identify_image_callback=None,
                       decode_url=True):
        """搜索 文章

        对于出现验证码的情况,可以由使用者自己提供:
            1、函数 unlock_callback ,这个函数 handle 出现验证码到解决的整个流程
            2、也可以 只提供函数 identify_image_callback,这个函数输入验证码二进制数据,输出验证码文字,剩下的由 wechatsogou 包来解决
        注意:
            函数 unlock_callback 和 identify_image_callback 只需要提供一个,如果都提供了,那么 identify_image_callback 不起作用

        Parameters
        ----------
        keyword : str or unicode
            搜索文字
        page : int, optional
            页数 the default is 1
        timesn : WechatSogouConst.search_article_time
            时间 anytime 没有限制 / day 一天 / week 一周 / month 一月 / year 一年 / specific 自定
            the default is anytime
        article_type : WechatSogouConst.search_article_type
            含有内容的类型 image 有图 / video 有视频 / rich 有图和视频 / all 啥都有
        ft, et : datetime.date or None
            当 tsn 是 specific 时,ft 代表开始时间,如: 2017-07-01
            当 tsn 是 specific 时,et 代表结束时间,如: 2017-07-15
        unlock_callback : callable
            处理出现验证码页面的函数,参见 unlock_callback_example
        identify_image_callback : callable
            处理验证码函数,输入验证码二进制数据,输出文字,参见 identify_image_callback_example
        decode_url : bool
            是否解析 url

        Returns
        -------
        list[dict]
            {
                'article': {
                    'title': '',  # 文章标题
                    'url': '',  # 文章链接
                    'imgs': '',  # 文章图片list
                    'abstract': '',  # 文章摘要
                    'time': ''  # 文章推送时间
                },
                'gzh': {
                    'profile_url': '',  # 公众号最近10条群发页链接
                    'headimage': '',  # 头像
                    'wechat_name': '',  # 名称
                    'isv': '',  # 是否加v
                }
            }

        Raises
        ------
        WechatSogouRequestsException
            requests error
        """
        def limit_sleep():
            """
            根据limit_seconds参数延迟一段时间
            """
            seconds = self.limit_seconds
            if seconds: time.sleep(seconds)
        url = WechatSogouRequest.gen_search_article_url(keyword, page, timesn, article_type, ft, et)
        session = requests.session()
        try:
            resp = self.__get_by_unlock(url, WechatSogouRequest.gen_search_article_url(keyword),
                                        unlock_platform=self.__unlock_sogou,
                                        unlock_callback=unlock_callback,
                                        identify_image_callback=identify_image_callback,
                                        session=session)

            article_list = WechatSogouStructuring.get_article_by_search(resp.text)

            limit_sleep()
            for i in article_list:
                if decode_url:
                    i['article']['url'] = self.__format_url(i['article']['url'], url, resp.text, unlock_callback=unlock_callback, identify_image_callback=identify_image_callback, session=session)
                    limit_sleep()
                    i['gzh']['profile_url'] = self.__format_url(i['gzh']['profile_url'], url, resp.text, unlock_callback=unlock_callback, identify_image_callback=identify_image_callback, session=session)
                yield i
        except WechatSogouRequestsException as e:
            raise e
 def test_gen_search_article_url_keyword(self):
     url = WechatSogouRequest.gen_search_article_url(gaokao_keyword)
     assert_equal('http://weixin.sogou.com/weixin?type=2&page=1&ie=utf8&query=%E9%AB%98%E8%80%83&interation=', url)
    def test_gen_search_article_url_timesn(self, timesn, ft, et):
        if timesn == 0:
            url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, timesn=timesn)
            assert_in('type=2&page=1&ie=utf8&query=', url)
            assert_not_in('ft=&et=', url)

            url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, timesn=timesn, ft=ft)
            assert_in('type=2&page=1&ie=utf8&query=', url)
            assert_not_in('ft=&et=', url)
        elif timesn in [1, 2, 3, 4]:
            url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, timesn=timesn)
            assert_in('tsn={}&ft=&et='.format(timesn), url)

            url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, timesn=timesn, ft=ft)
            assert_in('tsn={}&ft=&et='.format(timesn), url)
        elif timesn == 5:
            if ft <= et:
                url = WechatSogouRequest.gen_search_article_url(gaokao_keyword, timesn=timesn, ft=ft, et=et)
                assert_in('tsn=5&ft={}&et={}'.format(ft, et), url)
            else:
                with assert_raises(AssertionError):
                    WechatSogouRequest.gen_search_article_url(gaokao_keyword, timesn=timesn)
                    WechatSogouRequest.gen_search_article_url(gaokao_keyword, timesn=timesn, ft=ft, et=et)
        else:
            with assert_raises(AssertionError):
                WechatSogouRequest.gen_search_article_url(gaokao_keyword, timesn=timesn)