open-dingtalk / dingtalk-stream-sdk-python

Python SDK for DingTalk Stream Mode API, Compared with the webhook mode, it is easier to access the DingTalk chatbot
MIT License
63 stars 20 forks source link

能否支持和添加基于互动卡片高级版的库方法 ? #16

Closed dellnoantechnp closed 1 year ago

dellnoantechnp commented 1 year ago

看了下 chatbot.py 源码,似乎只支持互动卡片标准版的库方法,ChatbotHandler.reply_card() 方法没有开放cardTemplateId字段的注入,无法使用在 https://open-dev.dingtalk.com/fe/card 上编辑的自定义卡片模板ID 。

reply_card() 方法的切面:

    def reply_card(self,
                   card_data: dict,
                   incoming_message: ChatbotMessage,
                   at_sender: bool = False,
                   at_all: bool = False) -> str:
        """
        回复互动卡片。由于sessionWebhook不支持发送互动卡片,所以需要使用OpenAPI,当前仅支持自建应用。
        https://open.dingtalk.com/document/orgapp/robots-send-interactive-cards
        :param card_data: 卡片数据内容,interactive_card.py中有一些简单的样例,高阶需求请至卡片搭建平台:https://card.dingtalk.com/card-builder
        :param incoming_message: 回调数据源
        :param at_sender: 是否at发送人
        :param at_all: 是否at所有人
        :return:
        """
    .....

cardbot.py demo 中将原有的self.reply_markdown_card() 方法调用修改为如下所示:

    def process(self, callback: dingtalk_stream.CallbackMessage):
        incoming_message = dingtalk_stream.ChatbotMessage.from_dict(callback.data)

        card_instance = self.reply_card(INTERACTIVE_CARD_JSON_SAMPLE_3, incoming_message)

程序开启DEBUG模式,将ChatbotHandler.reply_card()处打断点暂停,手动修改body属性值的cardTemplateId字段值为开发后台创建的模板ID字符串,然后修改card_data属性为{"cardParamMap": {"var1": "value1"}},然后往下执行,在客户端上收到空参数模板的卡片弹出,

根据官方文档教程示例,得知互动卡片高级版的接口地址为POST /v1.0/card/instance/createAndDeliver,本库中的reply_card() 方法的 url-path/v1.0/im/v1.0/robot/interactiveCards/send ,和示例文档不匹配。

或者我的使用方法有什么错误?

dellnoantechnp commented 1 year ago
error=404 Client Error: Not Found for url: https://api.dingtalk.com/v1.0/card/instance/createAndDeliver

这个 https://api.dingtalk.com/v1.0/card/instance/createAndDeliver api 貌似是404,莫非这教程已经过时 ??

人麻了。。。 🥲

chzealot commented 1 year ago

这个 SDK 是 Stream 模式的 SDK,不是卡片 SDK。在 Stream SDK 中封装了常见的文本、markdown、普通版卡片只是为了常见接口快速集成。更丰富的接口调用推荐采用 API SDK,而不是 Stream SDK。关于钉钉 SDK 可以参考这篇 SDK 汇总文档

chzealot commented 1 year ago
error=404 Client Error: Not Found for url: https://api.dingtalk.com/v1.0/card/instance/createAndDeliver

这个 https://api.dingtalk.com/v1.0/card/instance/createAndDeliver api 貌似是404,莫非这教程已经过时 ??

人麻了。。。 🥲

这是最新的接口文档,还处于可用状态。 404 不代表接口不可用,有可能是请求参数中机器人 RobotCode 不存在、卡片 ID 不存在等问题导致的异常。 可以将请求上下文信息通过技术支持提交反馈寻求帮助。

ginping commented 8 months ago

看了下 chatbot.py 源码,似乎只支持互动卡片标准版的库方法,ChatbotHandler.reply_card() 方法没有开放cardTemplateId字段的注入,无法使用在 https://open-dev.dingtalk.com/fe/card 上编辑的自定义卡片模板ID 。

reply_card() 方法的切面:

    def reply_card(self,
                   card_data: dict,
                   incoming_message: ChatbotMessage,
                   at_sender: bool = False,
                   at_all: bool = False) -> str:
        """
        回复互动卡片。由于sessionWebhook不支持发送互动卡片,所以需要使用OpenAPI,当前仅支持自建应用。
        https://open.dingtalk.com/document/orgapp/robots-send-interactive-cards
        :param card_data: 卡片数据内容,interactive_card.py中有一些简单的样例,高阶需求请至卡片搭建平台:https://card.dingtalk.com/card-builder
        :param incoming_message: 回调数据源
        :param at_sender: 是否at发送人
        :param at_all: 是否at所有人
        :return:
        """
    .....

cardbot.py demo 中将原有的self.reply_markdown_card() 方法调用修改为如下所示:

    def process(self, callback: dingtalk_stream.CallbackMessage):
        incoming_message = dingtalk_stream.ChatbotMessage.from_dict(callback.data)

        card_instance = self.reply_card(INTERACTIVE_CARD_JSON_SAMPLE_3, incoming_message)

程序开启DEBUG模式,将ChatbotHandler.reply_card()处打断点暂停,手动修改body属性值的cardTemplateId字段值为开发后台创建的模板ID字符串,然后修改card_data属性为{"cardParamMap": {"var1": "value1"}},然后往下执行,在客户端上收到空参数模板的卡片弹出,

根据官方文档教程示例,得知互动卡片高级版的接口地址为POST /v1.0/card/instance/createAndDeliver,本库中的reply_card() 方法的 url-path/v1.0/im/v1.0/robot/interactiveCards/send ,和示例文档不匹配。

或者我的使用方法有什么错误?

可以先根据机器人接收到的消息 incoming_message 实例化一个 dingtalk_stream.CardReplier,然后调用 create_and_send_card 方法并传入互动卡片高级版搭建的 card_template_id 以及初始化的 card_data 创建并发送卡片。