diff --git a/README.md b/README.md index 756f635..02455aa 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,8 @@ Out[5]: 'authentication': '南京航空航天大学', 'headimage': 'http://img01.sogoucdn.com/app/a/100520090/oIWsFt1tmWoG6vO6BcsS7St61bRE', 'introduction': '南航大志愿活动的领跑者,为你提供校内外的志愿资源和精彩消息.', - 'post_perm': 0, + 'post_perm': 26, + 'view_perm': 1000, 'profile_url': 'http://mp.weixin.qq.com/profile?src=3×tamp=1501140102&ver=1&signature=OpcTZp20TUdKHjSqWh7m73RWBIzwYwINpib2ZktBkLG8NyHamTvK2jtzl7mf-VdpE246zXAq18GNm*S*bq4klw==', 'qrcode': 'http://mp.weixin.qq.com/rr?src=3×tamp=1501140102&ver=1&signature=-DnFampQflbiOadckRJaTaDRzGSNfisIfECELSo-lN-GeEOH8-XTtM*ASdavl0xuavw-bmAEQXOa1T39*EIsjzxz30LjyBNkjmgbT6bGnZM=', 'wechat_id': 'nanhangqinggong', diff --git a/docs/HISTORY.rst b/docs/HISTORY.rst index 13f449a..da73873 100644 --- a/docs/HISTORY.rst +++ b/docs/HISTORY.rst @@ -1,6 +1,90 @@ Change Log ========== +`v4.0.3 `__ (2018-02-27) +--------------------------------------------------------------------------- + +`Full +Changelog `__ + +**Closed issues:** + +- 所有接口调取之后无数据返回。。 + `#179 `__ +- 输入验证码后报错如下, 该如何? + `#178 `__ +- 爬出来的很多链接并不能够使用! + `#177 `__ +- 已知url,如何抓取文章信息? + `#174 `__ +- 请问为什么有的公众号明明存在,却用ws_api.get_gzh_info搜索不到? + `#173 `__ +- 当公众号搜索结果有多个时会有异常,没法爬取公众号连接 + `#172 `__ +- 这个包不好使了吗 + `#171 `__ +- 提示找不到模块,而且pip install wechatsogou安装失败 + `#169 `__ +- 按照实例跑得到的是空值:search_gzh(‘新华社’) + `#168 `__ +- 输入验证码之后,无法获得相应数据的问题 + `#167 `__ +- get_gzh_article_by_history输入正确的验证码依然无法获取公众号文章列表页面数据 + `#165 `__ +- 大神可能问题有点冲突但是还是想问问您 + `#164 `__ +- 当我使用 ws_api.search_article(‘importNew’),获取的内容出现了 + ``\`` + `#160 `__ +- 复杂部分用调用C + `#127 `__ +- 后台管理+可视化运行 + `#124 `__ +- 测试用识别转移到中国区服务器 + `#117 `__ + +**Merged pull requests:** + +- fix wechat-identify-unlock + `#176 `__ + (`Chyroc `__) +- Release/v4.0.2 + `#163 `__ + (`Chyroc `__) + +`v4.0.2 `__ (2017-11-14) +--------------------------------------------------------------------------- + +`Full +Changelog `__ + +**Closed issues:** + +- 你这个 Readme 里面,大小写不分的啊 + `#159 `__ +- get_article_by_search方法只能获取微信右侧有图的文章列表 + `#155 `__ + +**Merged pull requests:** + +- update readme remove slack + `#162 `__ + (`Chyroc `__) +- update readme add xiaomiquan + `#161 `__ + (`Chyroc `__) +- add set timeout + `#158 `__ + (`Chyroc `__) +- fix readme `#157 `__ + (`Chyroc `__) +- Change/wechat pay qrcode + `#156 `__ + (`Chyroc `__) +- Release/v4.0.1 + `#154 `__ + (`Chyroc `__) + `v4.0.1 `__ (2017-10-16) --------------------------------------------------------------------------- @@ -9,7 +93,7 @@ Changelog `__ **Closed issues:** -- ws\_api.get\_gzh\_article\_by\_history(keywords)接口返回Index Error +- ws_api.get_gzh_article_by_history(keywords)接口返回Index Error `#152 `__ **Merged pull requests:** @@ -29,13 +113,13 @@ Changelog `__ **Closed issues:** -- get\_gzh\_artilce\_by\_history 名字修改 +- get_gzh_artilce_by_history 名字修改 `#149 `__ - 按照示例跑出来是乱码 `#148 `__ - 请问在阿里云ECS上出现需要输入验证码的时候该怎么解决? `#146 `__ -- get\_gzh\_artilce\_by\_history 出现填写code +- get_gzh_artilce_by_history 出现填写code `#144 `__ - 验证码识别预估什么时候完成啊 `#131 `__ @@ -48,7 +132,7 @@ Changelog `__ https://github.com/Chyroc/WechatSogou… `#150 `__ (`Chyroc `__) -- remove is\_need\_unlock +- remove is_need_unlock `#147 `__ (`Chyroc `__) - Release/v3.1.2 @@ -96,7 +180,7 @@ Changelog `__ - 作者有代理的api没有呀 `#136 `__ -- search\_article时只能获取到第10页,超过了获取到的就是空了 +- search_article时只能获取到第10页,超过了获取到的就是空了 `#132 `__ **Merged pull requests:** @@ -140,7 +224,7 @@ Changelog `__ **Merged pull requests:** -- Add/get hot api / gzh => gzh\_info +- Add/get hot api / gzh => gzh_info `#109 `__ (`Chyroc `__) - Change/search article type const @@ -167,7 +251,7 @@ Changelog `__ **Closed issues:** -- 解封成功,正在为您跳转来源地址... +- 解封成功,正在为您跳转来源地址… `#72 `__ - 列表页验证码有办法绕过吗? `#71 `__ @@ -178,15 +262,15 @@ Changelog `__ - badge issue `#64 `__ - 目前getcomment接口已报错,显示 404了,何解? `#63 `__ -- 调用方法search\_gzh\_info()搜索公众号时,获取到的结果中wechatid为‘’ +- 调用方法search_gzh_info()搜索公众号时,获取到的结果中wechatid为‘’ `#62 `__ - 跳出来验证码之后输入,报错 `#61 `__ -- 请问logging.config.fileConfig('logging.conf')出错如何解决 +- 请问logging.config.fileConfig(‘logging.conf’)出错如何解决 `#60 `__ - 可否增加验证码输入错误,能再次重新输入的机制 `#54 `__ -- 调用get\_gzh\_message返回{"ret":0,"errmsg":""} +- 调用get_gzh_message返回{“ret”:0,“errmsg”:“”} `#52 `__ - 输入验证码后报错 `#32 `__ @@ -244,7 +328,7 @@ Changelog `__ - Add annotation and fix `#88 `__ (`Chyroc `__) -- split test get gzh\_info and articel +- split test get gzh_info and articel `#87 `__ (`Chyroc `__) - add structuring-gzh-article-from-history @@ -346,13 +430,13 @@ Changelog `__ `#25 `__ - 结果模版更新了 `#24 `__ -- 文章标题带引号(",")的情况解析报错 +- 文章标题带引号(“,")的情况解析报错 `#23 `__ - 请问,我运行test.py时为何没报错却没得到任何结果? `#21 `__ - 如何获得公众号的id和名称? `#20 `__ -- search\_gzh\_info无法取得内容 +- search_gzh_info无法取得内容 `#18 `__ - 原始文章url `#17 `__ - 请问在Linux下可以使用吗?我运行了一下出现如下问题,还望指教 @@ -370,13 +454,13 @@ Changelog `__ - 获取文章只能10篇? `#10 `__ - 搜狗平台问题 `#9 `__ -- deal\_article\_comment(text=text)并不能获得用户的评论内容 +- deal_article_comment(text=text)并不能获得用户的评论内容 `#8 `__ - py2.7 什么时候支持? `#7 `__ - PIL is not support Python3 `#6 `__ -- 演示代码wechats.get\_gzh\_article\_by\_url\_dict(wechat\_info['url'])提示list +- 演示代码wechats.get_gzh_article_by_url_dict(wechat_info[‘url’])提示list index out of range `#5 `__ - 如何使用代理 `#2 `__ @@ -425,4 +509,4 @@ Changelog `__ (`Chyroc `__) \* *This Change Log was automatically generated by -`github\_changelog\_generator `__* +`github_changelog_generator `__* diff --git a/docs/README.rst b/docs/README.rst index cae21be..096dc79 100644 --- a/docs/README.rst +++ b/docs/README.rst @@ -4,9 +4,9 @@ |Build Status| |PyPI version| |PyPI| |py27,py35,py36| |PyPI| .. figure:: https://raw.githubusercontent.com/chyroc/wechatsogou/master/screenshot/get_gzh_info.png - :alt: ws\_api.get\_gzh\_info('南航青年志愿者') + :alt: ws_api.get_gzh_info(‘南航青年志愿者’) - ws\_api.get\_gzh\_info('南航青年志愿者') + ws_api.get_gzh_info(‘南航青年志愿者’) :: @@ -89,91 +89,92 @@ # 如 设置超时 ws_api = wechatsogou.WechatSogouAPI(timeout=0.1) -获取特定公众号信息 - get\_gzh\_info -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +获取特定公众号信息 - get_gzh_info +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. figure:: https://raw.githubusercontent.com/chyroc/wechatsogou/master/screenshot/get_gzh_info.png - :alt: ws\_api.get\_gzh\_info('南航青年志愿者') + :alt: ws_api.get_gzh_info(‘南航青年志愿者’) - ws\_api.get\_gzh\_info('南航青年志愿者') + ws_api.get_gzh_info(‘南航青年志愿者’) - 使用 - :: - - In [5]: import wechatsogou - ...: - ...: ws_api =wechatsogou.WechatSogouAPI() - ...: ws_api.get_gzh_info('南航青年志愿者') - ...: - Out[5]: - { - 'authentication': '南京航空航天大学', - 'headimage': 'http://img01.sogoucdn.com/app/a/100520090/oIWsFt1tmWoG6vO6BcsS7St61bRE', - 'introduction': '南航大志愿活动的领跑者,为你提供校内外的志愿资源和精彩消息.', - 'post_perm': 0, - 'profile_url': 'http://mp.weixin.qq.com/profile?src=3×tamp=1501140102&ver=1&signature=OpcTZp20TUdKHjSqWh7m73RWBIzwYwINpib2ZktBkLG8NyHamTvK2jtzl7mf-VdpE246zXAq18GNm*S*bq4klw==', - 'qrcode': 'http://mp.weixin.qq.com/rr?src=3×tamp=1501140102&ver=1&signature=-DnFampQflbiOadckRJaTaDRzGSNfisIfECELSo-lN-GeEOH8-XTtM*ASdavl0xuavw-bmAEQXOa1T39*EIsjzxz30LjyBNkjmgbT6bGnZM=', - 'wechat_id': 'nanhangqinggong', - 'wechat_name': '南航青年志愿者' - } +:: + + In [5]: import wechatsogou + ...: + ...: ws_api =wechatsogou.WechatSogouAPI() + ...: ws_api.get_gzh_info('南航青年志愿者') + ...: + Out[5]: + { + 'authentication': '南京航空航天大学', + 'headimage': 'http://img01.sogoucdn.com/app/a/100520090/oIWsFt1tmWoG6vO6BcsS7St61bRE', + 'introduction': '南航大志愿活动的领跑者,为你提供校内外的志愿资源和精彩消息.', + 'post_perm': 26, + 'view_perm': 1000, + 'profile_url': 'http://mp.weixin.qq.com/profile?src=3×tamp=1501140102&ver=1&signature=OpcTZp20TUdKHjSqWh7m73RWBIzwYwINpib2ZktBkLG8NyHamTvK2jtzl7mf-VdpE246zXAq18GNm*S*bq4klw==', + 'qrcode': 'http://mp.weixin.qq.com/rr?src=3×tamp=1501140102&ver=1&signature=-DnFampQflbiOadckRJaTaDRzGSNfisIfECELSo-lN-GeEOH8-XTtM*ASdavl0xuavw-bmAEQXOa1T39*EIsjzxz30LjyBNkjmgbT6bGnZM=', + 'wechat_id': 'nanhangqinggong', + 'wechat_name': '南航青年志愿者' + } - 返回数据结构 - .. code:: python +.. code:: python - { - 'profile_url': '', # 最近10条群发页链接 - 'headimage': '', # 头像 - 'wechat_name': '', # 名称 - 'wechat_id': '', # 微信id - 'post_perm': int, # 最近一月群发数 - 'qrcode': '', # 二维码 - 'introduction': '', # 简介 - 'authentication': '' # 认证 - } + { + 'profile_url': '', # 最近10条群发页链接 + 'headimage': '', # 头像 + 'wechat_name': '', # 名称 + 'wechat_id': '', # 微信id + 'post_perm': int, # 最近一月群发数 + 'qrcode': '', # 二维码 + 'introduction': '', # 简介 + 'authentication': '' # 认证 + } 搜索公众号 ~~~~~~~~~~ .. figure:: https://raw.githubusercontent.com/chyroc/wechatsogou/master/screenshot/search_gzh.png - :alt: ws\_api.search\_gzh('南京航空航天大学') + :alt: ws_api.search_gzh(‘南京航空航天大学’) - ws\_api.search\_gzh('南京航空航天大学') + ws_api.search_gzh(‘南京航空航天大学’) - 使用 - :: - - In [6]: import wechatsogou - ...: - ...: ws_api =wechatsogou.WechatSogouAPI() - ...: ws_api.search_gzh('南京航空航天大学') - ...: - Out[6]: - [ - { - 'authentication': '南京航空航天大学', - 'headimage': 'http://img01.sogoucdn.com/app/a/100520090/oIWsFt1MvjqspMDVvZjpmxyo36sU', - 'introduction': '南京航空航天大学官方微信', - 'post_perm': 0, - 'profile_url': 'http://mp.weixin.qq.com/profile?src=3×tamp=1501141990&ver=1&signature=S-7U131D3eQERC8yJGVAg2edySXn*qGVi5uE8QyQU034di*2mS6vGJVnQBRB0It9t9M-Qn7ynvjRKZNQrjBMEg==', - 'qrcode': 'http://mp.weixin.qq.com/rr?src=3×tamp=1501141990&ver=1&signature=Tlp-r0AaBRxtx3TuuyjdxmjiR4aEJY-hjh0kmtV6byVu3QIQYiMlJttJgGu0hwtZMZCCntdfaP5jD4JXipTwoGecAze8ycEF5KYZqtLSsNE=', - 'wechat_id': 'NUAA_1952', - 'wechat_name': '南京航空航天大学' - }, - { - 'authentication': '南京航空航天大学', - 'headimage': 'http://img01.sogoucdn.com/app/a/100520090/oIWsFtwVmjdK_57vIKeMceGXF5BQ', - 'introduction': '南京航空航天大学团委官方微信平台', - 'post_perm': 0, - 'profile_url': 'http://mp.weixin.qq.com/profile?src=3×tamp=1501141990&ver=1&signature=aXFQrSDOiZJHedlL7vtAkvFMckxBmubE9VGrVczTwS601bOIT5Nrr8Pcgs6bQ-oEd6jdQ0aK5WCQjNwMAhJnyQ==', - 'qrcode': 'http://mp.weixin.qq.com/rr?src=3×tamp=1501141990&ver=1&signature=7Cpbd9CVQsXJkExRcU5VM6NuyoxDQQfVfF7*CGI-PTR0y6stHPtdSDqzAzvPMWz67Xz9IMF2TDfu4Cndj5bKxlsFh6wGhiLH0b9ZKqgCW5k=', - 'wechat_id': 'nuaa_tw', - 'wechat_name': '南京航空航天大学团委' - }, - ... - ] +:: + + In [6]: import wechatsogou + ...: + ...: ws_api =wechatsogou.WechatSogouAPI() + ...: ws_api.search_gzh('南京航空航天大学') + ...: + Out[6]: + [ + { + 'authentication': '南京航空航天大学', + 'headimage': 'http://img01.sogoucdn.com/app/a/100520090/oIWsFt1MvjqspMDVvZjpmxyo36sU', + 'introduction': '南京航空航天大学官方微信', + 'post_perm': 0, + 'profile_url': 'http://mp.weixin.qq.com/profile?src=3×tamp=1501141990&ver=1&signature=S-7U131D3eQERC8yJGVAg2edySXn*qGVi5uE8QyQU034di*2mS6vGJVnQBRB0It9t9M-Qn7ynvjRKZNQrjBMEg==', + 'qrcode': 'http://mp.weixin.qq.com/rr?src=3×tamp=1501141990&ver=1&signature=Tlp-r0AaBRxtx3TuuyjdxmjiR4aEJY-hjh0kmtV6byVu3QIQYiMlJttJgGu0hwtZMZCCntdfaP5jD4JXipTwoGecAze8ycEF5KYZqtLSsNE=', + 'wechat_id': 'NUAA_1952', + 'wechat_name': '南京航空航天大学' + }, + { + 'authentication': '南京航空航天大学', + 'headimage': 'http://img01.sogoucdn.com/app/a/100520090/oIWsFtwVmjdK_57vIKeMceGXF5BQ', + 'introduction': '南京航空航天大学团委官方微信平台', + 'post_perm': 0, + 'profile_url': 'http://mp.weixin.qq.com/profile?src=3×tamp=1501141990&ver=1&signature=aXFQrSDOiZJHedlL7vtAkvFMckxBmubE9VGrVczTwS601bOIT5Nrr8Pcgs6bQ-oEd6jdQ0aK5WCQjNwMAhJnyQ==', + 'qrcode': 'http://mp.weixin.qq.com/rr?src=3×tamp=1501141990&ver=1&signature=7Cpbd9CVQsXJkExRcU5VM6NuyoxDQQfVfF7*CGI-PTR0y6stHPtdSDqzAzvPMWz67Xz9IMF2TDfu4Cndj5bKxlsFh6wGhiLH0b9ZKqgCW5k=', + 'wechat_id': 'nuaa_tw', + 'wechat_name': '南京航空航天大学团委' + }, + ... + ] - 数据结构 @@ -196,38 +197,38 @@ list of dict, dict: ~~~~~~~~~~~~ .. figure:: https://raw.githubusercontent.com/chyroc/wechatsogou/master/screenshot/search_article.png - :alt: ws\_api.search\_article('南京航空航天大学') + :alt: ws_api.search_article(‘南京航空航天大学’) - ws\_api.search\_article('南京航空航天大学') + ws_api.search_article(‘南京航空航天大学’) - 使用 - :: - - In [7]: import wechatsogou - ...: - ...: ws_api =wechatsogou.WechatSogouAPI() - ...: ws_api.search_article('南京航空航天大学') - ...: - Out[7]: - [ - { - 'article': { - 'abstract': '【院校省份】江苏【报名时间】4月5日截止【考试时间】6月10日-11日南京航空航天大学2017年自主招生简章南京航空航天大学2017...', - 'imgs': ['http://img01.sogoucdn.com/net/a/04/link?appid=100520033&url=http://mmbiz.qpic.cn/mmbiz_png/P07yicBRJfC71QB3lREx4J4x34QOibGaia5BkiaaiaiaibicWkTBULou9R08K6FaxlUA1RFBFWCmpO1Lepk7ZcXK45vguQ/0?wx_fmt=png'], - 'time': 1490270644, - 'title': '南京航空航天大学2017年自主招生简章', - 'url': 'http://mp.weixin.qq.com/s?src=3×tamp=1501142580&ver=1&signature=hRMlQOLQpu4BNhBACavusZdmk**D65qHyz5LWDq1lPjVcm7*iiBS0l7Pq40h0fiCX*bZ8vSMLzAMDNzELYFKIQ7mND0-7cQi-N0BtfTBql*CQdsHun-GtaYEqRva6Ukwce3gZh46SXJzo90kyZ3dwVYl6*589bGDIzG6JTGfpxI=' - }, - 'gzh': { - 'headimage': 'http://wx.qlogo.cn/mmhead/Q3auHgzwzM5kiawibor6ABhnibMYnOADvqdcrl5XWiaFfM5mGYZ8cUica6A/0', - 'isv': 0, - 'profile_url': 'http://mp.weixin.qq.com/profile?src=3×tamp=1501142580&ver=1&signature=dVkDdcFr1suL1WHdCOJj7pwZhG9W*APi-j5kRtS09ccv-WID-zNs0ecDiiz1wwE7qbNSk5HBL*ffpyVXcF0fFQ==', - 'wechat_name': '自主招生在线' - } - }, - ... - ] +:: + + In [7]: import wechatsogou + ...: + ...: ws_api =wechatsogou.WechatSogouAPI() + ...: ws_api.search_article('南京航空航天大学') + ...: + Out[7]: + [ + { + 'article': { + 'abstract': '【院校省份】江苏【报名时间】4月5日截止【考试时间】6月10日-11日南京航空航天大学2017年自主招生简章南京航空航天大学2017...', + 'imgs': ['http://img01.sogoucdn.com/net/a/04/link?appid=100520033&url=http://mmbiz.qpic.cn/mmbiz_png/P07yicBRJfC71QB3lREx4J4x34QOibGaia5BkiaaiaiaibicWkTBULou9R08K6FaxlUA1RFBFWCmpO1Lepk7ZcXK45vguQ/0?wx_fmt=png'], + 'time': 1490270644, + 'title': '南京航空航天大学2017年自主招生简章', + 'url': 'http://mp.weixin.qq.com/s?src=3×tamp=1501142580&ver=1&signature=hRMlQOLQpu4BNhBACavusZdmk**D65qHyz5LWDq1lPjVcm7*iiBS0l7Pq40h0fiCX*bZ8vSMLzAMDNzELYFKIQ7mND0-7cQi-N0BtfTBql*CQdsHun-GtaYEqRva6Ukwce3gZh46SXJzo90kyZ3dwVYl6*589bGDIzG6JTGfpxI=' + }, + 'gzh': { + 'headimage': 'http://wx.qlogo.cn/mmhead/Q3auHgzwzM5kiawibor6ABhnibMYnOADvqdcrl5XWiaFfM5mGYZ8cUica6A/0', + 'isv': 0, + 'profile_url': 'http://mp.weixin.qq.com/profile?src=3×tamp=1501142580&ver=1&signature=dVkDdcFr1suL1WHdCOJj7pwZhG9W*APi-j5kRtS09ccv-WID-zNs0ecDiiz1wwE7qbNSk5HBL*ffpyVXcF0fFQ==', + 'wechat_name': '自主招生在线' + } + }, + ... + ] - 数据结构 @@ -251,145 +252,175 @@ list of dict, dict: } } -解析最近文章页 - get\_gzh\_article\_by\_history -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +解析最近文章页 - get_gzh_article_by_history +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. figure:: https://raw.githubusercontent.com/chyroc/wechatsogou/master/screenshot/get_gzh_article_by_history.png - :alt: ws\_api.search\_article('南京航空航天大学') + :alt: ws_api.search_article(‘南京航空航天大学’) - ws\_api.search\_article('南京航空航天大学') + ws_api.search_article(‘南京航空航天大学’) - 使用 - :: - - In [1]: import wechatsogou - ...: - ...: ws_api =wechatsogou.WechatSogouAPI() - ...: ws_api.get_gzh_article_by_history('南航青年志愿者') - ...: - Out[1]: - { - 'article': [ - { - 'abstract': '我们所做的,并不能立马去改变什么——\n但千里之行,绿勤行永不止步。\n我们不会就此止步,之后我们又将再出发。\n 民勤,再见。\n绿勤行,不再见。', - 'author': '', - 'content_url': 'http://mp.weixin.qq.com/s?timestamp=1501143158&src=3&ver=1&signature=B-*tqUrFyO7OqpFeJZwTA7JJtsHpz6BgC8ugyfgpOnyWLtPb85R5Zmu0JuZRbZKG72x4bQjMCcsfA5mC3GSSOPbYd-9tzvTgmroGRmc4Tzk8090KCiEu6EjA0YMHeytWJWpxr51M2FUYQhTWJ01pTmNnXLVAG6Ex6AG52uvvmQA=', - 'copyright_stat': 100, - 'cover': 'http://mmbiz.qpic.cn/mmbiz_jpg/icFYWMxnmxHDYgXNjAle7szYLgQmicbaQlb1eVFuwp2vxEu5eNVwYacaHah2N5W8dKAm725vxv5aM6DFlM59Wftg/0?wx_fmt=jpeg', - 'datetime': 1501072594, - 'fileid': 502326199, - 'main': 1, - 'send_id': 1000000306, - 'source_url': '', - 'title': '绿勤行——不说再见', - 'type': '49' - }, - { - 'abstract': '当时不杂,过往不恋,志愿不老,我们不散!', - 'author': '', - 'content_url': 'http://mp.weixin.qq.com/s?timestamp=1501143158&src=3&ver=1&signature=B-*tqUrFyO7OqpFeJZwTA7JJtsHpz6BgC8ugyfgpOnyWLtPb85R5Zmu0JuZRbZKG72x4bQjMCcsfA5mC3GSSOGUrM*jg*EP1jU-Dyf2CVqmPnOgBiET2wlitek4FcRbXorAswWHm*1rqODcN52NtfKD-OcRTazQS*t5SnJtu3ZA=', - 'copyright_stat': 100, - 'cover': 'http://mmbiz.qpic.cn/mmbiz_jpg/icFYWMxnmxHCoY44nPUXvkSgpZI1LaEsZfkZvtGaiaNW2icjibCp6qs93xLlr9kXMJEP3z1pmQ6TbRZNicHibGzRwh1w/0?wx_fmt=jpeg', - 'datetime': 1500979158, - 'fileid': 502326196, - 'main': 1, - 'send_id': 1000000305, - 'source_url': '', - 'title': '有始有终 | 2016-2017年度环境保护服务部工作总结', - 'type': '49' - }, - ... - ], - 'gzh': { - 'authentication': '南京航空航天大学', - 'headimage': 'http://wx.qlogo.cn/mmhead/Q3auHgzwzM4xV5PgPjK5XoPaaQoxnWJAFicibMvPAnsoybawMBFxua1g/0', - 'introduction': '南航大志愿活动的领跑者,为你提供校内外的志愿资源和精彩消息。', - 'wechat_id': 'nanhangqinggong', - 'wechat_name': '南航青年志愿者' - } - } - -- 数据结构 \`\`\`python { 'gzh': { 'wechat\_name': '', # 名称 - 'wechat\_id': '', # 微信id 'introduction': '', # 简介 - 'authentication': '', # 认证 'headimage': '' # 头像 }, 'article': [ { - 'send\_id': int, # - 群发id,注意不唯一,因为同一次群发多个消息,而群发id一致 'datetime': - int, # 群发datatime 10位时间戳 'type': '', # - 消息类型,均是49(在手机端历史消息页有其他类型,网页端最近10条消息页只有49),表示图文 - 'main': int, # 是否是一次群发的第一次消息 1 or 0 'title': '', # - 文章标题 'abstract': '', # 摘要 'fileid': int, # 'content\_url': '', - # 文章链接 'source\_url': '', # 阅读原文的链接 'cover': '', # 封面图 - 'author': '', # 作者 'copyright\_stat': int, # 文章类型,例如:原创啊 - }, ...] } - :: + In [1]: import wechatsogou + ...: + ...: ws_api =wechatsogou.WechatSogouAPI() + ...: ws_api.get_gzh_article_by_history('南航青年志愿者') + ...: + Out[1]: + { + 'article': [ + { + 'abstract': '我们所做的,并不能立马去改变什么——\n但千里之行,绿勤行永不止步。\n我们不会就此止步,之后我们又将再出发。\n 民勤,再见。\n绿勤行,不再见。', + 'author': '', + 'content_url': 'http://mp.weixin.qq.com/s?timestamp=1501143158&src=3&ver=1&signature=B-*tqUrFyO7OqpFeJZwTA7JJtsHpz6BgC8ugyfgpOnyWLtPb85R5Zmu0JuZRbZKG72x4bQjMCcsfA5mC3GSSOPbYd-9tzvTgmroGRmc4Tzk8090KCiEu6EjA0YMHeytWJWpxr51M2FUYQhTWJ01pTmNnXLVAG6Ex6AG52uvvmQA=', + 'copyright_stat': 100, + 'cover': 'http://mmbiz.qpic.cn/mmbiz_jpg/icFYWMxnmxHDYgXNjAle7szYLgQmicbaQlb1eVFuwp2vxEu5eNVwYacaHah2N5W8dKAm725vxv5aM6DFlM59Wftg/0?wx_fmt=jpeg', + 'datetime': 1501072594, + 'fileid': 502326199, + 'main': 1, + 'send_id': 1000000306, + 'source_url': '', + 'title': '绿勤行——不说再见', + 'type': '49' + }, + { + 'abstract': '当时不杂,过往不恋,志愿不老,我们不散!', + 'author': '', + 'content_url': 'http://mp.weixin.qq.com/s?timestamp=1501143158&src=3&ver=1&signature=B-*tqUrFyO7OqpFeJZwTA7JJtsHpz6BgC8ugyfgpOnyWLtPb85R5Zmu0JuZRbZKG72x4bQjMCcsfA5mC3GSSOGUrM*jg*EP1jU-Dyf2CVqmPnOgBiET2wlitek4FcRbXorAswWHm*1rqODcN52NtfKD-OcRTazQS*t5SnJtu3ZA=', + 'copyright_stat': 100, + 'cover': 'http://mmbiz.qpic.cn/mmbiz_jpg/icFYWMxnmxHCoY44nPUXvkSgpZI1LaEsZfkZvtGaiaNW2icjibCp6qs93xLlr9kXMJEP3z1pmQ6TbRZNicHibGzRwh1w/0?wx_fmt=jpeg', + 'datetime': 1500979158, + 'fileid': 502326196, + 'main': 1, + 'send_id': 1000000305, + 'source_url': '', + 'title': '有始有终 | 2016-2017年度环境保护服务部工作总结', + 'type': '49' + }, + ... + ], + 'gzh': { + 'authentication': '南京航空航天大学', + 'headimage': 'http://wx.qlogo.cn/mmhead/Q3auHgzwzM4xV5PgPjK5XoPaaQoxnWJAFicibMvPAnsoybawMBFxua1g/0', + 'introduction': '南航大志愿活动的领跑者,为你提供校内外的志愿资源和精彩消息。', + 'wechat_id': 'nanhangqinggong', + 'wechat_name': '南航青年志愿者' + } + } - ### 解析 首页热门 页 - get_gzh_article_by_hot +- 数据结构 - ![ws_api.get_gzh_article_by_hot(WechatSogouConst.hot_index.food)](https://raw.githubusercontent.com/chyroc/wechatsogou/master/screenshot/get_gzh_article_by_hot.png) +.. code:: python - - 使用 + { + 'gzh': { + 'wechat_name': '', # 名称 + 'wechat_id': '', # 微信id + 'introduction': '', # 简介 + 'authentication': '', # 认证 + 'headimage': '' # 头像 + }, + 'article': [ + { + 'send_id': int, # 群发id,注意不唯一,因为同一次群发多个消息,而群发id一致 + 'datetime': int, # 群发datatime 10位时间戳 + 'type': '', # 消息类型,均是49(在手机端历史消息页有其他类型,网页端最近10条消息页只有49),表示图文 + 'main': int, # 是否是一次群发的第一次消息 1 or 0 + 'title': '', # 文章标题 + 'abstract': '', # 摘要 + 'fileid': int, # + 'content_url': '', # 文章链接 + 'source_url': '', # 阅读原文的链接 + 'cover': '', # 封面图 + 'author': '', # 作者 + 'copyright_stat': int, # 文章类型,例如:原创啊 + }, + ... + ] + } + +解析 首页热门 页 - get_gzh_article_by_hot +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. figure:: https://raw.githubusercontent.com/chyroc/wechatsogou/master/screenshot/get_gzh_article_by_hot.png + :alt: ws_api.get_gzh_article_by_hot(WechatSogouConst.hot_index.food) -In [1]: from pprint import pprint ...: from wechatsogou import -WechatSogouAPI, WechatSogouConst ...: ...: ws\_api = WechatSogouAPI() -...: gzh\_articles = -ws\_api.get\_gzh\_article\_by\_hot(WechatSogouConst.hot\_index.food) -...: for i in gzh\_articles: ...: pprint(i) ...: { 'article': { -'abstract': -'闷热的夏天有什么事情能比吃上凉凉的甜品更惬意的呢?快一起动手做起来吧,简单方便,放冰箱冻一冻,那感觉~橙汁蒸木瓜木瓜1个(300-400克左右),橙子4个,枫糖浆20克(如果家里没有,也可以用蜂蜜、炼乳等代替),椰果适量。做法1.用削皮', -'main\_img': -'http://img01.sogoucdn.com/net/a/04/link?appid=100520033&url=http%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz\_jpg%2Fw9UGwFPia7QTUIadPibgW8OFkqf1ibR40xicKfzofRS0sDpaFp3CG0jkPyQKeXl44TXswztW1SJnic7tmCibjB8rIIGw%2F0%3Fwx\_fmt%3Djpeg', -'open\_id': 'oIWsFty9hHVI9F10amtzx5TOWIq8', 'time': 1501325220, 'title': -'夏日甜品制作方法,不收藏后悔哦!', 'url': -'http://mp.weixin.qq.com/s?src=3×tamp=1501328525&ver=1&signature=n9*oX0k4YbNFhNMsOjIekYrsha44lfBSCbG9jicAbGYrWNN8*\ 48NzpcaHdxwUnC12syY5-ZxwcBfiJlMzdbAwWKlo26EW14w2Ax\ *gjLVlOX-AGXB4443obZ-GK0pw*\ AFZAGZD8sI4AFBZSZpyeaxN4sS7cpynxdIuw6S2h\*--LI=' -}, 'gzh': { 'headimage': -'http://img03.sogoucdn.com/app/a/100520090/oIWsFty9hHVI9F10amtzx5TOWIq8', -'wechat\_name': '甜品烘焙制作坊' } } ... ... \`\`\` + ws_api.get_gzh_article_by_hot(WechatSogouConst.hot_index.food) + +- 使用 + +:: + + In [1]: from pprint import pprint + ...: from wechatsogou import WechatSogouAPI, WechatSogouConst + ...: + ...: ws_api = WechatSogouAPI() + ...: gzh_articles = ws_api.get_gzh_article_by_hot(WechatSogouConst.hot_index.food) + ...: for i in gzh_articles: + ...: pprint(i) + ...: + { + 'article': { + 'abstract': '闷热的夏天有什么事情能比吃上凉凉的甜品更惬意的呢?快一起动手做起来吧,简单方便,放冰箱冻一冻,那感觉~橙汁蒸木瓜木瓜1个(300-400克左右),橙子4个,枫糖浆20克(如果家里没有,也可以用蜂蜜、炼乳等代替),椰果适量。做法1.用削皮', + 'main_img': 'http://img01.sogoucdn.com/net/a/04/link?appid=100520033&url=http%3A%2F%2Fmmbiz.qpic.cn%2Fmmbiz_jpg%2Fw9UGwFPia7QTUIadPibgW8OFkqf1ibR40xicKfzofRS0sDpaFp3CG0jkPyQKeXl44TXswztW1SJnic7tmCibjB8rIIGw%2F0%3Fwx_fmt%3Djpeg', + 'open_id': 'oIWsFty9hHVI9F10amtzx5TOWIq8', + 'time': 1501325220, + 'title': '夏日甜品制作方法,不收藏后悔哦!', + 'url': 'http://mp.weixin.qq.com/s?src=3×tamp=1501328525&ver=1&signature=n9*oX0k4YbNFhNMsOjIekYrsha44lfBSCbG9jicAbGYrWNN8*48NzpcaHdxwUnC12syY5-ZxwcBfiJlMzdbAwWKlo26EW14w2Ax*gjLVlOX-AGXB4443obZ-GK0pw*AFZAGZD8sI4AFBZSZpyeaxN4sS7cpynxdIuw6S2h*--LI=' + }, + 'gzh': { + 'headimage': 'http://img03.sogoucdn.com/app/a/100520090/oIWsFty9hHVI9F10amtzx5TOWIq8', + 'wechat_name': '甜品烘焙制作坊' + } + } + ... + ... - 数据结构 - .. code:: python - - { - 'gzh': { - 'headimage': str, # 公众号头像 - 'wechat_name': str, # 公众号名称 - }, - 'article': { - 'url': str, # 文章临时链接 - 'title': str, # 文章标题 - 'abstract': str, # 文章摘要 - 'time': int, # 推送时间,10位时间戳 - 'open_id': str, # open id - 'main_img': str # 封面图片 - } - } +.. code:: python + + { + 'gzh': { + 'headimage': str, # 公众号头像 + 'wechat_name': str, # 公众号名称 + }, + 'article': { + 'url': str, # 文章临时链接 + 'title': str, # 文章标题 + 'abstract': str, # 文章摘要 + 'time': int, # 推送时间,10位时间戳 + 'open_id': str, # open id + 'main_img': str # 封面图片 + } + } 获取关键字联想词 ~~~~~~~~~~~~~~~~ - 使用 - :: - - In [1]: import wechatsogou - ...: - ...: ws_api =wechatsogou.WechatSogouAPI() - ...: ws_api.get_sugg('高考') - ...: - Out[1]: - ['高考e通', - '高考专业培训', - '高考地理俱乐部', - '高考志愿填报咨讯', - '高考报考资讯', - '高考教育', - '高考早知道', - '高考服务志愿者', - '高考机构', - '高考福音'] +:: + + In [1]: import wechatsogou + ...: + ...: ws_api =wechatsogou.WechatSogouAPI() + ...: ws_api.get_sugg('高考') + ...: + Out[1]: + ['高考e通', + '高考专业培训', + '高考地理俱乐部', + '高考志愿填报咨讯', + '高考报考资讯', + '高考教育', + '高考早知道', + '高考服务志愿者', + '高考机构', + '高考福音'] - 数据结构 diff --git a/test/test_api.py b/test/test_api.py index 461090c..724c872 100644 --- a/test/test_api.py +++ b/test/test_api.py @@ -26,7 +26,7 @@ def setUp(self): def test_search_gzh_real(self): gzh_list = ws_api.search_gzh(gaokao_keyword, identify_image_callback=self.identify_image_callback_sogou) - assert_equal(10, len(gzh_list)) + assert_greater_equal(len(gzh_list), 8) assert_true(any(gaokao_keyword in i['wechat_name'] for i in gzh_list)) assert_true(any(i['open_id'] != '' for i in gzh_list)) diff --git a/test/test_structuring.py b/test/test_structuring.py index e641864..6b9e320 100644 --- a/test/test_structuring.py +++ b/test/test_structuring.py @@ -76,7 +76,7 @@ def test_get_gzh_by_search(self): u'tjsjgk', u'koogaokao'], wechat_ids) - assert_equal([0, 0, 0, 0, 0, 0, 0, 0, 0, 0], post_perms) + assert_equal([-1, -1, -1, -1, -1, -1, -1, -1, -1, -1], post_perms) assert_equal( ['这里是山东最权威最专业的高考交流平台,由山东商报徐玉芹教育工作室独家运作.本平台与山东商报高考交流群互为依托,为山东考生和家长提供最及时、最准确的高考政策及信息解读,以及一流的填报志愿咨询服务.合作...', '定期推送高三家长关注的优秀家长经验交流、志愿填报技巧、考生心理辅导方法、考前营养搭配等诸多优质内容;为家长搭建交流互动平台.', diff --git a/wechatsogou/structuring.py b/wechatsogou/structuring.py index 88db7a0..fc76104 100644 --- a/wechatsogou/structuring.py +++ b/wechatsogou/structuring.py @@ -7,11 +7,13 @@ from lxml import etree from lxml.etree import XML +import requests from wechatsogou.tools import get_elem_text, list_or_empty, replace_html, get_first_of_element from wechatsogou.five import str_to_bytes find_article_json_re = re.compile('var msgList = (.*?)}}]};') +get_post_view_perm = re.compile('') class WechatSogouStructuring(object): @@ -21,6 +23,21 @@ def __handle_content_url(content_url): return ('http://mp.weixin.qq.com{}'.format( content_url) if 'http://mp.weixin.qq.com' not in content_url else content_url) if content_url else '' + @staticmethod + def __get_post_view_perm(text): + result = get_post_view_perm.findall(text) + if not result or len(result) < 1: + return None + + r = requests.get('http://weixin.sogou.com{}'.format(result[0])) + if not r.ok: + return None + + if r.json().get('code') != 'success': + return None + + return r.json().get('msg') + @staticmethod def get_gzh_by_search(text): """从搜索公众号获得的文本 提取公众号信息 @@ -40,11 +57,14 @@ def get_gzh_by_search(text): 'wechat_name': '', # 名称 'wechat_id': '', # 微信id 'post_perm': '', # 最近一月群发数 + 'view_perm': '', # 最近一月阅读量 'qrcode': '', # 二维码 'introduction': '', # 介绍 'authentication': '' # 认证 } """ + post_view_perms = WechatSogouStructuring.__get_post_view_perm(text) + page = etree.HTML(text) lis = page.xpath('//ul[@class="news-list2"]/li') relist = [] @@ -53,7 +73,6 @@ def get_gzh_by_search(text): headimage = get_first_of_element(li, 'div/div[1]/a/img/@src') wechat_name = get_elem_text(get_first_of_element(li, 'div/div[2]/p[1]')) info = get_elem_text(get_first_of_element(li, 'div/div[2]/p[2]')) - post_perm = 0 # TODO 月发文 qrcode = get_first_of_element(li, 'div/div[3]/span/img[1]/@src') introduction = get_elem_text(get_first_of_element(li, 'dl[1]/dd')) authentication = get_first_of_element(li, 'dl[2]/dd/text()') @@ -63,11 +82,20 @@ def get_gzh_by_search(text): 'headimage': headimage, 'wechat_name': wechat_name.replace('red_beg', '').replace('red_end', ''), 'wechat_id': info.replace('微信号:', ''), - 'post_perm': post_perm, 'qrcode': qrcode, 'introduction': introduction.replace('red_beg', '').replace('red_end', ''), - 'authentication': authentication + 'authentication': authentication, + 'post_perm': -1, + 'view_perm': -1, }) + + if post_view_perms: + for i in relist: + if i['open_id'] in post_view_perms: + post_view_perm = post_view_perms[i['open_id']].split(',') + if len(post_view_perm) == 2: + i['post_perm'] = int(post_view_perm[0]) + i['view_perm'] = int(post_view_perm[1]) return relist @staticmethod