From b43d36ce24ac92205d7395c438080b945fe4a4c6 Mon Sep 17 00:00:00 2001 From: gateray <437925289@qq.com> Date: Mon, 9 Oct 2017 20:25:24 +0800 Subject: [PATCH 1/6] commit --- local_settings.py.example | 140 +++++++++++++++++++------------------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/local_settings.py.example b/local_settings.py.example index 550b138..9ba57cc 100644 --- a/local_settings.py.example +++ b/local_settings.py.example @@ -1,70 +1,70 @@ -#!/usr/bin/env python -# coding: utf-8 - -address = "0.0.0.0" #服务器的监听地址 -port = 8000 #服务器的监听端口 -apiKey = "replace_your_key" #apikey,开启签名时使用,保存在服务器本地,不对外公开 -enableSignature = False #是否开启签名 -signatureTimeOutSecs = 60 #设置签名有效期 -signatureMethod = "sha256" #设置签名的方法 -signatureSupportList = ("md5", "sha1", "sha128", "sha224", "sha256", "sha384", "sha512") #设置签名支持列表 - -#redis连接配置,使用微信企业号发送消息时启用,用于保存调用微信接口时使用的access_token -redis = { - "host": "127.0.0.1", - "port": 6379, - "db": 0, -} -#指定保存access_token的key -redisKeys = { - "WXQY_ACCESS_TOKEN": "msgsender:wxqy:actoken", -} -#注册微信企业号后得到的字段 -qywx = { - "baseUrl": "https://qyapi.weixin.qq.com/cgi-bin", - "corpid": "wx17000000000000", #根据自己的企业号修改 - "corpsecret": "xxxxxxxxxxxxxxxxxxxx", #根据自己的企业号修改 - "agentid": "00000000", #根据自己的企业号修改 - "timeout": 5, #设置调用超时时间 -} -#使用邮件发送消息时启用 -mail = { - "defaultSign": ''' -

-
- 研发中心 
- Gateray
- ------------------------
- Mobile:10086   
- QQ:437925289
- E-MAIL: - 437925289@qq.com -

------------------------
- xxxxxxxxx有限公司
- www.xxx.com  -
''', #设置邮件签名 - "fromAddress": "me@example.com", #发送人邮箱 - "username": "myname", #邮箱登录名 - "password": "mypass", #邮箱密码 - "toAddressList": ["437925289@qq.com", "someone@qq.com"], #收件人邮箱列表 - "ccAddressList": [], #抄送人列表 - "smtpServer": "smtp.example.com", #邮件发送服务器地址 - "smtpPort": 25, #邮件发送服务器端口 -} -#使用玄武短信接口发送消息时启用 -sms = { - "baseUrl": "http://211.147.239.62:9050/cgi-bin", - "body": { - "username": "xxx", #短信平台接口用户名 - "password": "xxx", #短信平台接口用户密码 - "to": "13800138000", #发送的目标手机号,如果有多个手机号可以用空格格开,一次最多100个号码 - "text": "", - "subID": "", - "msgType": 1, - "encode": 1, - "version": "1.0" - }, - "timeout": 5, -} - -enableList = [ "index", "qywx", "mail", "sms" ] #启用的功能列表 +#!/usr/bin/env python +# coding: utf-8 + +address = "0.0.0.0" #服务器的监听地址 +port = 8000 #服务器的监听端口 +apiKey = "replace_your_key" #apikey,开启签名时使用,保存在服务器本地,不对外公开 +enableSignature = False #是否开启签名 +signatureTimeOutSecs = 60 #设置签名有效期 +signatureMethod = "sha256" #设置签名的方法 +signatureSupportList = ("md5", "sha1", "sha128", "sha224", "sha256", "sha384", "sha512") #设置签名支持列表 + +#redis连接配置,使用微信企业号发送消息时启用,用于保存调用微信接口时使用的access_token +redis = { + "host": "127.0.0.1", + "port": 6379, + "db": 0, +} +#指定保存access_token的key +redisKeys = { + "WXQY_ACCESS_TOKEN": "msgsender:wxqy:actoken", +} +#注册微信企业号后得到的字段 +qywx = { + "baseUrl": "https://qyapi.weixin.qq.com/cgi-bin", + "corpid": "wx17000000000000", #根据自己的企业号修改 + "corpsecret": "xxxxxxxxxxxxxxxxxxxx", #根据自己的企业号修改 + "agentid": "00000000", #根据自己的企业号修改 + "timeout": 5, #设置调用超时时间 +} +#使用邮件发送消息时启用 +mail = { + "defaultSign": ''' +

+
+ 研发中心 
+ Gateray
+ ------------------------
+ Mobile:10086   
+ QQ:437925289
+ E-MAIL: + 437925289@qq.com +

------------------------
+ xxxxxxxxx有限公司
+ www.xxx.com  +
''', #设置邮件签名 + "fromAddress": "me@example.com", #发送人邮箱 + "username": "myname", #邮箱登录名 + "password": "mypass", #邮箱密码 + "toAddressList": ["437925289@qq.com", "someone@qq.com"], #收件人邮箱列表 + "ccAddressList": [], #抄送人列表 + "smtpServer": "smtp.example.com", #邮件发送服务器地址 + "smtpPort": 25, #邮件发送服务器端口 +} +#使用玄武短信接口发送消息时启用 +sms = { + "baseUrl": "http://211.147.239.62:9050/cgi-bin", + "body": { + "username": "xxx", #短信平台接口用户名 + "password": "xxx", #短信平台接口用户密码 + "to": "13800138000", #发送的目标手机号,如果有多个手机号可以用空格格开,一次最多100个号码 + "text": "", + "subID": "", + "msgType": 1, + "encode": 1, + "version": "1.0" + }, + "timeout": 5, +} + +enableList = [ "index", "qywx", "mail", "sms" ] #启用的功能列表 From 2fd6c07bb99166457a8dc27f4e3b80ff295c5674 Mon Sep 17 00:00:00 2001 From: gateray <437925289@qq.com> Date: Mon, 9 Oct 2017 20:33:53 +0800 Subject: [PATCH 2/6] fixed --- README.md | 70 +++++++++++++++++++++++++++---------------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 5607791..3540d66 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -#概述 +# 概述 ->msg-sender是一个基于tornado框架的异步消息发送接口,当前支持消息发送微信企业号、玄武短信接口和Email; 接口调用支持http和websocket。遵循MIT开源许可。 +> msg-sender是一个基于tornado框架的异步消息发送接口,当前支持消息发送微信企业号、玄武短信接口和Email; 接口调用支持http和websocket。遵循MIT开源许可。 -#接口调用方式 +# 接口调用方式 -##微信企业号消息发送接口 +## 微信企业号消息发送接口 关闭签名: @@ -24,17 +24,17 @@ POST http://host:8000/qywx?content=abc&title=接口测试 开启签名: -字段名|字段类型|是否必须|描述 +字段名 | 字段类型 | 是否必须 | 描述 ----------|------------|------------|------ +--------- | ------------ | ------------ | ------ -title|String|是|消息的标题 +title | String | 是 | 消息的标题 -content|String|是|消息的内容 +content | String | 是 | 消息的内容 -timestamp|Integer|是|unix时间戳(当前时间,10位数字) +timestamp | Integer | 是 | unix时间戳(当前时间,10位数字) -signature|String|是|16进制格式的签名值,支持md5、sha1、sha128、sha224、 sha256、 sha384、 sha512签名方法,默认为sha256。 +signature | String | 是 | 16进制格式的签名值,支持md5、sha1、sha128、sha224、 sha256、 sha384、 sha512签名方法,默认为sha256。 签名说明: @@ -66,17 +66,17 @@ POST http://host:8000/qywx?title=test&content=test消息内容×tamp=1507545 -##玄武短信消息发送接口 +## 玄武短信消息发送接口 关闭签名: -字段名|字段类型|是否必须|描述 +字段名 | 字段类型 | 是否必须 | 描述 ----------|------------|------------|------ +--------- | ------------ | ------------ | ------ -title|String|是|消息的标题 +title | String | 是 | 消息的标题 -content|String|是|消息的内容 +content | String | 是 | 消息的内容 ``` @@ -90,17 +90,17 @@ POST http://host:8000/sms?content=这是一条测试短信&title=标题会忽略 -##Email消息发送接口 +## Email消息发送接口 关闭签名: -字段名|字段类型|是否必须|描述 +字段名 | 字段类型 | 是否必须 | 描述 ----------|------------|------------|------ +--------- | ----------- | ------------ | ------ -title|String|是|消息的标题 +title | String | 是 | 消息的标题 -content|String|是|消息的内容 +content | String | 是 | 消息的内容 ``` @@ -114,9 +114,9 @@ POST http://host:8000/mail?content=这是一封测试邮件,请勿回复!&ti -#部署 +# 部署 -##环境要求 +## 环境要求 1. python 3.5以上 @@ -126,11 +126,11 @@ POST http://host:8000/mail?content=这是一封测试邮件,请勿回复!&ti -##依赖安装 +## 依赖安装 ``` -git clone https://gitee.com/gateray/msg-sender.git +git clone https://gitee.com/gateray/msg-sender.git cd msg-sender @@ -140,9 +140,9 @@ pip install -r requirements.txt -##运行 +## 运行 -###测试环境 +### 测试环境 ``` @@ -156,11 +156,11 @@ python app.py --port=8000 -###生产环境部署建议 +### 生产环境部署建议 建议使用nginx作为反向代理,后端开启多个python进程(建议与cpu核数相等)做负载均衡。 -####打开最多文件数限制: +#### 打开最多文件数限制: 方式一: @@ -176,7 +176,7 @@ ulimit -n 1048576 vim /etc/security/limits.conf -#加上下面配置: +# 加上下面配置: * - nofile 1048576 @@ -199,13 +199,13 @@ Group=gateray LimitNOFILE= 1048576 -#实际上对于nginx,可以通过配置文件中 worker_connections 1048576;指定 +# 实际上对于nginx,可以通过配置文件中 worker_connections 1048576;指定 ``` -####开启多个python进程: +#### 开启多个python进程: ``` @@ -287,7 +287,7 @@ stdout_logfile=/tmp/%(program_name)s.log ; stdout log path, NONE for none; ``` -####nginx配置: +#### nginx配置: ``` @@ -365,7 +365,7 @@ http { ``` -#本地压测结果: +# 本地压测结果: ``` @@ -487,8 +487,8 @@ Percentage of the requests served within a certain time (ms) -#联系方式 +# 联系方式 QQ:437925289 -Email:437925289@qq.com \ No newline at end of file +Email:437925289@qq.com From ee4b82c052779e43a79d006d15b8b4362db15a48 Mon Sep 17 00:00:00 2001 From: gateray <437925289@qq.com> Date: Mon, 9 Oct 2017 20:36:43 +0800 Subject: [PATCH 3/6] fixed --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3540d66..2314f4d 100644 --- a/README.md +++ b/README.md @@ -8,13 +8,13 @@ 关闭签名: -字段名|字段类型|是否必须|描述 +字段名 | 字段类型 | 是否必须 | 描述 ----------|------------|------------|------ +--------- | ------------ | ------------ | ------ -title|String|是|消息的标题 +title | String | 是 | 消息的标题 -content|String|是|消息的内容 +content | String | 是 | 消息的内容 ``` From dd3a978032b5f69c5e51ba3337330afc7f93e068 Mon Sep 17 00:00:00 2001 From: gateray Date: Mon, 9 Oct 2017 22:58:45 +0800 Subject: [PATCH 4/6] fix README.md --- README.md | 96 ++++++++++--------------------------------------------- 1 file changed, 16 insertions(+), 80 deletions(-) diff --git a/README.md b/README.md index 2314f4d..e2f9ea6 100644 --- a/README.md +++ b/README.md @@ -9,153 +9,111 @@ 关闭签名: 字段名 | 字段类型 | 是否必须 | 描述 - ---------- | ------------ | ------------ | ------ - +-----------|-----------|-----------|----------- title | String | 是 | 消息的标题 - content | String | 是 | 消息的内容 ``` - POST http://host:8000/qywx?content=abc&title=接口测试 - ``` 开启签名: 字段名 | 字段类型 | 是否必须 | 描述 ---------- | ------------ | ------------ | ------ - +-----------|-----------|-----------|----------- title | String | 是 | 消息的标题 - content | String | 是 | 消息的内容 - timestamp | Integer | 是 | unix时间戳(当前时间,10位数字) - signature | String | 是 | 16进制格式的签名值,支持md5、sha1、sha128、sha224、 sha256、 sha384、 sha512签名方法,默认为sha256。 签名说明: -1)将所有字段按key自然排序后,拼接key-value得到字符串A +* 1)将所有字段按key自然排序后,拼接key-value得到字符串A -2)字符串A后拼接上apiKey,得到字符串B +* 2)字符串A后拼接上apiKey,得到字符串B -3)字符串B进行签名,输出的16进制字符串为signature字段的值 +* 3)字符串B进行签名,输出的16进制字符串为signature字段的值 示例: -> 1)假设title=test&content=test消息内容×tamp=1507545674, apiKey=mysecret +* 1)假设title=test&content=test消息内容×tamp=1507545674, apiKey=mysecret -> 2)按key自然排序的结果为:content=test消息内容×tamp=1507545674&title=test +* 2)按key自然排序的结果为:content=test消息内容×tamp=1507545674&title=test -> 3)拼接后得到字符串:contenttest消息内容timestamp1507545674titletest +* 3)拼接后得到字符串:contenttest消息内容timestamp1507545674titletest -> 4)拼接上apiKey得到的字符串:contenttest消息内容timestamp1507545674titletestmysecret +* 4)拼接上apiKey得到的字符串:contenttest消息内容timestamp1507545674titletestmysecret -> 5)上一步得到的字符串进行sha256签名,得到签名:28924486d2aaf886565736a50e61bb9fb0d3baf613e2333b0e497934699ec15b +* 5)上一步得到的字符串进行sha256签名,得到签名:28924486d2aaf886565736a50e61bb9fb0d3baf613e2333b0e497934699ec15b ``` - POST http://host:8000/qywx?title=test&content=test消息内容×tamp=1507545674&signature=28924486d2aaf886565736a50e61bb9fb0d3baf613e2333b0e497934699ec15b - ``` > 签名有效期为1分钟 - - ## 玄武短信消息发送接口 关闭签名: 字段名 | 字段类型 | 是否必须 | 描述 - ---------- | ------------ | ------------ | ------ - +----------|--------------|--------------|------- title | String | 是 | 消息的标题 - content | String | 是 | 消息的内容 ``` - POST http://host:8000/sms?content=这是一条测试短信&title=标题会忽略 - ``` 开启签名: 规则与上面微信企业号方式相同 - - ## Email消息发送接口 关闭签名: 字段名 | 字段类型 | 是否必须 | 描述 - ---------- | ----------- | ------------ | ------ - +----------|-------------|--------------|------- title | String | 是 | 消息的标题 - content | String | 是 | 消息的内容 ``` - POST http://host:8000/mail?content=这是一封测试邮件,请勿回复!&title=接口测试 - ``` 开启签名: 规则与上面微信企业号方式相同 - - # 部署 ## 环境要求 -1. python 3.5以上 - -2. redis 2.8以上(可选,使用微信企业号发送消息时需要使用) - -3.推荐linux环境下运行 +* 1)python 3.5以上 +* 2)redis 2.8以上(可选,使用微信企业号发送消息时需要使用) +* 3)推荐linux环境下运行 ## 依赖安装 ``` - -git clone https://gitee.com/gateray/msg-sender.git - +git clone https://github.com/gateray/msg-sender.git cd msg-sender - pip install -r requirements.txt - ``` - - ## 运行 ### 测试环境 ``` - -cd msg-sender - cp local_settings.py.example local_settings.py - python app.py --port=8000 - ``` - - ### 生产环境部署建议 建议使用nginx作为反向代理,后端开启多个python进程(建议与cpu核数相等)做负载均衡。 @@ -165,62 +123,40 @@ python app.py --port=8000 方式一: ``` - ulimit -n 1048576 - ``` 方式二: ``` - vim /etc/security/limits.conf - # 加上下面配置: - * - nofile 1048576 - ``` 方式三(systemd): ``` - 在对应服务的service文件中添加,例如: - vim /lib/systemd/system/nginx.service - - [Service] - User=gateray - Group=gateray - LimitNOFILE= 1048576 - # 实际上对于nginx,可以通过配置文件中 worker_connections 1048576;指定 - ``` - - #### 开启多个python进程: ``` - for i in {8001..8008}; do - nohup python app.py --port=800$i &> /tmp/msg-sender-800$i.log & - done - ``` 强烈推荐使用supervisor去管理进程,以下是一个示例: ``` - ➜ msg-sender git:(master) ✗ cat /etc/supervisord.conf.d/msg-sender.conf [program:msg-sender-8001] From c0f75a1b123746be07078b4dd0af8cb8eb408f1d Mon Sep 17 00:00:00 2001 From: gateray Date: Mon, 9 Oct 2017 23:01:22 +0800 Subject: [PATCH 5/6] fix README.md --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index e2f9ea6..f754a34 100644 --- a/README.md +++ b/README.md @@ -29,23 +29,23 @@ signature | String | 是 | 16进制格式的签名值,支持md5、sha1、sha128 签名说明: -* 1)将所有字段按key自然排序后,拼接key-value得到字符串A +* 将所有字段按key自然排序后,拼接key-value得到字符串A -* 2)字符串A后拼接上apiKey,得到字符串B +* 字符串A后拼接上apiKey,得到字符串B -* 3)字符串B进行签名,输出的16进制字符串为signature字段的值 +* 字符串B进行签名,输出的16进制字符串为signature字段的值 示例: -* 1)假设title=test&content=test消息内容×tamp=1507545674, apiKey=mysecret +* 假设title=test&content=test消息内容×tamp=1507545674, apiKey=mysecret -* 2)按key自然排序的结果为:content=test消息内容×tamp=1507545674&title=test +* 按key自然排序的结果为:content=test消息内容×tamp=1507545674&title=test -* 3)拼接后得到字符串:contenttest消息内容timestamp1507545674titletest +* 拼接后得到字符串:contenttest消息内容timestamp1507545674titletest -* 4)拼接上apiKey得到的字符串:contenttest消息内容timestamp1507545674titletestmysecret +* 拼接上apiKey得到的字符串:contenttest消息内容timestamp1507545674titletestmysecret -* 5)上一步得到的字符串进行sha256签名,得到签名:28924486d2aaf886565736a50e61bb9fb0d3baf613e2333b0e497934699ec15b +* 上一步得到的字符串进行sha256签名,得到签名:28924486d2aaf886565736a50e61bb9fb0d3baf613e2333b0e497934699ec15b ``` POST http://host:8000/qywx?title=test&content=test消息内容×tamp=1507545674&signature=28924486d2aaf886565736a50e61bb9fb0d3baf613e2333b0e497934699ec15b @@ -91,11 +91,11 @@ POST http://host:8000/mail?content=这是一封测试邮件,请勿回复!&ti ## 环境要求 -* 1)python 3.5以上 +* python 3.5以上 -* 2)redis 2.8以上(可选,使用微信企业号发送消息时需要使用) +* redis 2.8以上(可选,使用微信企业号发送消息时需要使用) -* 3)推荐linux环境下运行 +* 推荐linux环境下运行 ## 依赖安装 From 7916df788b5796b05bfb42732fc0c16f1559389b Mon Sep 17 00:00:00 2001 From: gateray Date: Mon, 9 Oct 2017 23:30:57 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86=E5=BE=AE?= =?UTF-8?q?=E4=BF=A1=E6=8E=A5=E5=8F=A3=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- local_settings.py.example | 2 ++ models.py | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/local_settings.py.example b/local_settings.py.example index 9ba57cc..a71f483 100644 --- a/local_settings.py.example +++ b/local_settings.py.example @@ -25,6 +25,8 @@ qywx = { "corpid": "wx17000000000000", #根据自己的企业号修改 "corpsecret": "xxxxxxxxxxxxxxxxxxxx", #根据自己的企业号修改 "agentid": "00000000", #根据自己的企业号修改 + "toUser": "@all", #设置接收消息的userid,@all表示所有用户,多个用户使用‘|’分隔 + "toParty": "@all", #设置接收消息的部门id,@all表示所有部门,多个部门使用‘|’分隔 "timeout": 5, #设置调用超时时间 } #使用邮件发送消息时启用 diff --git a/models.py b/models.py index e90d24b..663c676 100644 --- a/models.py +++ b/models.py @@ -41,6 +41,8 @@ def __init__(self, redisConn, title="", content="", **qywxSettings): self.corpid = qywxSettings.get("corpid") self.corpsecret = qywxSettings.get("corpsecret") self.agentid = qywxSettings.get("agentid") + self.toUser = qywxSettings.get("toUser") + self.toParty = qywxSettings.get("toParty") self.timeout = qywxSettings.get("timeout") self.__redis = redisConn @@ -85,8 +87,8 @@ def send(self): accessToken = yield self.getAccessToken() if len(accessToken) == 0: return None body = { - "touser": "gateray", - "toparty": "", + "touser": self.toUser, + "toparty": self.toParty, "totag": "", "msgtype": "text", "agentid": self.agentid,