【AIO】使用ORACLE数据库存储过程发送企业微信群机器人消息

前言

为了对标阿里系的钉钉,腾讯于2016年4月18日推出了企业微信
专注企业内部通讯(目前已加入客户管理及客户通讯功能),替代原有的RTX腾讯通RTX首页已推荐企业微信,建议原RTX用户迁移到企业微信

企业微信由于微信的生态及其易用性,已被很多企业使用,甚至个人都可以申请开通一个企业,其中经常会使用到的一个功能为消息推送。

消息推送目前分两大种,一是通过在企业微信新建应用,通过该应用发送给企业微信内指定的成员或群;二是通过企业微信群内的自建机器人,来发送消息到群。两种方式都支持api调用,但由于第一种需要新建应用,还要token和secret支持,在企业内有多个企业微信的应用开发项目时,容易发生token频繁更新导致经常失效,第二种方式不需要token,甚至不需要企业微信管理员的授权,所以第二种更方便使用。

一般像这种api调用都要再另外开发一个程序,比如JAVA/PY等,也有利用.bat/.sh这类的操作系统批处理脚本来发送,但是都依赖于操作系统,而且增加了运维监控的工作量。

本文针对第二种,介绍下如何通过ORACLE数据库存储过程来使用此功能(本文不描述如何申请开通企业微信)。

先了解企业微信官方API文档-群机器人配置说明

https://work.weixin.qq.com/api/doc/90000/90136/91770
看完文档后,可以了解到,使用这个API大致分以下几个步骤
1.创建一个群聊机器人
2.获得群聊机器人的链接(含webhook)
3.向该链接发送消息

下面我们正式开始操作

一、创建群聊机器人及获得webhook

1.打开手机端企业微信客户端,打开一个群(不支持外部群)
2.点击右上角两个人头的图标
3.点击群机器人
4.点击添加机器人(或右上角添加)i
5.输入机器人名字,点击添加按钮
6.获得webhook的地址,直接点复制,也可返回查看
该地址格式如下,注意保密不要泄露https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=a******-***-***-***-******

二、在ORACLE数据库中配置ACL授权(可能需要SYS用户),允许ORACLE数据库访问企业微信API的地址

begin
  sys.dbms_network_acl_admin.create_acl( -- 创建访问控制文件(ACL)     
                                    acl         => 'utl_http.xml', -- 文件名称   
                                    description => 'HTTP Access', -- 描述    
                                    principal   => 'ORACLE_USER', -- 授权或者取消授权账号,大小写敏感     
                                    is_grant    => TRUE, -- 授权还是取消授权     
                                    privilege   => 'connect', -- 授权或者取消授权的权限列表    
                                    start_date  => null, -- 起始日期   
                                    end_date    => null -- 结束日期  
                                    );
  sys.dbms_network_acl_admin.add_privilege( -- 添加访问权限列表项    
                                       acl        => 'utl_http.xml', -- 刚才创建的acl名称     
                                       principal  => 'ORACLE_USER', -- 授权或取消授权用户   
                                       is_grant   => TRUE, -- 与上同     
                                       privilege  => 'resolve', -- 权限列表   
                                       start_date => null,
                                       end_date   => null);
  sys.dbms_network_acl_admin.assign_acl( -- 该段命令意思是允许访问acl名为utl_http.xml下授权的用户,使用oracle网络访问包,所允许访问的目的主机,及其端口范围。   
                                    acl  => 'utl_http.xml',
                                    host => 'qyapi.weixin.qq.com',
                                    lower_port => 1, -- 允许访问的起始端口号    
                                    upper_port => 9999 -- 允许访问的截止端口号  
                                    );
  commit;
end;
/

三、配置ORACLE数据库的WALLET

该api地址为https开头,表示启用了ssl加密,之前在使用ORACLE数据库存储过程发送加密email(SSL)【ORACLE】简单谈谈ORACLE中WALLET(钱夹)
两文中提到,这种情况需要配置oracle的wallet,我们可以直接用浏览器打开https://qyapi.weixin.qq.com
这个地址,使用浏览器来获得证书文件,已实测这个证书在失效1个月后仍然可以正常发送消息(2021-07-15时测试结果,不代表未来,如果提示证书失效请自行更新wallet)
wallet配置方法请参考之前这篇文章

四、编译数据库包 qyapi_weixin_robot_sql

create or replace package qyapi_weixin_robot_sql is

  -- Author  : DarkAthena
  -- Created : 2020-06-15 13:33:16
  -- Purpose : 企业微信群机器人API
  
  g_WALLET_path varchar2(1000):='H:\WINDOWS.X64_193000_db_home\ssl_wallet';--钱夹保存路径
  g_wallet_pwd varchar2(1000) :='12345678'; --钱夹密码,若设置了自动登录,可为空
  g_content_type varchar2(1000):='application/json';
  procedure sendmsg_text(i_webhook varchar2,i_content_text varchar2);--发送文本信息
  procedure sendmsg_file(i_webhook  varchar2,
                         i_dir      varchar2,
                         i_file_name varchar2,
                         i_display_file_name varchar2);--发送文件信息
  procedure sendmsg_image(i_webhook varchar2,i_dir varchar2,i_imagename varchar2);--发送图片信息
end qyapi_weixin_robot_sql;
/

完整源码请访问我的github项目获取https://github.com/Dark-Athena/workweixinrobot-oracle

五、修改数据库包qyapi_weixin_robot_sql中wallet及wallet密码的配置

g_WALLET_path varchar2(1000):='H:\WINDOWS.X64_193000_db_home\ssl_wallet';--钱夹保存路径
 g_wallet_pwd varchar2(1000) :='12345678'; --钱夹密码,若设置了自动登录,可为空

六、测试发送

由于常用的就是文本、文件、图片三种内容,因此只对这三种进行了封装,markdown/图文暂不支持(要实现其实也很简单,懒得搞了)

1.发送文本信息

begin
  qyapi_weixin_robot_sql.sendmsg_text(i_webhook      => 'a******-***-***-***-******',--这里只要webhook地址后面的key
                                        i_content_text => '亲爱的主人,早安');
end;
/

2.发送文件

begin
  qyapi_weixin_robot_sql.sendmsg_file(i_webhook           => 'a******-***-***-***-******',
                                        i_dir               =>'SENDFILE_DIR',--这里为数据库中配置的目录,下同, create or replace directory SENDFILE_DIR as 'H:\WINDOWS.X64_193000_db_home\TEMP'
                                        i_file_name         =>'20210715_456798215648977.xlsx',--实际文件名
                                        i_display_file_name =>'昨日账单20210715.xlsx'--聊天窗口中要显示的文件名
);
end;
/

3.发送图片
其实图片也是可以通过文件发送的,但是如果是通过文件的形式发送,用户需要点击这个图片打开才能看到内容,如果是以图片显示发送,则在聊天窗口中可以直接显示图片内容

begin
  qyapi_weixin_robot_sql.sendmsg_image(i_webhook   => 'a******-***-***-***-******',
                                         i_dir       =>'SENDFILE_DIR' ,
                                         i_imagename => '1625668522172.jpg');
end;
/

20210715 更新补充

之前在 oracle 11g上测试的时候,这个api必须有包含对应证书的wallet才能发送,当然也可以把地址中的https的s去掉,只是这样安全度会降低。今天写这篇文章时同步在oracle 19c上测试,发现去掉钱夹的配置,地址为https时一样可以正常发送,原因不明。所以之后可能会在这个包中再多配置一个参数,由用户自行决定是否要启用ssl

posted on 2021-07-15 23:41  DarkAthena  阅读(208)  评论(0编辑  收藏  举报

导航