Python構建企業微信自動訊息轉發服務端
阿新 • • 發佈:2018-12-15
一、背景
目前有在專案分組,就小組成員中,微信群訊息回覆較多的情況下,想根據組來轉發特定訊息,包含文字、圖片、語言等。在此只是自己實現僅供參考,可以根據自身需求修改更多功能。
二、程式碼
2.1 企業微信相關資訊
- 企業ID:corpid
- 自建應用appid
- 自建應用secret
2.2 服務端部署
執行環境:
python 版本 2.7
git clone https://github.com/redhatxl/wechatmsg.git
nohup python2.7 wechatmsg/wx_msg_server.py &
2.3 參考RUL:
2.4 程式碼
# flask 框架後臺 def server_run(self): app = Flask(__name__) @app.route('/index', methods=['GET', 'POST']) def index(): wxcpt = WXBizMsgCrypt(self.sToken, self.sEncodingAESKey, self.sCorpID) # 獲取url驗證時微信傳送的相關引數 sVerifyMsgSig = request.args.get('msg_signature') sVerifyTimeStamp = request.args.get('timestamp') sVerifyNonce = request.args.get('nonce') sVerifyEchoStr = request.args.get('echostr') # 驗證url if request.method == 'GET': ret, sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr) print type(ret) print type(sEchoStr) if (ret != 0): print "ERR: VerifyURL ret:" + str(ret) sys.exit(1) return sEchoStr # 接收客戶端訊息 if request.method == 'POST': sReqMsgSig = sVerifyMsgSig sReqTimeStamp = sVerifyTimeStamp sReqNonce = sVerifyNonce sReqData = request.data print(sReqData) ret, sMsg = wxcpt.DecryptMsg(sReqData, sReqMsgSig, sReqTimeStamp, sReqNonce) print ret, sMsg if (ret != 0): print "ERR: DecryptMsg ret: " + str(ret) sys.exit(1) # 解析傳送的內容並列印 xml_tree = ET.fromstring(sMsg) print('xml_tree is ', xml_tree)
- 訊息內容傳送
def _send_text_msg(self, content): data = { "touser": ('|').join(self.userid.split(',')), "toparty": ('|').join(self.partid.split(',')), # "toparty":int(self.partid), "msgtype": "text", "agentid": self.agent_id, "text": { "content": content }, "safe": 0 } try: response = requests.post(self.send_msg_url.format(self.access_token), json.dumps(data)) self.logoper.info(response.text) print(response.text) result_msg = json.loads(response.content)['errmsg'] return result_msg except Exception as e: self.logoper.info(e)
- 日誌
def create_dir(self):
"""
建立目錄
:return: 檔名稱
"""
_LOGDIR = os.path.join(os.path.dirname(__file__), self.logdir_name)
_TIME = time.strftime('%Y-%m-%d', time.gmtime()) + '-'
_LOGNAME = _TIME + self.logfile_name
LOGFILENAME = os.path.join(_LOGDIR, _LOGNAME)
if not os.path.exists(_LOGDIR):
os.mkdir(_LOGDIR)
return LOGFILENAME
def create_logger(self, logfilename):
"""
建立logger物件
:param logfilename:
:return: logger物件
"""
logger = logging.getLogger()
logger.setLevel(logging.INFO)
handler = logging.FileHandler(logfilename)
handler.setLevel(logging.INFO)
formater = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formater)
logger.addHandler(handler)
return logger
配置檔案
# 定義微信公眾號資訊
[common]
# 企業微信企業ID
corpid = wxe23xxxxxxxxxxx
# 接收訊息伺服器配置
[recmsg]
Token = mVNAAw3xxxxxxxxxxxxxxxxx
EncodingAESKey = vwbKImxc3WPeE073xxxxxxxxxxxxxxxxxx
# 自建應用資訊
[appconfig]
# 自建應用agentid
agentid = 1000002
# 自建應用secret
secret = 6HAGX7Muw36pv5anxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# 訊息接收資訊
# 訊息接收使用者id,如果多個使用者用英文','隔開
userid = xuel|yaoy
# 訊息接收部門id,如果多個用英文','隔開
partid = 11
[urlconfig]
# 獲取應用token的api介面
get_access_token_url = https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={}&corpsecret={}
# 傳送訊息api介面
send_msg_url = https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={}
# 上傳媒體api介面,獲取mediaid
upload_media_url = https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token={}&type=image
# 上傳高清語音介面
upload_video_url = https://qyapi.weixin.qq.com/cgi-bin/media/get/jssdk?access_token={}&media_id={}
[loginfo]
#日誌目錄
logdir_name = logdir
#日誌檔名稱
logfile_name = wechat_server.log
三、測試
在企業微信傳送訊息,可以修改配置檔案制定轉發到特定的群組,從而避免訊息分流。
啟用應用API,設定回撥地址
測試傳送訊息
檢視接受訊息
四、優化
- 後期可以配合資料庫將每次獲取的access_token 儲存至資料庫,待2小時過期後,再重新獲取新的。
- 更多內容轉發