Skip to content

Commit 5430e33

Browse files
committed
Add app.
1 parent 98a5d74 commit 5430e33

File tree

4 files changed

+129
-15
lines changed

4 files changed

+129
-15
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,3 +67,4 @@ target/
6767

6868
qr.png
6969
/*.jpg
70+
*.ini

README.md

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ Web微信协议参考资料:
1010

1111
[qwx: WeChat Qt frontend 微信Qt前端](https://github.com/xiangzhai/qwx)
1212

13-
## 环境与依赖
13+
## 1 环境与依赖
1414

1515
目前只能运行于Python 2环境 。
1616
**wxBot** 用到了Python **requests** , **pypng** , 以及 **pyqrcode** 库,使用之前需要安装这三个库:
@@ -21,10 +21,13 @@ pip install pyqrcode
2121
pip install pypng
2222
```
2323

24-
## 快速开发
25-
### 代码
24+
## 2 快速开发
25+
### 2.1 代码
26+
27+
利用 **wxBot** 最简单的方法就是继承WXBot类并实现handle_msg_all或者schedule函数,然后实例化子类并run。
28+
29+
以下的代码对所有来自好友的文本消息回复 "hi", 并不断向好友tb发送"schedule"。
2630

27-
利用 **wxBot** 最简单的方法就是继承WXBot类并实现handle_msg_all或者schedule函数,然后实例化子类并run,如下的代码对所有来自好友的文本消息回复 "hi", 并不断向好友tb发送"schedule"。
2831
handle_msg_all函数用于处理收到的每条消息,而schedule函数可以做一些任务性的事情(例如不断向好友推送信息或者一些定时任务)。
2932

3033
```python
@@ -53,44 +56,44 @@ if __name__ == '__main__':
5356

5457
```
5558

56-
### 运行
59+
### 2.2 运行
5760

5861
直接用python运行代码(如运行测试代码test.py):
5962

6063
``` python
6164
python test.py
6265
```
6366

64-
### 登录微信
67+
### 2.3 登录微信
6568

6669
程序运行之后,会在当前目录下生成二维码图片文件 qr.png ,用微信扫描此二维码并按操作指示确认登录网页微信。
6770

6871
如果运行在Linux下,还可以通过设置WXBot对象的conf['qr']为'tty'的方式直接在终端打印二维码(此方法只能在Linux终端下使用),效果如下:
6972

7073
![login_on_ubuntu](img/login_on_ubuntu.png)
7174

72-
## 效果展示
75+
## 3 效果展示
7376

7477
测试代码test.py的运行效果:
7578

7679
![向机器人发送消息](img/send_msg.png)
7780

7881
![后台](img/backfront.jpg)
7982

80-
## 接口
81-
### handle_msg_all
83+
## 4 接口
84+
### 4.1 handle_msg_all
8285

8386
handle_msg_all函数的参数msg是代表一条消息的字典。字段的内容为:
8487

8588
| 字段名 | 字段内容 |
8689
| ----- | --- |
87-
| msg_type_id | 整数,消息类型,具体解释可以查看消息类型表 |
90+
| msg_type_id | 整数,消息类型,具体解释可以查看 **消息类型表** |
8891
| msg_id | 字符串,消息id |
89-
| content | 字典,消息内容,具体含有的字段请参考消息类型表,一般含有type(数据类型)与data(数据内容)字段,type与data的对应关系可以参考数据类型表 |
92+
| content | 字典,消息内容,具体含有的字段请参考 **消息类型表** ,一般含有type(数据类型)与data(数据内容)字段,type与data的对应关系可以参考 **数据类型表** |
9093
| user | 字典,消息来源,字典包含name(发送者名称,如果是群则为群名称,如果为微信号,有备注则为备注名,否则为微信号或者群昵称)字段与id(发送者id)字段,都是字符串 |
9194

9295

93-
消息类型表
96+
### 4.2 消息类型表
9497

9598
| 类型号 | 消息类型 | content |
9699
| ----- | --- | ------ |
@@ -104,7 +107,7 @@ handle_msg_all函数的参数msg是代表一条消息的字典。字段的内容
104107
| 99 | 未知账号消息 | 无意义,可以忽略 |
105108

106109

107-
数据类型表
110+
### 4.3 数据类型表
108111

109112
| type | 数据类型 | data |
110113
| ---- | ---- | ------ |
@@ -122,7 +125,7 @@ handle_msg_all函数的参数msg是代表一条消息的字典。字段的内容
122125
| 12 | 未知类型 | 字符串,未解析的xml字符串 |
123126

124127

125-
### WXBot对象属性
128+
### 4.4 WXBot对象属性
126129

127130
WXBot对象在登录并初始化之后,含有以下的可用数据:
128131

@@ -134,7 +137,9 @@ WXBot对象在登录并初始化之后,含有以下的可用数据:
134137
| special_list | 特殊账号列表 |
135138
| session | WXBot与WEB微信服务器端交互所用的requests Session对象 |
136139

137-
WXBot对象还含有一些可以利用的方法:
140+
### 4.5 WXBot对象方法
141+
142+
WXBot对象还含有一些可以利用的方法
138143

139144
| 方法 | 描述 |
140145
| ---- | --- |

bot.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
#!/usr/bin/env python
2+
# coding: utf-8
3+
4+
from wxbot import *
5+
import ConfigParser
6+
import json
7+
8+
9+
class TulingWXBot(WXBot):
10+
def __init__(self):
11+
WXBot.__init__(self)
12+
13+
self.tuling_key = ""
14+
15+
try:
16+
cf = ConfigParser.ConfigParser()
17+
cf.read('conf.ini')
18+
self.tuling_key = cf.get('main', 'key')
19+
except Exception:
20+
pass
21+
print 'tuling_key:', self.tuling_key
22+
23+
def tuling_auto_reply(self, uid, msg):
24+
if self.tuling_key:
25+
url = "http://www.tuling123.com/openapi/api"
26+
user_id = uid.replace('@', '')[:30]
27+
body = {'key': self.tuling_key, 'info': msg.encode('utf8'), 'userid': user_id}
28+
r = requests.post(url, data=body)
29+
respond = json.loads(r.text)
30+
result = ''
31+
if respond['code'] == 100000:
32+
result = respond['text'].replace('<br>', ' ')
33+
elif respond['code'] == 200000:
34+
result = respond['url']
35+
else:
36+
result = respond['text'].replace('<br>', ' ')
37+
38+
return result
39+
else:
40+
return u"知道啦"
41+
42+
def handle_msg_all(self, msg):
43+
if msg['msg_type_id'] == 4 and msg['content']['type'] == 0: # text message from contact
44+
self.send_msg_by_uid(self.tuling_auto_reply(msg['user']['id'], msg['content']['data']), msg['user']['id'])
45+
elif msg['msg_type_id'] == 3: # group message
46+
if msg['content']['data'].find('@') >= 0: # someone @ another
47+
my_names = self.get_group_member_name(msg['user']['id'], self.user['UserName'])
48+
if 'NickName' in self.user and len(self.user['NickName']) > 0:
49+
my_names['nickname2'] = self.user['NickName']
50+
if 'RemarkName' in self.user and len(self.user['RemarkName']) > 0:
51+
my_names['remark_name2'] = self.user['RemarkName']
52+
is_at_me = False
53+
text_msg = ''
54+
for _ in my_names:
55+
if msg['content']['data'].find('@'+my_names[_]) >= 0:
56+
is_at_me = True
57+
text_msg = msg['content']['data'].replace('@'+my_names[_], '').strip()
58+
break
59+
if is_at_me: # someone @ me
60+
snames = self.get_group_member_name(msg['user']['id'], msg['content']['user']['id'])
61+
src_name = ''
62+
if 'display_name' in snames:
63+
src_name = snames['display_name']
64+
elif 'nickname' in snames:
65+
src_name = snames['nickname']
66+
elif 'remark_name' in snames:
67+
src_name = snames['remark_name']
68+
69+
if src_name != '':
70+
reply = '@' + src_name + ' '
71+
if msg['content']['type'] == 0: # text message
72+
reply += self.tuling_auto_reply(msg['content']['user']['id'], text_msg)
73+
else:
74+
reply += u"对不起,只认字,其他杂七杂八的我都不认识,,,Ծ‸Ծ,,"
75+
self.send_msg_by_uid(reply, msg['user']['id'])
76+
77+
78+
def main():
79+
bot = TulingWXBot()
80+
bot.DEBUG = True
81+
bot.conf['qr'] = 'png'
82+
bot.run()
83+
84+
85+
if __name__ == '__main__':
86+
main()

wxbot.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,28 @@ def batch_get_group_members(self):
124124
group_members[gid] = members
125125
return group_members
126126

127+
def get_group_member_name(self, gid, uid):
128+
"""
129+
Get name of a member in a group.
130+
:param gid: group id
131+
:param uid: group member id
132+
:return: names like {"display_name": "test_user", "nickname": "test", "remark_name": "for_test" }
133+
"""
134+
if gid not in self.group_members:
135+
return None
136+
group = self.group_members[gid]
137+
for member in group:
138+
if member['UserName'] == uid:
139+
names = {}
140+
if 'RemarkName' in member:
141+
names['remark_name'] = member['RemarkName']
142+
if 'NickName' in member:
143+
names['nickname'] = member['NickName']
144+
if 'DisplayName' in member:
145+
names['display_name'] = member['DisplayName']
146+
return names
147+
return None
148+
127149
def get_account_info(self, uid):
128150
if uid in self.account_info:
129151
return self.account_info[uid]

0 commit comments

Comments
 (0)