• python调用飞书机器人发送文件


    当前飞书webhook机器人还不支持发送文件类型的群消息,可以申请创建一个机器人应用来实现群发送文件消息。
    在这里插入图片描述

    在这里插入图片描述

    创建机器人后,需要开通一系列权限,然后发布。由管理员审核通过后,才可使用。

    包括如下的权限,可以获取群的chat_id。
    在这里插入图片描述

    开通权限发布应用后,可以取到两个重要的参数:

    app_id
    app_secret

    使用两个参数可以生成密钥tenant_access_token,

    headers = {‘Authorization’: f’Bearer {get_token()}', ## 获取tenant_access_token, 需要替换为实际的token

    def get_token():
        # 获取tenant_access_token,供上传图片接口使用
        url = "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal"
        headers = {
            "Content-Type": "application/json; charset=utf-8",
        }
        payload_data = {
            "app_id": "cli_xxx",
            "app_secret": "xxx",
        }
        response = requests.post(url=url, data=json.dumps(payload_data), headers=headers).json()
        print(response)
        token = response['tenant_access_token']
        return token```
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    上传文件

    def upload_file(file_path):
        try:
            file_name = file_path.split(',')[0]
            url = "https://open.feishu.cn/open-apis/im/v1/files"
            form = {'file_type': 'stream',
                    'file_name': file_name,
                    'file': (file_name, open(file_path, 'rb'),
                             'text/plain')}  # 需要替换具体的path  具体的格式参考  https://www.w3school.com.cn/media/media_mimeref.asp
            multi_form = MultipartEncoder(form)
            headers = {'Authorization': f'Bearer {get_token()}',  ## 获取tenant_access_token, 需要替换为实际的token
                       }
            headers['Content-Type'] = multi_form.content_type
            r = requests.request("POST", url, headers=headers, data=multi_form)
            print(r.json())
            # print(response.headers['X-Tt-Logid'])  # for debug or oncall
            # print(response.content)  # Print Response
            if r.json().get("code") == 0 and r.json().get("msg") == "success":
                logger.info(f"上传文件到飞书成功,msg={r.json()},{file_path=}")
                media_id = r.json().get('data').get('file_key')
                return media_id
            else:
                logger.warning(f"上传文件到飞书异常,{r.json()=},{file_path=}")
    
            # Press the green button in the gutter to run the script.
    
        except Exception as e:
            # logger.warning("上传文件到企业微信失败")
            print("上传文件到飞书失败")
            print(e)
            # logger.warning(e)
            pass
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    发送文件到群

    def send_file(file_path=None, media_id=""):
        """机器人应用上传文件"""
        if not media_id:
            media_id = upload_file(file_path=file_path)
            time.sleep(1)
        url = 'https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=chat_id'
        msgContent = {
            "file_key": media_id
        }
        form = {
            "content": json.dumps(msgContent),
            "msg_type": "file",
            "receive_id": "oc_xxx"
        }
        headers = {
            'Authorization': 'Bearer ' + get_token()
        }
        response = requests.post(url=url, data=json.dumps(form), headers=headers)
        print(response.json())
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    获取群的chat_id

    def get_qun_list():
        url = 'https://open.feishu.cn/open-apis/im/v1/chats'
        headers = {
            'Authorization': 'Bearer ' + get_token()
        }
        response = requests.get(url=url, headers=headers)
        print(response.json())
        return response.json()['data']['items']
    
    
    def get_ _by_name(qun_name):
        items = get_qun_list()
        for i in items:
            if i.get('name') == str(qun_name):
                print(i.get('chat_id'))
                return i.get('chat_id')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    发送成功
    在这里插入图片描述

  • 相关阅读:
    2023-11-18 Android Linux资源限制命令 ulimit,比如ulimit -d 是设置进程占用的最大数据段大小,默认是unlimited。
    尚好房 05_二手房管理
    hive数仓-数据的质量管理
    基于Vue+SpringBoot的高校学生管理系统 开源项目
    GIt版本回滚的两种方法reset、revert
    Linux安装nginx教程
    好久不见!OneFlow 1.0全新版本上线
    【将文本编码为图像灰度级别】以 ASCII 编码并与灰度级别位混合将文本字符串隐藏到图像像素的最低位中,使其不明显研究(Matlab代码实现)
    从实际案例聊聊Java应用的GC优化
    最强肉坦:RUST多线程
  • 原文地址:https://blog.csdn.net/weixin_45476498/article/details/134181674