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,