├── README.md ├── index.py └── templates └── reply_text.xml /README.md: -------------------------------------------------------------------------------- 1 | Wechat-Python-Template 2 | ======== 3 | 4 | 将此文件夹放到树莓派中,更改`index.py`中的`your_token`为你的`token` 5 | 6 | 在文件夹目录内,输入命令执行:`sudo python index.py 80` 7 | 8 | 80为绑定到80端口上,微信公众平台目前仅支持80端口 9 | 10 | Ps:如果无法执行,可能需要更改文件权限:`chmod +x index.py` 11 | 12 | 需要安装`webpy`和`python-lxml` 13 | 14 | ``` bash 15 | 16 | git clonegit://github.com/webpy/webpy.git 17 | 18 | ln -s `pwd`/webpy/web 19 | 20 | cd /root/webpy 21 | 22 | sudo python setup.py install 23 | 24 | sudo apt-get install python-lxml 25 | 26 | ``` 27 | 28 | 程序执行后,在微信公众平台的接口配置界面分别输入`你的ip`或者`域名`及`token`: 29 | 30 | `http://你的ip或域名/weixin` 31 | 32 | 然后输入刚才配置程序时更改的自己的`token` 33 | 34 | 点击提交,提示配置成功。 35 | 36 | 在微信上对此公众平台测试号发送消息,微信可以返回你发送的消息。 37 | 38 | 至此,微信平台与树莓派的对接结束 39 | -------------------------------------------------------------------------------- /index.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | 4 | import os 5 | import web 6 | import time 7 | import hashlib 8 | from lxml import etree 9 | 10 | 11 | urls = ( 12 | '/weixin', 'WeixinInterface' 13 | ) 14 | 15 | 16 | def _check_hash(data): 17 | # sha1加密算法 18 | signature = data.signature 19 | timestamp = data.timestamp 20 | nonce = data.nonce 21 | # 自己的token 22 | token = "your_token" # 这里改写你在微信公众平台里输入的token 23 | # 字典序排序 24 | list = [token, timestamp, nonce] 25 | list.sort() 26 | sha1 = hashlib.sha1() 27 | map(sha1.update, list) 28 | hashcode = sha1.hexdigest() 29 | # 如果是来自微信的请求,则回复True 30 | if hashcode == signature: 31 | return True 32 | return False 33 | 34 | 35 | class WeixinInterface: 36 | 37 | def __init__(self): 38 | self.app_root = os.path.dirname(__file__) 39 | self.templates_root = os.path.join(self.app_root, 'templates') 40 | self.render = web.template.render(self.templates_root) 41 | 42 | def GET(self): 43 | # 获取输入参数 44 | data = web.input() 45 | if _check_hash(data): 46 | return data.echostr 47 | 48 | def POST(self): 49 | str_xml = web.data() # 获得post来的数据 50 | xml = etree.fromstring(str_xml) # 进行XML解析 51 | content = xml.find("Content").text # 获得用户所输入的内容 52 | msgType = xml.find("MsgType").text 53 | fromUser = xml.find("FromUserName").text 54 | toUser = xml.find("ToUserName").text 55 | return self.render.reply_text(fromUser, toUser, int(time.time()), u"接收到的文字:" + content) 56 | 57 | 58 | application = web.application(urls, globals()) 59 | if __name__ == "__main__": 60 | application.run() 61 | -------------------------------------------------------------------------------- /templates/reply_text.xml: -------------------------------------------------------------------------------- 1 | $def with (toUser,fromUser,createTime,content) 2 | 3 | 4 | 5 | $createTime 6 | 7 | 8 | --------------------------------------------------------------------------------