From 30eaebe4343ddb5b74929959a8dcdf201c10f877 Mon Sep 17 00:00:00 2001 From: LittleCoder Date: Wed, 8 Feb 2017 16:33:48 +0800 Subject: [PATCH] Fix list bug of docs --- docs/intro/contact.md | 7 +++++++ docs/intro/handler.md | 1 + docs/intro/login.md | 2 ++ docs/intro/messages.md | 1 + docs/intro/reply.md | 5 +++++ docs/tutorial/tutorial0.md | 2 ++ docs/tutorial/tutorial1.md | 8 ++++++++ docs/tutorial/tutorial2.md | 9 +++++++-- itchat/components/messages.py | 1 - 9 files changed, 33 insertions(+), 3 deletions(-) diff --git a/docs/intro/contact.md b/docs/intro/contact.md index b18aa168..77aebd23 100644 --- a/docs/intro/contact.md +++ b/docs/intro/contact.md @@ -1,4 +1,5 @@ 在使用个人微信的过程当中主要有三种账号需要获取,分别为: + * 好友 * 公众号 * 群聊 @@ -14,6 +15,7 @@ itchat为这三种账号都提供了整体获取方法与搜索方法。 ## 好友 好友的获取方法为`get_friends`,将会返回完整的好友列表。 + * 其中每个好友为一个字典 * 列表的第一项为本人的账号信息 * 传入update键为True将可以更新好友列表并返回 @@ -40,6 +42,7 @@ itchat.search_friends(name='LittleCoder机器人', wechatAccount='littlecodersh' ``` 更新用户信息的方法为`update_friend`。 + * 该方法需要传入用户的`UserName`,返回指定用户的最新信息 * 同样也可以传入`UserName`组成的列表,那么相应的也会返回指定用户的最新信息组成的列表 @@ -50,6 +53,7 @@ memberList = itchat.update_friend('@abcdefg1234567') ## 公众号 公众号的获取方法为`get_mps`,将会返回完整的公众号列表。 + * 其中每个公众号为一个字典 * 传入update键为True将可以更新公众号列表并返回 @@ -71,6 +75,7 @@ itchat.search_mps(userName='@abcdefg1234567', name='LittleCoder') ## 群聊 群聊的获取方法为`get_chatrooms`,将会返回完整的群聊列表。 + * 其中每个群聊为一个字典 * 传入update键为True将可以更新群聊列表并返回通讯录中保存的群聊列表 * 群聊列表为后台自动更新,如果中途意外退出存在极小的概率产生本地群聊消息与后台不同步 @@ -93,6 +98,7 @@ itchat.search_chatrooms(userName='@@abcdefg1234567', name='LittleCoder') ``` 群聊用户列表的获取方法为`update_chatroom`。 + * 同样,如果想要更新该群聊的其他信息也可以用该方法 * 群聊在首次获取中不会获取群聊的用户列表,所以需要调用该命令才能获取群聊的成员 * 该方法需要传入群聊的`UserName`,返回特定群聊的详细信息 @@ -103,6 +109,7 @@ memberList = itchat.update_chatroom('@@abcdefg1234567', detailedMember=True) ``` 创建群聊、增加、删除群聊用户的方法如下所示: + * 由于之前通过群聊检测是否被好友拉黑的程序,目前这三个方法都被严格限制了使用频率 * 删除群聊需要本账号为群管理员,否则会失败 * 将用户加入群聊有直接加入与发送邀请,通过`useInvitation`设置 diff --git a/docs/intro/handler.md b/docs/intro/handler.md index 6df426a3..128375cf 100644 --- a/docs/intro/handler.md +++ b/docs/intro/handler.md @@ -56,6 +56,7 @@ def download_files(msg): ``` 值得注意的是,群消息增加了三个键值: + * isAt: 判断是否@本号 * ActualNickName: 实际NickName * Content: 实际Content diff --git a/docs/intro/login.md b/docs/intro/login.md index f0d9ff1c..5785d9fa 100644 --- a/docs/intro/login.md +++ b/docs/intro/login.md @@ -5,6 +5,7 @@ 一般而言,我们都会在完成消息的注册后登陆。 当然这里需要特别强调的是三点,分别是短时间关闭重连、命令行二维码与自定义登陆内容。 + * itchat提供了登陆状态暂存,关闭程序后一定时间内不需要扫码即可登录。 * 为了方便在无图形界面使用itchat,程序内置了命令行二维码的显示。 * 如果你需要就登录状态就一些修改(例如更改提示语、二维码出现后邮件发送等)。 @@ -80,6 +81,7 @@ itchat.auto_login(enableCmdQR=-1) 如果需要控制登录的过程,可以阅读下面的内容。 同时itchat也提供了登陆所需的每一步的方法,登陆的过程按顺序为: + * 获取二维码uuid * 获取二维码 * 判断是否已经登陆成功 diff --git a/docs/intro/messages.md b/docs/intro/messages.md index 1c4a7bf3..3ef6be98 100644 --- a/docs/intro/messages.md +++ b/docs/intro/messages.md @@ -286,6 +286,7 @@ Content: ``` itchat增加了三个群聊相关的键值: + * isAt: 判断是否@本号 * ActualNickName: 实际NickName * Content: 实际Content diff --git a/docs/intro/reply.md b/docs/intro/reply.md index 64a5fb99..a732a73b 100644 --- a/docs/intro/reply.md +++ b/docs/intro/reply.md @@ -3,6 +3,7 @@ itchat提供五种回复方法,建议直接使用`send`方法。 ## send方法 + * 方法: ```python send(msg='Text Message', toUserName=None) @@ -27,6 +28,7 @@ itchat.send('@vid@%s' % 'demo.mp4') ``` ## send_msg方法 + * 方法: ```python send_msg(msg='Text Message', toUserName=None) @@ -45,6 +47,7 @@ itchat.send_msg('Hello world') ``` ## send_file方法 + * 方法: ```python send_file(fileDir, toUserName=None) @@ -65,6 +68,7 @@ itchat.send_file('xlsx.xlsx') ``` ## send_img方法 + * 方法: ```python send_img(fileDir, toUserName=None) @@ -85,6 +89,7 @@ itchat.send_img('gz.gif') ``` ## send_video方法 + * 方法: ```python send_video(fileDir, toUserName=None) diff --git a/docs/tutorial/tutorial0.md b/docs/tutorial/tutorial0.md index 3a77552b..e6889d43 100644 --- a/docs/tutorial/tutorial0.md +++ b/docs/tutorial/tutorial0.md @@ -18,6 +18,7 @@ ### 3. 课程知识点 本课程项目完成过程中将学习: + * 微信消息的基本获取与处理 * 微信消息的指定发送 @@ -105,6 +106,7 @@ itchat.run() 其中第三行即注册的操作,通过装饰符将`print_content`注册为处理文本消息的函数。 微信有各种类型的数据,例如图片、语音、名片、分享等,也对应不同的注册参数: + * 图片对应`itchat.content.PICTURE` * 语音对应`itchat.content.RECORDING` * 名片对应`itchat.content.CARD` diff --git a/docs/tutorial/tutorial1.md b/docs/tutorial/tutorial1.md index 3a49a289..7fabfc9c 100644 --- a/docs/tutorial/tutorial1.md +++ b/docs/tutorial/tutorial1.md @@ -35,6 +35,7 @@ Python与基本的网络基础都不困难,所以即使没有这方面基础 本文是这一教程的第一部分,需要配置抓包与Python环境。 本教程使用的环境如下: + * Windows 8.1 * Python 2.7.11 (安装Image, requests) * Wireshark 2.0.2 @@ -90,12 +91,14 @@ Wireshark是常见的抓包软件,这里通过一些配置抓取微信网页 我们发现直接在浏览器中获取了一张二维码,所以这很有可能就是上述一、二步的过程了。 那么我们是向服务器提供了哪些数据获取了二维码呢? + * 每次我们登录的二维码会变化,且没有随二维码传回的标识,所以我们肯定提供了每次不同的信息 * 网址中最后一部分看起来比较像标识:https://login.weixin.qq.com/qrcode/4ZtmDT6OPg== * 为了进一步验证猜想,再次抓包,发现类似292号包的请求url仅最后一部分存在区别 * 所以我们提供了`4ZtmDT6Opg==`获取到了这一二维码。 那么这一标识是随机生成的还是服务器获取的呢? + * 从最近的包开始分析服务器传回的数据(Source是服务器地址的数据),发现就在上一行,286号包有我们感兴趣的数据。 * 打开这个包,可以看到其返回的数据为`window.QRLogin.code = 200; window.QRLogin.uuid = "4ZtmDT6OPg==";`(见下方截图) * 显然导致服务器返回这一请求的284号包就是我们获取标识(下称uuid)所需要伪造的包。 @@ -103,6 +106,7 @@ Wireshark是常见的抓包软件,这里通过一些配置抓取微信网页 ![uuid返回包](http://7xrip4.com1.z0.glb.clouddn.com/ItChat%2FTutorial%2Fuuid%E8%BF%94%E5%9B%9E%E5%8C%85.png) 那么284号包需要传递给服务器哪些数据? + * 这是一个get请求,所以我们分析其请求的url:`https://login.weixin.qq.com/jslogin?appid=wx782c26e4c19acffb&redirect_uri=https%3A%2F%2Fwx.qq.com%2Fcgi-bin%2Fmmwebwx-bin%2Fwebwxnewloginpage&fun=new&lang=en_US&_=1453725386008`。 * 可以发现需要给出五个量`appid, redirect_uri, fun, lang, _`。 * 其中除了appid其余都显然是固定的量(_的格式显然为时间戳)。 @@ -113,6 +117,7 @@ Wireshark是常见的抓包软件,这里通过一些配置抓取微信网页 3,4部的最显著特征是在扫描成功以后会获取扫描用的微信号的头像。 我们还是首先大致的浏览一下服务器返回的数据包,试图找到包含图片的数据包。 + * 从325号包(微信头像肯定在二维码之后获取)开始浏览。 * 我们发现338号包中包含一个base64加密的图片,[解压](http://www.vgot.net/test/image2base64.php?)后可以看到自己的头像。 * 所以这个数据包就是服务器返回的扫描成功的数据包了,而前面那部分`window.code=201`显然就是表示状态的代码。(见下方截图) @@ -122,6 +127,7 @@ Wireshark是常见的抓包软件,这里通过一些配置抓取微信网页 ![微信扫码状态码](http://7xrip4.com1.z0.glb.clouddn.com/ItChat%2FTutorial%2F%E5%BE%AE%E4%BF%A1%E6%89%AB%E7%A0%81%E7%8A%B6%E6%80%81%E7%A0%81.png) 我们很容易的找到了在登录过程当中不断出现的请求,那么要怎么模拟呢? + * 首先这是一个简单的get请求,url为:https://login.weixin.qq.com/cgi-bin/mmwebwx-bin/login?loginicon=true&uuid=4ZtmDT6OPg==&tip=1&r=-2026440414&_=1453725386009 * 可以发现需要给出五个量`loginicon, uuid, tip, r, _` * 通过多次抓包发现除了r以外都可以找到简单的规律,那么r的规律等待模拟时再尝试处理 @@ -297,6 +303,7 @@ print('Log in as %s'%dic['User']['NickName']) ``` 这里做一个简单的小结: + * 首先需要用python初始化一个session,否则登录过程的存储将会比较麻烦。 * 模拟数据包的时候首先区分get与post请求,对应session的get与post方法。 * get的数据为url后半部分的内容,post是数据包最后一部分的内容。 @@ -309,6 +316,7 @@ print('Log in as %s'%dic['User']['NickName']) 到现在为止我展示了一个完整的抓包、分析、模拟的过程完成了模拟登陆,其他一些事情其实也都是类似的过程,想清楚每一步要做些什么即可。 这里用到的软件都只介绍了最简单的一些方法,进一步的内容这里给出一些建议: + * wireshark可以直接浏览官方文档,有空可以做一个了解。 * requests包的使用通过搜索引擎即可,特殊的功能建议直接阅读源码。 diff --git a/docs/tutorial/tutorial2.md b/docs/tutorial/tutorial2.md index 05f40541..2bae6c77 100644 --- a/docs/tutorial/tutorial2.md +++ b/docs/tutorial/tutorial2.md @@ -23,6 +23,7 @@ Python基础并不困难,所以即使没有这方面基础辅助搜索引擎 ## 简单成果展示 完成了本文的学习,你将会完成三个小项目:(出于方便二次阅读,括号中都放上了源码链接) + * 通过微信操作的音乐播放器([源码][demo-pcmusicviawechat]) * 消息内容与对象可自定义的消息群发助手([源码][demo-wechatsmartwish]) * 特定好友删除检测([源码][demo-wechatcheckfriend]) @@ -36,6 +37,7 @@ Python基础并不困难,所以即使没有这方面基础辅助搜索引擎 本文是这一教程的第二部分,需要基本的pip可用的Python环境。 本教程使用的环境如下: + * Windows 8.1 (其他平台也可用) * Python 2 or 3 * 微信版本6.3.25 @@ -80,6 +82,7 @@ def close_music(): ``` 而微信的调用可以通过itchat包简单的完成,这里要注意的是: + * 有些账号无法与自己通信,所以我们选择与文件传输助手(filehelper)通信 * 为了防止对于其他消息的响应,我们在第一行过滤了无关信息 * itchat.run的选项分别为允许热拔插,方便调试 @@ -124,6 +127,7 @@ itchat对常用功能都做好了封装,调用还是非常容易的。 当然,稍加操作,一切皆有可能。 例如在消息中加入昵称: + * 通过`get_friends`方法可以轻松获取所有的好友(好友首位是自己) * 基于不同的好友可以发送不同的消息 * 这条程序运行后是真的会发消息出去,如果只是演示目的,把`itchat.send`改为`print`即可 @@ -147,6 +151,7 @@ for friend in friendList: 又例如给特定的人发送特定的消息。 我们这里通过群聊实现,划定一个群聊,在群聊内则私信发送祝福。 + * 如果仅是创建群聊不说话,对方是不会有提示的 * 群聊如果不**保存到通讯录**,是无法在各设备之间同步的(所以itchat也无法读取到) * 群聊在被获取的时候不会自带用户列表,所以需要使用`update_chatroom`更新用户列表 @@ -189,7 +194,7 @@ itchat获取微信可以获取到的各种内容也都非常方便。 ## 好友删除检测 -![pic][demo-wechatcheckfriend] +![pic][demo-wechatcheckfriend-0] 有时候我们会想知道某个好友有没有删除自己或者把自己拉入黑名单。 @@ -283,4 +288,4 @@ EOF [demo-wechatcheckfriend]: https://gist.github.com/littlecodersh/3fef7d2afb2d502e4735be083c9f79e1 [demo-pcmusicviawechat-0]: http://7xrip4.com1.z0.glb.clouddn.com/ItChat/Tutorial/2/demo-pcmusicviawechat-0.png?imageView/2/w/200/ [demo-pcmusicviawechat-1]: http://7xrip4.com1.z0.glb.clouddn.com/ItChat/Tutorial/2/demo-pcmusicviawechat-1.png?imageView/2/w/200/ -[demo-wechatcheckfriend]: http://7xrip4.com1.z0.glb.clouddn.com/ItChat/Tutorial/2/demo-wechatcheckfriend.png?imageView/2/w/200/ +[demo-wechatcheckfriend-0]: http://7xrip4.com1.z0.glb.clouddn.com/ItChat/Tutorial/2/demo-wechatcheckfriend.png?imageView/2/w/200/ diff --git a/itchat/components/messages.py b/itchat/components/messages.py index a1ca6b0d..46e36f2f 100644 --- a/itchat/components/messages.py +++ b/itchat/components/messages.py @@ -198,7 +198,6 @@ def produce_group_chat(core, msg): content = msg['Content'] chatroomUserName = msg['ToUserName'] else: - logger.warning('New structure of groupchat detected, please report a bug.') return chatroom = core.storageClass.search_chatrooms(userName=chatroomUserName) member = utils.search_dict_list((chatroom or {}).get(