dingtalk.model.message 源代码

# -*- coding: utf-8 -*-
from __future__ import absolute_import, unicode_literals

from dingtalk.core.utils import to_text


class BodyBase(object):

    _msgtype = None

    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            if callable(v):
                v = v()
            setattr(self, k, v)

    def get_dict(self):
        assert self._msgtype
        return {'msgtype': self._msgtype, self._msgtype: self.get_data()}

    def get_data(self):
        ret = {}
        for k in dir(self):
            if k.startswith('_'):
                continue
            v = getattr(self, k, None)
            if v is None or hasattr(v, '__call__'):
                continue
            if v is not None:
                if isinstance(v, BodyBase):
                    v = v.get_data()
                ret[k] = v
        return ret


[文档]class TextBody(BodyBase): _msgtype = 'text' content = None
[文档] def __init__(self, content, **kwargs): """ 文本消息 :param content: 消息内容 :param kwargs: """ super(TextBody, self).__init__(content=content, **kwargs)
[文档]class FileBody(BodyBase): _msgtype = 'file' media_id = None
[文档] def __init__(self, media_id, **kwargs): """ 文件消息 :param media_id: 媒体文件id,可以调用上传媒体文件接口获取。10MB :param kwargs: """ super(FileBody, self).__init__(media_id=media_id, **kwargs)
[文档]class ImageBody(FileBody): _msgtype = 'image'
[文档] def __init__(self, media_id, **kwargs): """ 图片消息 :param media_id: 图片媒体文件id,可以调用上传媒体文件接口获取。建议宽600像素 x 400像素,宽高比3:2 :param kwargs: """ super(FileBody, self).__init__(media_id=media_id, **kwargs)
[文档]class VoiceBody(FileBody): _msgtype = 'voice' duration = None
[文档] def __init__(self, media_id, duration=None, **kwargs): """ 语音消息 :param media_id: 语音媒体文件id,可以调用上传媒体文件接口获取。2MB,播放长度不超过60s,AMR格式 :param duration: 正整数,小于60,表示音频时长 :param kwargs: """ super(VoiceBody, self).__init__(media_id=media_id, duration=duration, **kwargs)
[文档]class LinkBody(BodyBase): _msgtype = 'link' messageUrl = None title = None text = None picUrl = None
[文档] def __init__(self, message_url, pic_url, title, text, **kwargs): """ 超链接消息 :param message_url: 消息点击链接地址 :param pic_url: 图片媒体文件id,可以调用上传媒体文件接口获取 :param title: 消息标题 :param text: 消息描述 """ super(LinkBody, self).__init__(messageUrl=message_url, picUrl=pic_url, title=title, text=text, **kwargs)
[文档]class MarkdownBody(BodyBase): _msgtype = "markdown" title = None text = None
[文档] def __init__(self, title, text, **kwargs): """ markdown消息 :param title: 首屏会话透出的展示内容 :param text: markdown格式的消息 :param kwargs: """ super(MarkdownBody, self).__init__(title=title, text=text, **kwargs)
[文档]class OaBodyContent(BodyBase): title = None _forms = None rich = None content = None image = None file_count = None author = None
[文档] def __init__(self, title=None, content=None, author=None, image=None, file_count=None, forms=dict, rich_num=None, rish_unit=None, **kwargs): """ OA消息 消息体 :param title: 消息体的标题 :param content: 消息体的内容,最多显示3行 :param author: 自定义的作者名字 :param image: 消息体中的图片media_id :param file_count: 自定义的附件数目。此数字仅供显示,钉钉不作验证 :param forms: 消息体的表单 :param rich_num: 单行富文本信息的数目 :param rish_unit: 单行富文本信息的单位 :param kwargs: """ rich = None if rich_num is not None or rish_unit is not None: rich = {'num': rich_num, 'unit': rish_unit} super(OaBodyContent, self).__init__(title=title, content=content, author=author, image=image, file_count=file_count, _forms=forms, rich=rich, **kwargs)
@property def form(self): if not self._forms: return None ret = [] for k, v in self._forms.items(): ret.append({"key": k, "value": v}) return ret
[文档]class OaBody(BodyBase): _msgtype = 'oa' message_url = None pc_message_url = None head = None body = None
[文档] def __init__(self, message_url, head_bgcolor, head_text, body, pc_message_url=None, **kwargs): """ OA消息 :param message_url: 客户端点击消息时跳转到的H5地址 :param head_bgcolor: 消息头部的背景颜色。长度限制为8个英文字符,其中前2为表示透明度,后6位表示颜色值。不要添加0x :param head_text: 消息的头部标题(向普通会话发送时有效,向企业会话发送时会被替换为微应用的名字),长度限制为最多10个字符 :param body: OaBodyContent OA消息 消息体 :param pc_message_url: PC端点击消息时跳转到的H5地址 :param kwargs: """ super(OaBody, self).__init__(message_url=message_url, head={"bgcolor": head_bgcolor, "text": head_text}, body=body, pc_message_url=pc_message_url, **kwargs)
class ActionCardBody(BodyBase): _msgtype = 'action_card' title = None markdown = None def __init__(self, title, markdown, **kwargs): super(ActionCardBody, self).__init__(title=title, markdown=markdown, **kwargs)
[文档]class SingleActionCardBody(ActionCardBody): single_title = None single_url = None
[文档] def __init__(self, title, markdown, single_title, single_url, **kwargs): """ 整体跳转ActionCard消息 :param title: 透出到会话列表和通知的文案 :param markdown: 消息内容,支持markdown :param single_title: 标题 :param single_url: 链接url :param kwargs: """ super(SingleActionCardBody, self).__init__(title=title, markdown=markdown, single_title=single_title, single_url=single_url, **kwargs)
[文档]class BtnActionCardBody(ActionCardBody): btn_orientation = None btn_json_list = None
[文档] def __init__(self, title, markdown, btn_orientation, btn_list=(), **kwargs): """ 独立跳转ActionCard消息 :param title: 透出到会话列表和通知的文案 :param markdown: 消息内容,支持markdown :param btn_orientation: 按钮排列方式,竖直排列(0),横向排列(1) :param btn_json_list: 按钮列表 :param kwargs: """ btn_orientation = to_text(btn_orientation) assert btn_orientation in ('0', '1') super(BtnActionCardBody, self).__init__(title=title, markdown=markdown, btn_orientation=btn_orientation, btn_json_list=list(btn_list), **kwargs)
[文档] def add_btn(self, title, action_url): """ 添加按钮 :param title: 标题 :param action_url: 链接url :return: """ assert isinstance(self.btn_json_list, list) self.btn_json_list.append({'title': title, 'action_url': action_url})