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

news2024/11/16 9:28:01

当前飞书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```


上传文件

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

发送文件到群

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())

获取群的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')

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1163796.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

项目实战:封装响应结果以及抽取响应代码到工具类

1、创建GsonUtil工具类,封装把java对象转成json字符串方法 package com.csdn.fruit.util; import com.google.gson.Gson; public class GsonUtil {public static String toJson(Object obj) {//java object -> java json stringGson gson new Gson();return gs…

Kibana中使用Dev Tools控制台创建索index引同时添加date类型的时间参数(用于根据时间序列展示数据)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

Jmeter参数化 —— 循环断言多方法

1、参数化接口测试数据 注意:csv文档参数化,里面有多少条数据,就要在线程组里循环多少次,不然就只执行一次 2、添加配置元件-计数器 关于计数器: ①Starting Value:给定计数器的初始值; ②递增&#xff1a…

listFiles()为null原因

调用listFiles为null原因 前言一、错误原因二、正确使用方法 前言 今天笔者在对File文件进行listFiles方法调用时,发现报错返回空指针异常,下面是列举的可能出现的错误的原因。 一、错误原因 不能对文件进行listFiles方法调用 二、正确使用方法 对文件夹…

TSINGSEE青犀景区AI智慧监管平台,赋能文旅行业高质量发展

一、背景需求分析 随着我国旅游经济的蓬勃发展,旅游行业逐渐成为国民经济增长的支柱性产业。“十四五”期间,国内旅游业将从高速增长阶段转向高质量发展阶段,与此同时,旅游景区的安全生产工作也迎来了新的挑战和需求。尤其是节假…

Ceph:关于Ceph 中创建和管理自定义 CRUSH Map

写在前面 准备考试,整理 Ceph 相关笔记博文内容涉及,管理和定制CRUSH Map以及管理OSD Map理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所…

python requests模块的使用以及网页信息爬取

python requests模块的使用以及网页信息爬取 文章目录 python requests模块的使用以及网页信息爬取网页信息爬取REQUEST模块模块中的请求方法请求方法中的参数响应对象中属性 获取网站中的源代码获取图片地址匹配单个字符匹配一组字符其他元字符核心函数 图片下载 requests 模块…

经验总结2023-11-2

axios发起post请求的方式: 要解决跨域问题,后端要加,指定支持的方法是Pos还是get:

leetCode 198.打家劫舍 动态规划入门:从记忆化搜索到递推

leetCode 198.打家劫舍 198. 打家劫舍 - 力扣(LeetCode) 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一…

地空智能国产化RTS无线探地雷达

广东地空智能科技有限公司推出的国产RTS无线探地雷达,是国内首款基于实时采样、高叠加技术的无线连接的探地雷达。RTS系列雷达是主机、天线一体化设计,32Bit数据,内部配置WiFi基站,无线传输距离≥100M,1000mAh进口电芯…

十九、类型信息(6)

接口和类型 interface 关键字的一个重要目标就是允许程序员隔离组件,进而降低耦合度。使用接口可以实现这一目标,但是通过类型信息,这种耦合性还是会传播出去——接口并不是对解耦的一种无懈可击的保障。比如我们先写一个接口: …

Java实验二类编程实验

1.编写一个代表三角形的类(Triangle.java)。 其中,三条边a,b,c(数据类型为double类型)为三角形的属性,该类封装有求三角形的面积和周长的方法。分别针对三条边为3、4、5和7、8、9的两个三角形进行测试&…

软件测试:postman使用总结

一、为何使用postman postman是一款简单高效的接口测试工具,能够很方便发送接口请求,易于保存接口请求脚本,postman提供接口响应数据比对功能,可以设置预期结果作断言,还能把测试用例放在一个集合中批量执行&#xff…

七月论文审稿GPT第二版:从Meta Nougat、GPT4审稿到mistral、llama longlora

前言 如此前这篇文章《学术论文GPT的源码解读与微调:从chatpaper、gpt_academic到七月论文审稿GPT》中的第三部分所述,对于论文的摘要/总结、对话、翻译、语法检查而言,市面上的学术论文GPT的效果虽暂未有多好,可至少还过得去&am…

图论问题建模和floodfill算法

目录 引入:leetcode695.岛屿的最大面积 分析与转换 一维二维转换 四联通 完整代码解答: 1)显示的创建图解决问题的代码 2)不显示的创建图解决此问题的代码 floodfill算法 定义 引入:leetcode695.岛屿的最大面…

精准测试:提高软件质量和用户满意度的利器

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

c语言练习(9周)(16~20)

输入12个一位整数,创建二维数组a[3][4],显示二维数组及各列的平均值,平均值四舍五入到小数点后一位。 题干输入12个一位整数,创建二维数组a[3][4],显示二维数组及各列的平均值,平均值四舍五入到小数点后一…

华为云服务器,在线安装MySQL

需求 在华为云服务器上,部署MySQL数据库,通过 公网IP 访问数据库。 通过 yum ,在线安装MySQL;配置远程连接,开放3306端口,能够通过公网访问。 云服务器配置说明 本文所使用的 华为云服务器 配置如下。 …

有关常见的#define定义的函数的陷阱和修正(详解)

一、#define f(x) x*x #include<stdio.h> #define f(x) x*x int main() {int a6,b2,c;cf(a)/f(b);printf("f(a)%d\n",f(a));//6*6printf("f(b)%d\n",f(b));//2*2printf("f(b1)%d\n",f(b1));//21*21; printf("f(b2)%d\n",f(b2))…

如何回答好“测得怎么样了?”

有测试员抱怨开发很糟糕&#xff0c;但我们没办法要求开发在会写代码的同时还要把代码写好&#xff0c;没有过多的bug&#xff0c;因为这就是我们的工作&#xff1b;测试员吐槽自己的老板很较真&#xff0c;但我们没办法拒绝领导们的批评指责&#xff0c;因为批评代表我们还有继…