当前飞书webhook机器人还不支持发送文件类型的群消息,可以申请创建一个机器人应用来实现群发送文件消息。
创建机器人后,需要开通一系列权限,然后发布。由管理员审核通过后,才可使用。
开通权限发布应用后,可以取到两个重要的参数:
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')