123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- import os
- import uuid
- from typing import Any, Dict, Optional
- import lark_oapi as lark
- from lark_oapi.core.enum import LogLevel
- import config
- class FeiShu:
- def __init__(self, file_token:str = None):
- app_id = os.getenv('FEISHU_APP_ID', config.FEISHU_APP_ID)
- app_secret = os.getenv('FEISHU_APP_SECRET', config.FEISHU_APP_SECRET)
- self.file_token = file_token if file_token is not None else os.getenv('FEISHU_FILE_TOKEN')
- self.client = (lark.client.Client().builder()
- .app_id(app_id)
- .app_secret(app_secret)
- .log_level(LogLevel.INFO)
- .build())
- def create_table(self, name: str) -> str:
- request = (lark.bitable.v1.CreateAppTableRequest.builder()
- .app_token(self.file_token)
- .request_body(lark.bitable.v1.CreateAppTableRequestBody.builder()
- .table(lark.bitable.v1.ReqTable.builder()
- .name(name)
- .fields([
- lark.bitable.v1.AppTableCreateHeader.builder().field_name('原文链接').type(15).build(),
- lark.bitable.v1.AppTableCreateHeader.builder().field_name('抓取结果').type(1).build(),
- lark.bitable.v1.AppTableCreateHeader.builder().field_name('标题').type(1).build(),
- lark.bitable.v1.AppTableCreateHeader.builder().field_name('用户链接').type(15).build(),
- lark.bitable.v1.AppTableCreateHeader.builder().field_name('识别结果').type(1).build(),
- lark.bitable.v1.AppTableCreateHeader.builder().field_name('初步理解').type(1).build(),
- lark.bitable.v1.AppTableCreateHeader.builder().field_name('物理聚合').type(1).build(),
- ])
- .build())
- .build())
- .build())
- response = self.client.bitable.v1.app_table.create(request)
- if not response.success():
- raise RuntimeError(f'多维表格创建新数据表失败: {lark.JSON.marshal(response.error)}')
- return response.data.table_id
- def get_all_records(self, table_id: str, page_token: Optional[str] = None):
- request = (lark.bitable.v1.SearchAppTableRecordRequest.builder()
- .app_token(self.file_token)
- .table_id(table_id)
- .user_id_type('open_id')
- .page_size(500)
- .request_body(lark.bitable.v1.SearchAppTableRecordRequestBody.builder()
- .automatic_fields(True)
- .build()))
- if page_token:
- request = request.page_token(page_token)
- request = request.build()
- response = self.client.bitable.v1.app_table_record.search(request)
- if not response.success():
- raise RuntimeError(f'获取多维表格记录失败: {lark.JSON.marshal(response.error)}')
- return response.data
- def get_record(self, table_id: str, *record_ids: str):
- request = (lark.bitable.v1.BatchGetAppTableRecordRequest.builder()
- .app_token(self.file_token)
- .table_id(table_id)
- .request_body(lark.bitable.v1.BatchGetAppTableRecordRequestBody.builder()
- .record_ids(list(record_ids))
- .user_id_type('open_id')
- .with_shared_url(True)
- .automatic_fields(True)
- .build())
- .build())
- response = self.client.bitable.v1.app_table_record.batch_get(request)
- if not response.success():
- raise RuntimeError(f'获取多维表格指定记录失败: {lark.JSON.marshal(response.error)}')
- return response.data
- def create_record(self, table_id: str, *fields: Dict[str, Any]):
- request = (lark.bitable.v1.BatchCreateAppTableRecordRequest.builder()
- .app_token(self.file_token)
- .table_id(table_id)
- .user_id_type('open_id')
- .client_token(str(uuid.uuid4()))
- .ignore_consistency_check(False)
- .request_body(lark.bitable.v1.BatchCreateAppTableRecordRequestBody.builder()
- .records([lark.bitable.v1.AppTableRecord.builder()
- .fields(item)
- .build() for item in fields])
- .build())
- .build())
- response = self.client.bitable.v1.app_table_record.batch_create(request)
- if not response.success():
- raise RuntimeError(f'向多维表格添加记录失败: {lark.JSON.marshal(response.error)}')
- return response.data
- def update_record(self, table_id: str, *records: lark.bitable.v1.AppTableRecord):
- request = (lark.bitable.v1.BatchUpdateAppTableRecordRequest.builder()
- .app_token(self.file_token)
- .table_id(table_id)
- .user_id_type('open_id')
- .ignore_consistency_check(False)
- .request_body(lark.bitable.v1.BatchUpdateAppTableRecordRequestBody.builder()
- .records(list(records))
- .build())
- .build())
- response = self.client.bitable.v1.app_table_record.batch_update(request)
- if not response.success():
- raise RuntimeError(f'更新多维表格指定记录失败: {lark.JSON.marshal(response.error)}')
- return response.data
- def delete_record(self, table_id: str, *record_ids: str):
- request = (lark.bitable.v1.BatchDeleteAppTableRecordRequest.builder()
- .app_token(self.file_token)
- .table_id(table_id)
- .request_body(lark.bitable.v1.BatchDeleteAppTableRecordRequestBody.builder()
- .records(list(record_ids))
- .build())
- .build())
- response = self.client.bitable.v1.app_table_record.batch_delete(request)
- if not response.success():
- raise RuntimeError(f'删除多维表格指定记录失败: {lark.JSON.marshal(response.error)}')
- return response.data
- if __name__ == '__main__':
- from dotenv import load_dotenv
- try:
- load_dotenv()
- except ImportError:
- raise RuntimeError('导入环境变量失败')
- feishu = FeiShu()
- # 创建数据表
- new_table_id = feishu.create_table('测试数据表')
- # 新增记录
- new_fields = [
- {
- '原文链接': {
- 'link': 'https://www.baidu.com',
- 'text': 'https://www.baidu.com',
- },
- '抓取结果': '这是抓取结果1',
- },
- {
- '原文链接': {
- 'link': 'https://www.qq.com',
- 'text': 'https://www.qq.com',
- },
- '抓取结果': '这是抓取结果2',
- }
- ]
- feishu.create_record(new_table_id, *new_fields)
- # 获取全部记录
- get_result = feishu.get_all_records(new_table_id)
- has_more = get_result.has_more # 是否有下一页
- next_page_token = get_result.page_token # 下一页token
- new_record_ids = []
- for record in get_result.items:
- new_record_ids.append(record.record_id)
- print(record.fields)
- # 更新记录
- new_record = (lark.bitable.v1.AppTableRecord.builder()
- .record_id(new_record_ids[0])
- .fields({'识别结果': '这是识别结果'})
- .build())
- feishu.update_record(new_table_id, new_record)
- # 获取指定ID记录
- get_result = feishu.get_record(new_table_id, *new_record_ids)
- for record in get_result.records:
- new_record_ids.append(record.record_id)
- print(record.fields)
- # 删除指定ID记录
- feishu.delete_record(new_table_id, new_record_ids[1])
|