32    视听 •
SHI TING    2018年  第 4 期
技术研发与应用
1 引言
是腾讯公司于2011年推出的一个为智能终端提供即时通讯服务的免费应用程序,目前已有超过9亿用户,成为中国社会互联网社交的一种生活方式。腾讯公司利用个人的广大用户基数,扩展了、服务号和企业号,随后企业号发展为企业。企业提供了通讯录管理、应用管理、消息推送、身份验证、移动端SDK、素材、OA 数据接口、企业支付、电子发票等接口(API),开发人员可以使用这些API,为企业接入更多个性化的办公应用。同时,开发人员还可以开发出其他不依赖于API 的独立运行的后台应用,仅使用客户端来呈现前端页面。
由后台程序向客户端主动发送消息是常用的一种应用。企业开放了消息发送接口,企业可以使
用这些接口让自定义应用与企业后台或用户间进行双向通信。在此,后台程序可以按需求自动判断发送条件、
自主组织消息形式、选择接收用户等。可发送的消息类型主要包括文本、图片、语音、视频、文件、文本卡片、图文消息,多种类型的消息极大的满足了企业应用的需求。
2 主动发送消息的机制
主动发送消息是指,企业后台调用接口通过应用向指定成员发送消息。其时序图如图1所示。
企业应用的后台程序按照给定的方式向授权API 发送已知的corpid 和secret,API 端返回包含了access_token 等信息的json 串,开发者提取出access_token 并用于发消息接口,此时企业应用与端才建立起连接并互相取得信任,然后才能开始后台程序与企业之间的交互。access_token 有时效性,过期后要再次访问授权接口来获取。后台程序自定义的消息主体data 也是json 串,它和access_token 一起被
一种后台程序向企业主动发送消息的方法
韦筱泉 马长峰 玉易(广西广播电视技术中心)
[摘  要 ]  本文设计并实现了一种后台程序向企业主动发送消息的方法。该方法采用Python 编写后台推送程序,采用PHP 编写接口程序,实现了扫描数据库向特定用户主动发送消息的功能。
[关键词]  企业  消息推送  Python  PHP 图1 主动发送消息时序图
DOI:10.19395/jki.1674-246x.2018.04.009
视听 • SHI TING    2018年  第 4 期
33
技术研发与应用
发送至API,再由API 发送至后台,最终由后台转发至个人app。
在后台程序向企业主动发送消息时,主要用到以下信息:
php的工作流程
2.userid : 每个成员都有唯一的userid,即所谓“帐号”;
3.agentid: 每个应用都有唯一的agentid ;
4.secret :secret 是企业应用里面用于保障数据安全的“钥匙”,每一个应用都有一个独立的访问密钥,为了保证数据的安全,secret 不能泄漏。目前secret 有两种:一是通讯录管理secret,二是应用secret,主动发送消息主要用的是应用secret。每个应用有独立的secret,所以每个应用的access_token 应该分开来获取;
5.access_token :access_token 是企业后台去企业的后台获取信息时的重要票据,由corpid 和secret 产生。所有接口在通信时都需要携带此信息用于验证接口的访问权限。
3 程序设计
依据主动发送消息的机制,程序设计为两个部分:企业应用的后台程序和访问API 的接口程序。后台程序用于满足企业应用的各种需求,如判断发送条件、组织消息及形式、选择接收用户、返回用户访问信息等。接口程序用于向端发送认证、建立连接、发送消息、建立用户访问界面等与的各种交互。
本文根据实际工作需求,从处于内网的OA 系统,向用户发送工作流消息提醒,即当用户有新的工作流
时,在app 上会接收到企业号推送的文本消息。因此,本文设计的两部分程序分别如下所述。
3.1 后台程序
在此,后台程序主要用于扫描数据库,查满足发送条件的用户名、消息内容、调用接口程序,并根据返回值判断是否发送成功改写数据表等。因为此程序具有机械重复的特性,采用Python 语言编写.exe 可执行程序,可大大提高扫描效率和节省内存开支。具体程序如表1所示:
表1 后台程序
#coding:utf-8
import pymysql,time import requests import demjson time.sleep(1)while True:
#ute("select user_id from
webmail") conn = t(host='127.0.0.1',user='root',password='*****',db='TD_OA',port=****,charset='utf8') cur = conn.cursor() print "beginflow" sql=u"_id, a.body_id, b.from_id, b.content,a.sms_id,c.wx_uid FROM sms a, sms_body b,weixin_member c _id=c.wx_un
ame ind_flag>=1 AND b.sms_type=7 AND a.body_id=b.body_id AND a.sms_id>1120290 AND a.wx_flag=0 ORDER BY b.body_id DESC" de('utf-8') ute(sql) result = cur.fetchall() for row in result:  sql_update=u"update sms set wx_flag=1 where sms_id=%d" % row[4]  text = row[3].encode('utf-8')  user = row[5].encode('utf-8')  params = {"touser":user,"agentid":"6","content":text} r = requests.post('192.168.***.*** /***/TD-response-***.php',params)  result = de('utf-8')  if 'success' in result:  print sql_update    ute(sql_update)  connmit()  print "endflow" cur.close() conn.close() time.sleep(4)
此程序间隔4秒扫描一次数据库,查该接收消息的用户和消息主体,组织成json 串形式的参数,调用接口程序并传参;若返回值中含有success,则改写数据表。一次发送完成。
3.2 接口程序
企业提供了许多接口地址,但是仍需要开发人员编写接口程序。本文的接口程序采用php 语言编写如表2,使用了跨域访问函数curl()。
表2 接口程序
<?php
function curlPost($url,$data=""){      $ch = curl_init();    $opt = array(      CURLOPT_URL    => $url,                        CURLOPT_HEADER  => 0,      CURLOPT_POST    => 1,
CURLOPT_POSTFIELDS      => $data,            CURLOPT_RETURNTRANSFER  => 1,            CURLOPT_TIMEOUT        => 20    );
$ssl = substr($url,0,8) == "" ? TRUE : FALSE;
if ($ssl){
$opt[CURLOPT_SSL_VERIFYHOST] = 1;
34    视听 •
SHI TING    2018年  第 4 期
技术研发与应用
$opt[CURLOPT_SSL_VERIFYPEER] = FALSE;    }
curl_setopt_array($ch,$opt);    $data = curl_exec($ch);    curl_close($ch);    return $data;
}
$corpid="wx***********7b6";
$corpsecret="5Gw********_*************V1I";$Url="qyapi.weixin.qq/cgi-bin/ge ttoken?corpid=$corpid&corpsecret=$corpsecret";
$res = curlPost($Url);
$ACCESS_TOKEN=json_decode($res)->access_token;
$Url="qyapi.weixin.qq/cgi-bin/message/send?access_token=$ACCESS_TOKEN";$touser=$_POST['touser'];$msgtype="text";
$agentid=**********;
$content=$_POST['content'];$safe=0;
$arr=array('touser'=>$touser,  'msgtype'=>$msgtype,  'agentid'=>$agentid,  'text'=>array('content'=>$content),  'safe'=>0);
$data=json_encode($arr);$res = curlPost($Url,$data);
$errmsg=json_decode($res)->errmsg;if($errmsg==="ok"){ echo "success";
}else{ echo "error".$errmsg;
}?>
该程序首先发送corpid 和corpsecret 到指定地址以获取access_token ;接收后台程序发送来的参数,组合其他信息形成data 的json 串,再将access_token 和data 发送至指定地址,由端向个人用户
发送消息;最后端会向接口程序返回相关信息。
4 网络环境和程序部署
因业务的特殊性,OA 系统部署在内网web 服务器上,向外网端发送消息要经过重重关卡。大致的网络结构图如图2所示。
根据网络结构,本文设计把后台程序部署在内网OA 服务器上,把接口程序部署在DMZ 区的前置服务器上。当后台程序发送消息时,首先调用前置服务器上的接口程序,由接口程序向端发送交互请求和消息主体。用户访问企业应用时,首先访问的是前置服务器上的页面,再由页面程序与后台程序进行交互。采用此种程序部署方式,只暴露了接口程序和访问页面,大大的提高了后台程序和后台服务器的安全性。
5 总结和展望
目前该程序已经部署并正常使用,发送消息准确、及时。现在程序只使用了文本消息,后续还可开发更多形式的消息推送,或利用企业提供的接口还可开发功能更多更复杂的后台程序,如考勤、办公、文件共享等。用户以后仍会增多,程序会更加普及,企业的开发和利用,使得职工在不增加手机app、不增加内存消耗的情况下,就能便利的享受企业文化、接收企业信息和接受企业的管理。参考文献
[1] 腾讯控股有限公司.企业API 文档.work.weixin.qq/api/doc
图2 网络结构图

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。