用python实现钉钉Outgoing机器人(企业内部机器人)全过程

本文详细介绍了如何使用Python实现钉钉Outgoing机器人,包括安装Apache HTTP服务、配置反向代理、创建钉钉机器人、处理交互信息等步骤,重点解决了在实现过程中遇到的配置和服务端口问题。
摘要由CSDN通过智能技术生成

不多说,先上最终效果图
在这里插入图片描述

[Python钉钉Outgoing机器人初步研究

再上一段连接,后续所有过程都是在大佬的思路下进行的,代码也是从大佬这里复制的,只是稍微改动的一部分,大家可以在联调通过能实现交互之后再去自己开发后台逻辑。但是因为大佬写的太简单了,省了很多步骤,所以我才自己重新写一份,防止后面忘记了

先直接贴代码,再说我的从零开始的步骤

1.先安装apache http服务,并配置反向代理,代理的就是python绑定的端口和ip,配置方法参考如下
利用Apache的转发模块实现反向代理服务器

2.因为企业内部机器人需要一个公网的http服务,所以使用钉钉推荐的内网穿透去实现。这一点没遇到什么问题,仔细看官方文档就好了
钉钉内网穿透实现

3.到钉钉开发者后台去创建一个机器人
注意:机器人创建后凭证与基础信息这一栏中的参数AppSecret需要复制出来,到代码里替app_secret变量的值
然后再发布机器人到钉钉群,此时可以看到机器人有一个参数叫Webhook,这个直接复制到代码里,后面会讲有什么用。

大概的准备工作都准备完了,就开始逐一打通了

因为内网穿透之后要启动一个http服务才可以看到具体的使用效果,所以安装apache,至于为什么不用python代码来实现http服务,个人喜好吧。因为本身就有apache所以我就懒得再去看别人的代码学习了,

然后至于为什么要使用apache反向代理,因为我发现打通了之后,钉钉发送的请求可以被apache http接收到,但是我的python后台运行过程中并没有任何动作,所以我立马反映过来他们根本没有联通!于是尝试nginx代理,发现不可取具体原因我也忘了,这两天一直弄这个注意力转义的也快哈哈哈。

用apache来配置反向代理后,钉钉发送的http请求先会根据内网穿透后提供的公网域名来发送到本地的apache http服务,再由反向代理转发到我们运行的python程序上。

到这一步基本上获取数据这一块就完成了,接下来就是outgoing机器人的自动回复实现了。

根据获取到的数据getPost() 方法会把数据解析出来,然后调用initKey()方法去实现返回。其中initKey()方法中发送数据用的思路还是和钉钉自定义机器人一样,用获取到的webhook直接用request请求讲我们要发送的数据发送出去。
这一步我卡了足足有十个小时之久,因为大佬之前的代码中webhook是他自己拼凑的,但是我根据钉钉https://oapi.dingtalk.com/gettoken?接口去获得的token一直提示不对,百度了很久也没找到原因。直到在钉钉看机器人配置的时候,无意间发现企业内部机器人也会有webhook,一开始配置机器人的时候都没看到,一直以为只有自定义机器人才有webhook。于是不禁大喜,直接把他复制过来套进去就用了,果然可以!

所以,交互的原理就是根据钉钉http发送过来的请求中的报文信息,用python解析后在对信息进行判断,在执行对应的方法去处理,最后通过调用request方法把处理结果返回到钉钉。这样就大功告成了

接下来再对我重点遇到的问题进行一个总结:

  1. 因为之前安装过禅道,其中也包含了apache http服务,导致新安装的apache服务无法新增,处理办法如下
    如何手动创建Apache Windows服务
  2. 内网穿透后报错Unable to initiate connection to 127.0.0.1:81. A web server must be running on port 127.0.0.1:81to complete the tunnel.
    这个是因为没有启动http服务,并且apache监听的端口要和内网穿透的端口要保持一致。
  3. 就是代码中的参数问题,只恨我没有仔细看官方文档,只顾拿别人的代码复制粘贴就用,到后面才慢慢摸索各个参数的来源

app_secret参数:这个很重要,是用来计算sgin的
在这里插入图片描述
webhook参数:就是这个参数,折磨了我十多个小时,我至今没搞懂大佬的参数是怎么获取的,反正我是直接拿来用的。
这个参数是在企业内部机器人上线后,添加到群里面以后才会有的!

在这里插入图片描述
如下是代码,请粘贴复制后仔细阅读,重点看handle_client(),getPost(),initKey()这三方法就好了,获取数据,数据处理,返回数据这三个主要功能都在这里。

# -*- coding: GBK -*-
import requests
import json
import time
import hmac
import hashlib
import base64
import socket
from multiprocessing import Process


def handle_client(client_socket):
    # 获取socket
    request_data = client_socket.recv(20000)
    post_userid, post_sign, post_timestamp, post_mes = getPost(request_data)
    # 回应socket
    initKey(post_userid, post_sign, post_timestamp, post_mes)
    # 关闭s
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值