
官网API:https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/im-v1/guide/faq class FeishuBotChat(): def __init__(self,webhook): self.webhook = webhook #获取飞书创建的应用的token,飞书-工作台-创建应用-凭证与基础信息获取appid和appSecret def query_token(self): url="https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal" payload={ "app_id": "cli_a387080afc7b905c", "app_secret": "0IoNjEQgCw4n8cv5uV16yfl2aNVjqcaA" } res = requests.request('POST',url=url,data=payload) return res.json()["tenant_access_token"] # 通过飞书手机号获取用户的user_id,前提是开通权限,消息与群体 def query_one_uesrid(self,mobile): url = 'https://open.feishu.cn/open-apis/contact/v3/users/batch_get_id?user_id_type=open_id' payload = json.dumps({ "mobiles": [mobile] }) token=self.query_token() header = {'Authorization': f'Bearer {token}', 'Content-Type': 'application/json'} res = requests.request('POST', url=url, headers=header, data=payload) if res.json()["data"] and "user_id" in res.json()["data"]["user_list"][0]: return res.json()["data"]["user_list"][0]["user_id"] else: user_id = "" return user_id # 根据邮箱或手机号获取飞书userid----暂时只支持手机号 def query_userid_dict(self, **phone_dict): """ :param token: 飞书创建应用对应的token :param phone_list: 字典,人名:手机号简直对 :return: """ url = 'https://open.feishu.cn/open-apis/contact/v3/users/batch_get_id?user_id_type=open_id' mobiles = [] name_uesrid = {} userid_list = [] for onephone in phone_dict.values(): mobiles.append(onephone) json = {"mobiles": mobiles} token = self.query_token() header = {'Authorization': f'Bearer {token}', 'Content-Type': 'application/json'} try: res = requests.request("POST", url=url, headers=header, json=json) res = res.json() user_list = res['data']['user_list'] for mobile_userid in user_list: #列表转换字典,后续可赋值使用 for k, v in phone_dict.items(): if v == mobile_userid["mobile"]: name = k name_uesrid[name] = mobile_userid["user_id"] #字典赋值,name=userId userid_list.append(mobile_userid["user_id"]) #列表追加userId else: continue return name_uesrid, userid_list else: return name_uesrid, userid_list except Exception as e: print(e) def send_feishu_text(self, msg, isSign=True, is_at_all=False, at_userid=[], is_auto_at=True): """ text类型 :param msg: 消息内容 :param isSign:是否验签,可调用自定义的signSh256验签方法 :param is_at_all: @所有人时:true,否则为false(可选) :param at_userid: 被@人的userid(注意:可以在msg内容里自定义@userid的位置,也支持同时@多个userid,可选) :param is_auto_at: 是否自动在msg内容末尾添加@手机号,默认自动添加,可设置为False取消(可选) :return: 返回消息发送结果 """ inData = { "timestamp":"timestamp", "sign":"sign", "msg_type": "text", "content":{"text": msg} } if isSign: #判断是否需要验签 timestamp,sign=signSh256() # 请求参数 inData["timestamp"]=timestamp inData["sign"] = sign # 判断是否单独 @ 某人 if at_userid: atuserid = '' for i in range(0, len(at_userid)): atuserid = atuserid + f'<at user_id=\"{at_userid[i]}\"></at>' if is_auto_at: # 是否自动在msg内容末尾添加@手机号,默认自动添加,可设置为False取消(可选) inData["content"]["text"] = f'{msg}' + f"{atuserid}" #判断是否@全员,如果入参is_at_all=True则进行@,否则不@ if is_at_all: # @所有人发送信息 content_text = f'<at user_id=\"all\">所有人</at>' + f"{msg}" inData["content"] =json.dumps({"text": content_text}) resp = requests.request("POST", self.webhook, headers={"Content-Type":'application/json'}, data=json.dumps(inData)) return resp.json() print(xiaoshu.send_feishu_text(msg, isSign=True, at_userid=userid_list)) print(xiaoshu.send_feishu_text(msg, isSign=True, is_at_all=True))
所有人的温柔,都是柔软生的茧。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 我与微信审核的“相爱相杀”看个人小程序副业
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求