Git Product home page Git Product logo

dingtalkchatbot's Introduction

一、钉钉自定义机器人介绍

钉钉机器人是钉钉群的一个高级扩展功能,但使用起来却非常简单,只需要注册一个钉钉账号,就可以将第三方服务信息聚合到钉钉群中,实现信息的自动同步。

常见的使用场景:

1、聚合Github、Gitlab等源码管理服务,实现源码更新同步;

2、聚合Trello、JIRA等项目协调服务,实现项目信息同步;

3、机器人支持Webhook自定义接入,就可以实现更多可能性,例如:将运维报警、产品数据、自动化测试报告、工作&生活日程安排(上班打卡、下班吃饭、健身、读书、生日、纪念日...)的提醒;

目前自定义机器人支持文本(text)、链接(link)、markdown三种消息格式,五种消息类型,详细信息请参考自定义机器人官方文档

二、安装使用

这么好用的功能,只要在钉钉群中添加机器人,得到Webhoo地址即可。接下来,我们先在命令行终端一睹为快吧:

curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx' \
   -H 'Content-Type: application/json' \
   -d '
  {"msgtype": "text",
    "text": {
        "content": "我就是我, 是不一样的烟火"
     }
  }'

由于各种消息调用,官方只提供Java语言的封装,平时使用Python比较多,为了更方便平时自动化项目的使用,周末花了点时间用Python语言对各种消息类型进行了一一封装,代码已开源在GitHub上,同时也上传了PyPI。

1、项目源码地址如下:DingtalkChatbot
2、安装和更新命令如下:
pip install DingtalkChatbot
pip install -U DingtalkChatbot

3、支持功能如下:

  • 支持Text消息;
  • 支持Link消息;
  • 支持image表情消息;
  • 支持Markdown消息;
  • 支持ActionCard消息;
  • 支持消息发送失败时自动通知(默认fail_notice=False不通知,开发者可直接根据返回的消息发送结果自行处理)
  • 支持设置消息链接打开方式(默认pc_slide=False跳转至浏览器打开;pc_slide=True则在PC端侧边栏打开)
  • 支持钉钉官方消息发送频率限制,即每个机器人每分钟最多发送20条,不用担心触发限流;
  • 支持新版钉钉机器人加密设置;
  • 支持Python2、Python3;
  • 支持钉钉企业内部机器人即outgoing机器人的消息发送

三、各消息类型使用示例

image0

from dingtalkchatbot.chatbot import DingtalkChatbot, ActionCard, CardItem
# WebHook地址
webhook = 'https://oapi.dingtalk.com/robot/send?access_token=这里填写自己钉钉群自定义机器人的token'
secret = 'SEC11b9...这里填写自己的加密设置密钥'  # 可选:创建机器人勾选“加签”选项时使用
# 初始化机器人小丁
xiaoding = DingtalkChatbot(webhook)  # 方式一:通常初始化方式
xiaoding = DingtalkChatbot(webhook, secret=secret)  # 方式二:勾选“加签”选项时使用(v1.5以上新功能)
xiaoding = DingtalkChatbot(webhook, pc_slide=True)  # 方式三:设置消息链接在PC端侧边栏打开(v1.5以上新功能)
# Text消息@所有人
xiaoding.send_text(msg='我就是小丁,小丁就是我!', is_at_all=True)

image1

# Text消息之@指定用户
at_mobiles = ['这里填写需要提醒的用户的手机号码,字符串或数字都可以']
xiaoding.send_text(msg='我就是小丁,小丁就是我!', at_mobiles=at_mobiles)

image9

# image表情消息
xiaoding.send_image(pic_url='http://uc-test-manage-00.umlife.net/jenkins/pic/flake8.png')

image2

# Link消息
xiaoding.send_link(title='万万没想到,李小璐竟然...', text='故事是这样子的...', message_url='http://www.kwongwah.com.my/?p=454748", pic_url="https://pbs.twimg.com/media/CEwj7EDWgAE5eIF.jpg')

image3

# Markdown消息@所有人
xiaoding.send_markdown(title='氧气文字', text='#### 广州天气\n'
                           '> 9度,西北风1级,空气良89,相对温度73%\n\n'
                           '> ![美景](http://www.sinaimg.cn/dy/slidenews/5_img/2013_28/453_28488_469248.jpg)\n'
                           '> ###### 10点20分发布 [天气](http://www.thinkpage.cn/) \n',
                           is_at_all=True)

image4

# Markdown消息@指定用户
xiaoding.send_markdown(title='氧气文字', text='#### 广州天气 @1882516xxxx\n'
                       '> 9度,西北风1级,空气良89,相对温度73%\n\n'
                       '> ![美景](http://www.sinaimg.cn/dy/slidenews/5_img/2013_28/453_28488_469248.jpg)\n'
                       '> ###### 10点20分发布 [天气](http://www.thinkpage.cn/) \n',
                       at_mobiles=at_mobiles)

image5

# FeedCard消息类型(注意:当发送FeedCard时,pic_url需要传入参数值,必选)
card1 = CardItem(title="氧气美女", url="https://www.dingtalk.com/", pic_url="https://unzippedtv.com/wp-content/uploads/sites/28/2016/02/asian.jpg")
card2 = CardItem(title="氧眼美女", url="https://www.dingtalk.com/", pic_url="https://unzippedtv.com/wp-content/uploads/sites/28/2016/02/asian.jpg")
card3 = CardItem(title="氧神美女", url="https://www.dingtalk.com/", pic_url="https://unzippedtv.com/wp-content/uploads/sites/28/2016/02/asian.jpg")
cards = [card1, card2, card3]
xiaoding.send_feed_card(cards)

image6

# ActionCard整体跳转消息类型
btns1 = [CardItem(title="查看详情", url="https://www.dingtalk.com/")]
actioncard1 = ActionCard(title='万万没想到,竟然...',
                             text='![选择](http://www.songshan.es/wp-content/uploads/2016/01/Yin-Yang.png) \n### 故事是这样子的...',
                             btns=btns1,
                             btn_orientation=1,
                             hide_avatar=1)
xiaoding.send_action_card(actioncard1)

image7

# ActionCard独立跳转消息类型(双选项)
btns2 = [CardItem(title="支持", url="https://www.dingtalk.com/"), CardItem(title="反对", url="https://www.dingtalk.com/")]
actioncard2 = ActionCard(title='万万没想到,竟然...',
                             text='![选择](http://www.songshan.es/wp-content/uploads/2016/01/Yin-Yang.png) \n### 故事是这样子的...',
                             btns=btns2,
                             btn_orientation=1,
                             hide_avatar=1)
xiaoding.send_action_card(actioncard2)

image8

# ActionCard独立跳转消息类型(列表选项)
btns3 = [CardItem(title="支持", url="https://www.dingtalk.com/"), CardItem(title="中立", url="https://www.dingtalk.com/"), CardItem(title="反对", url="https://www.dingtalk.com/")]
actioncard3 = ActionCard(title='万万没想到,竟然...',
                             text='![选择](http://www.songshan.es/wp-content/uploads/2016/01/Yin-Yang.png) \n### 故事是这样子的...',
                             btns=btns3,
                             btn_orientation=1,
                             hide_avatar=1)
xiaoding.send_action_card(actioncard3)

四、常见注意事项

  • 1、at_mobiles列表上的手机号默认自动添加到消息文本末尾,才有@的效果,如需自定义在消息文本@的位置,可将参数is_auto_at设置为False即可,同时支持@多个手机号;
  • 2、如果钉钉机器人消息中的图片链接使用Http协议,可以在钉钉客户端正常加载显示,但无法在钉钉网页版显示,需要更改为Https协议;
  • 3、钉钉机器人消息中的链接默认跳转至浏览器打开(即:pc_slide=False),如果需要直接在客户端侧边栏打开,设置pc_slide为True即可;
  • 4、当前钉钉自定义机器人官方尚不支持应答机制(即在群里成员在聊天@机器人),此功能需要使用钉钉企业内部开发机器人实现(即Outgoing机器人;

哥们,更多使用场景,现在尽情展开想象吧...

(如果对你有帮助的话,欢迎*star*)

dingtalkchatbot's People

Contributors

connorrepeat avatar zhuifengshen avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

dingtalkchatbot's Issues

没法艾特所有人了

大佬你好,我最近在使用 DingtalkChatbot,目前在研究 Markdown 的方式来发消息
本来发送的好好的,也能艾特所有人,但是我看了一下参数,有个 is_auto_at 这个参数,我手欠给设置成了 False
之后再取消掉这个参数,即便设置了 at_mobiles 也不是蓝色的艾特,系统也不会弹窗提示。把 is_auto_at 参数设置成 True 后,依旧不会蓝字,钉钉界面里有提示自己被艾特了,但是依旧不会弹窗提示
想问一下这该怎么解决???

在SSH到的远程服务器上不能建立和钉钉机器人的http链接

我得到了钉钉机器人的webhook地址, 我需要在远程服务器上通过钉钉机器人向钉钉群发送消息,但是我发现并不能建立和钉钉机器人的连接,例如send_text()方法一直没有反应,最终提示connection time error.请问一下有解决方法吗

hi,你好可以帮忙看看这个问题嘛HTTPSConnectionPool(host='oapi.dingtalk.com', port=443): Max retries exceeded with url: /robot/send?access_token=xxxxxxxxxxx (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)')))" 我在本地电脑上执行发送没问题,放在服务器上执行就报错了,可以帮忙看看嘛

hi,你好可以帮忙看看这个问题嘛,

HTTPSConnectionPool(host='oapi.dingtalk.com', port=443): Max retries exceeded with url: /robot/send?access_token=xxxxxxxxxxx (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)')))"

我在本地电脑上执行发送没问题,放在服务器上执行就报错了,可以帮忙看看嘛

钉钉机器人最大连接数

只开一个进程,结果今天发现钉钉机器人报错
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='oapi.dingtalk.com', port=443): Max retries exceeded with url: /robot/send?access_token=XX(token隐藏) (Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x0000017F89A71C70>: Failed to establish a new connection: [Errno 11002] getaddrinfo failed'))

During handling of the above exception, another exception occurred:

是钉钉更改了链接数了么?之前没问题的

请问下at_dingtalk_ids的说明

通过outgoing能够获取到@方的dingtalkid ,无法获取手机号码,不能直接通过at_mobiles
但是通过 at_dingtalk_ids 好像不起作用.

有没兴趣开发个async版本的么

非常感谢分享
但在使用过程当中发现每次发完消息之后代码都卡住好久了,然后才发现原来是代码没用异步,
因此建议下大佬可以试试async

关于图片发送的问题

老哥好,我在尝试使用这个机器人发送图片。我发现如果使用本机图片路径好像不支持。我最近尝试先发送一个地址,15分钟后再上传图片好像不支持,消息都显示不出来图片。请问怎么解决这个问题呢?

使用报错 URI TOO LARGE

经过检查代码,应该是self.webhook的问题,由于sign和timestamp的存在,导致每次post消息后,并没有把self.webhook恢复到原来的webhook,而是带上了上一次的timestamp和sign。最终多次发送消息后,导致url过长,钉钉拒绝接受消息。

希望大佬可以换个变量名,稍微改改。

HTTPSConnectionPool(host='oapi.dingtalk.com', port=443): Max retries exceeded with url: /robot/send?access_token=xxxxxxxxxxxxxx (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)')))"

HTTPSConnectionPool(host='oapi.dingtalk.com', port=443): Max retries exceeded with url: /robot/send?access_token=xxxxxxxxxxxxxx (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1123)')))"

我在本地电脑上执行发送没问题,放在服务器上执行就报错了,可以帮忙看看嘛

我安装到linux7.2 不行啊

No package 'libffi' found
c/_cffi_backend.c:15:17: fatal error: ffi.h: No such file or directory
#include <ffi.h>
^
compilation terminated.
error: Setup script exited with error: command 'gcc' failed with exit status 1
[root@localhost DingtalkChatbot-master]# yum install python-devel

初始化错误

xiaoding = DingtalkChatbot(webhook=webhook, secret=secret)
提示错误
xiaoding = DingtalkChatbot(webhook=webhook, secret=secret)
TypeError: init() got an unexpected keyword argument 'secret'

用户发消息到服务端后,回复用户时如何实现@功能

at_dingtalk_ids = ["xxx"]
xiaoding.send_markdown(title='氧气文字', text='#### 广州天气 @xxx \n'
'> 9度,西北风1级,空气良89,相对温度73%\n\n'
'> 美景\n'
'> ###### 10点20分发布 天气 \n',
at_dingtalk_ids=at_dingtalk_ids, is_auto_at=False)

这样使用无效,userId应该如何获取呢?
我暂时从用户post的消息里拿了atUsers里的dingtalkId字段

Py的中文编码问题

用接口获取到文本信息后,在控制台是中文的,推送到企业微信是utf8编码而非中文,企业微信用的是utf8编码

'CardItem' is not defined

按照 https://github.com/zhuifengshen/DingtalkChatbot 里的example,为什么会报错?

sz@air:/mnt/d/coding$ python dd.py
Traceback (most recent call last):
  File "dd.py", line 65, in <module>
    card1 = CardItem(title="氧气美女", url="https://www.dingtalk.com/", pic_url="https://unzippedtv.com/wp-content/uploads/sites/28/2016/02/asian.jpg")
NameError: name 'CardItem' is not defined

有谁能指点下不?

封装此模块的通用模块

这个模块相当好,但还需要再封装成一个通用的模块。代码dingRobotDev.py如下:直接运行此文件python3 dingRobotDev.py 即可运行demo的text模式,发送如果失败,有三次机会发送。不足之处请指正。

#!/usr/env/python3
#encoding=utf-8

from enum import Enum
import time
from dingtalkchatbot.chatbot import DingtalkChatbot
from contextlib import contextmanager
from contextlib import closing

class sendkind(Enum):
text = 't'
link = 'l'
image = 'i'
markdown = 'm'
action_card = 'a'
feed_card = 'f'

class dingRobot(object):
def init(self,webhook='YOURWEBHOOK',secret=None,pc_slide=None,kind=sendkind.text,
msgargs={'msg':'我就是小丁,小丁就是我!','is_at_all':True},retry=3,flag=True):
self.webhook=webhook
self.secret=secret
self.pc_slide=pc_slide
self.kind=kind
print(self.kind)
print(self.kind.value)
print(self.kind.name)
self.msgargs=msgargs
self.retry=retry
self.flag=flag
self.kw = {'secret':self.secret,'pc_slide':self.pc_slide}
#self.xiaoding = None
self.xiaoding = DingtalkChatbot(self.webhook,**self.kw)

def pushMsg(self):
    kindsendfunc = 'self.xiaoding.send_%s'%self.kind.name
    yield eval('%s(**self.msgargs)'%kindsendfunc)

def demo(self):
    for t in range(self.retry):
        time.sleep(4**t)
        with closing(self.pushMsg()) as push:
            print(push)
            for i in push:
                print('in for',i)
        print(i)
        if i['errcode']==0 and i['errmsg']=='ok':
            break

if name == 'main':
dingRobot().demo()

link['messageURL'] = self.msg_open_type(link['messageURL'])

cardItem = CardItem(title=title_list[element],
url=link_list[element],
pic_url=pic_list[element])

USE:
send_feed_card(cards)

ERROR:
File "C:\Users\AppData\Local\Programs\Python\Python38\lib\site-packages\dingtalkchatbot\chatbot.py", line 267, in send_feed_card
link['messageURL'] = self.msg_open_type(link['messageURL'])

python version 3.8.0
lib version 1.5.3

it all works fine until today, perhaps dingtalk offical did some changes?

求助,如何添加钉钉机器人

楼主,请问钉钉群里不让加那个 webhook 的机器人,要如何获取你说的那个地址呢?
我的需求是:
在自己的服务器给某个钉钉群发一个图文消息或图片消息

安装出错?

执行pip install DingtalkChatbot该命令后报错如下:
ERROR: Could not find a version that satisfies the requirement DingtalkChatbot ERROR: No matching distribution found for DingtalkChatbot

相关版本:
Python 3.6.8
Django 1.11.4

证书验证失败

突然间就报错:SSL: CERTIFICATE_VERIFY_FAILED
在requests.post加了verify=False绕过去了,是否要把这个参数暴露出来?提升兼容性?还有更好的解决方案吗?

求问:为什么会出现这种情况?

ERROR:root:消息发送失败,自动通知:{'msgtype': 'text', 'text': {'content': '钉钉机器人消息发送失败,原因:keywords not in content'}, 'at': {'isAtAll': True}}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.