使用 Python 实现一个飞书/微信记账机器人,酷B了!

大家好,我打算每日花1小时来写一篇文章(这篇文章实际耗时约24小时,从了解飞书机器人及相关接口、权限等开始,到调通记账助手),这一小时包括文章主题思考和实现,看看能不能被官方推荐。

今天的主题是:使用Python联动飞书文档+机器人,实现一个专属的记账助手,这篇文章如果对你帮助极大,欢迎你分享给你的朋友、她、他,一起成长。

也欢迎大家留言,说说自己想看什么主题的Python文章,留言越具体,我写的越快,比如留言:我想看Python 自动操作Excel 相关文章。

如果你有具体的需求想通过使用Python实现自动化。

核心逻辑

1、通过关键词触发机器人记账,比如/fs 支出 微信 18 午饭,其中/fs 为触发关键词,后面的四项分别是:类型、支付渠道、金额、备注。

2、机器人识别到关键词,调用飞书记账功能函数,在该函数中对收到内容进行解析,并调用飞书文档接口,将内容写入飞书文档。

3、机器人判断飞书文档写入结果,写入成功则返回记录成功+文档地址;写入失败则返回记录失败+错误信息。

微信效果:

飞书效果:

实践出真知

首先你需要登录飞书APP创建一个企业,这个过程很简单,手机下载飞书APP即可,我这里就不贴图了。

创建一个飞书应用

前提:你已经有了一个飞书帐号,并创建了一个个人企业。

飞书开放平台地址:open.feishu.cn/app/

访问 飞书开放平台,点击创建企业自建应用,输入应用相关信息即可。

创建成功后,在凭证与基础信息中可以看到应用的 App IDApp Secret,后面有用。

点击左侧的添加应用能力,点击添加机器人功能。

没添加这个后面调用会出现如下错误:

点击左侧的权限管理,搜索电子表格,将相关的两个权限勾选开通。

再搜索消息,开通发送接收消息权限,如下图:

再搜索获取用户 user ID,开通获取用户 user_id 权限,如下图:

点击确定并前往创建应用版本

在版本创建页面点击创建版本,然后根据提示输入版本号、更新说明、申请理由即可。

应用管理后台:xxxxx.feishu.cn/admin/appCe…
xxxxx 改成自己的飞书主页域名前缀

访问上面应用管理后台地址,审核通过即可。

对接飞书Excel

首先在飞书文档里创建一个 Excel,获取到Excel 链接,格式如下:

bash
复制代码
https://xxxxxx.feishu.cn/sheets/PQV*****************Uh?sheet=k****Y

其中PQV*****************Uh是spreadsheetToken,k****Y表格名称,用于锁定具体工作表。

本案例我们使用飞书追加数据接口:open.feishu.cn/document/se…

其中请求参数中 Authorization 获取方法如下:

python
复制代码
import requests
import json

def get_access_token():
    url= "https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal/" 
    # 应用凭证里的 app id 和 app secret  
    post_data = {"app_id": "cli_xxxxxxxx", "app_secret": "8xxxxxxxxxxxxxxxxxxk"}
    r = requests.post(url, data=post_data)
    access_token = r.json()["tenant_access_token"] 
    return access_token


header = {
    "Content-Type": "application/json; charset=utf-8", 
    "Authorization": f"Bearer {get_access_token()}"
    }
请求测试
python
复制代码
# 记得换成自己的信息
spreadsheetToken = "Pxxxxxxxxxxxxh"
sheetId = "lxxxxV"
data_raw = {
  "valueRange": {
    "range": f"{sheetId}!A1:E3",
    "values": [
      [
        "2023/12/25",
        "收入",
        "微信",
        "100",
        "帐号 老表max"
      ],
      [
        "2023/12/25",
        "支出",
        "支付宝",
        "10",
        "买东西 老表max"
      ],
      [
        "2023/12/26",
        "支出",
        "支付宝",
        "19.9",
        "买东西 老表max"
      ],
    ]
  }
}
url = f"https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{spreadsheetToken}/values_append"    

r2 = requests.post(url, data=json.dumps(data_raw), headers=header)  #请求写入
print( r2.json()["msg"])  #输出来判断写入是否成功

结果:

记账功能对接到飞书机器人

开通消息事件,接收消息

如果你想对接到飞书,得有一个云服务器用来接收用户发给飞书机器人的消息,并返回处理后的结果给飞书用户。

或者本地部署,然后内网穿透方法也行(不是长久之计)。

开通消息事件之前,需要先在服务器部署一个简单 web 服务用于接收消息,如下图,没啥特别要求,用 flask 快速写一个简单的代码,如下,

python
复制代码
from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/func', methods=['POST'])
def all_func():
    try:
        data = request.json  # 解析收到的 JSON 数据
        print(data)
        if data:
            # 原样返回数据
            return jsonify(data)
        else:
            return "Missing data", 400
    except Exception as e:
        return str(e), 500

if __name__ == '__main__':
    app.run(debug=True, port=8003, host="0.0.0.0")

将上面代码写入服务器的 feishu.py 文件,然后运行python feishu.py 即可,

默认配置链接为:http://你的服务器公网IP:8003/func

然后在飞书管理后台,事件与回调页面配置验证接口是否OK,没问题点保存即可。

然后点击添加事件,搜索接收消息,添加对应事件。

点击开启获取用户发给机器人的单聊消息获取用户在群组中@机器人的消息权限。

然后发布一个新版本。

这时我们从飞书发送消息给机器人,我们就可以在服务器获取到对应消息了。

飞书:

服务器:

飞书主动回复用户实现

在前面实践部分,我们已经开通过了接收消息权限,这里直接上请求代码。

python
复制代码
'''
发送消息
doc-link https://open.feishu.cn/document/server-docs/im-v1/message/create
接口限制:1000 次/分钟、50 次/秒

receive_id_type值:
- 私聊 user_id 
- 群聊 chat_id

msg_type: 
doc-link https://open.feishu.cn/document/server-docs/im-v1/message-content-description/create_json

'''
def fs_send_msg(headers, post_data, receive_id_type):
    url= f"https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type={receive_id_type}"  
    r = requests.post(url, headers=headers, data=json.dumps(post_data))
    result = r.json()
    return result

测试请求:

python
复制代码
# 这里 user_id 可以怎么获取?
# 在前面`消息事件`返回结果里面有,可以从里面获取
receive_id_type = "user_id"
receive_id = "xxxxx"
msg_type = "text"
content = "{"text": "你好"}"

post_data = {
      "receive_id": receive_id,
      "msg_type": msg_type,
      "content": content,
      # "uuid": "选填,每次调用前请更换,如a0d69e20-1dd1-458b-k525-dfeca4015204"
    }
result = fs_send_msg(headers, post_data, receive_id_type)

结果: 飞书:

整合代码实现自动记账

逻辑思路:

实现效果:

整合代码较多,源码已分享到 Github,项目地址:github.com/XksA-me/Sim…

对接到微信

通过前面操作,我们已经完成了Python代码和飞书的对接,将该功能加入到机器人就比较简单了。

流程我已经在文章最开头分享了,大家可以根据需要去实践,至于如何开发机器人,大家可以github搜索下相关项目。后面也会将相关实现更新到开源项目中,欢迎关注支持。

这里给大家分享一份Python全套学习资料,包括学习路线、软件、源码、视频、面试题等等,都是我自己学习时整理的,希望可以对正在学习或者想要学习Python的朋友有帮助!

CSDN大礼包:全网最全《全套Python学习资料》免费分享🎁

😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

👉CSDN大礼包🎁:全网最全《Python学习资料》免费分享(安全链接,放心点击)👈

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述
因篇幅有限,仅展示部分资料

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

5️⃣Python兼职渠道

而且学会Python以后,还可以在各大兼职平台接单赚钱,各种兼职渠道+兼职注意事项+如何和客户沟通,我都整理成文档了。
在这里插入图片描述
在这里插入图片描述
上述所有资料 ⚡️ ,朋友们如果有需要 📦《全套Python学习资料》的,可以扫描下方二维码免费领取 🆓
😝有需要的小伙伴,可以点击下方链接免费领取或者V扫描下方二维码免费领取🆓

👉CSDN大礼包🎁:全网最全《Python学习资料》免费分享(安全链接,放心点击)👈

  • 22
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【案例】 【案例】Python飞书机器⼈编辑表格 飞书机器⼈编辑表格 #!/usr/bin/env python # -*- coding: utf-8 -*- from .config import * import requests import json class Bot: def __init__(self, app): self.app = app # app为机器⼈ self.table = None # 共享⽂档的table_id self.sheet = None # 共享⽂档的sheet_id self.token = self.get_token() self.header = { "Authorization": self.token, "Content-Type": "application/json; charset=utf-8" } def get_token(self): """获取应⽤token""" url = url_api['url_token'] headers = {"Content-Type": "text/plain"} r = requests.post(url, headers=headers, json=self.app) return "Bearer " + json.loads(r.text)['tenant_access_token'] def use(self, table, sheet): self.table = table self.sheet = sheet return self def add_data(self, sheet_range="", values=[]): """增加数据,原始数据下移""" data = { "valueRange": { "range": self.sheet + sheet_range, "values": values } } r = requests.post(urls['插⼊数据'] % self.table, headers=self.header, json=data) return r.text def del_data(self, major=0, start_index=1, end_index=1): """删除数据""" data = { "dimension": { "sheetId": self.sheet, "majorDimension": ['ROWS', 'COLUMNS'][major], "startIndex": start_index, "endIndex": end_index } } r = requests.delete(urls['删除数据'] % self.table, headers=self.header, json=data) return r.text def union_cell(self, sheet_range, major=0): """合并单元格""" url = urls['合并单元格'] % self.table data = { "range": self.sheet + sheet_range, "mergeType": ['MERGE_ALL', 'MERGE_ROWS', 'MERGE_COLUMNS'][major] } r = requests.post(url, headers=self.header, json=data) return r.text def split_cell(self, sheet_range): """拆分单元格""" data = { "range": self.sheet + sheet_range } r = requests.post(urls['拆分单元格'] % self.table, headers=self.header, json=data) return r.text def set_style(self, sheet_range, kind): def set_style(self, sheet_range, kind): """设置单元格格式""" data = { "appendStyle": { "range": self.sheet + sheet_range, "style": self.style_list(kind) } } r = requests.put(urls['设置单元格格式'] % self.table, headers=self.header, json=data) return r.text def phone_to_open_id(self, mobile

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值