当前位置: 首页 > article >正文

笔记:使用python对飞书用户活跃度统计的一个尝试

说明
一个python练习
代码

import json
import time
import openpyxl
from openpyxl import load_workbook
from datetime import datetime, timedelta
import lark_oapi as lark
from lark_oapi.api.admin.v1 import *

def data_r(start_date, end_date):
    r_data = []
    client = lark.Client.builder() \
        .app_id("app-id") \
        .app_secret("app-secret") \
        .build()
    num = 1
    more = True
    token = ''
    while more:
        if num == 1:
            request: ListAdminUserStatRequest = ListAdminUserStatRequest.builder() \
                .user_id_type("user_id") \
                .department_id_type("department_id") \
                .start_date(start_date) \
                .end_date(end_date) \
                .department_id("id——num") \
                .page_size(60) \
                .build()
            num = num + 1
        else:
            request: ListAdminUserStatRequest = ListAdminUserStatRequest.builder() \
                .user_id_type("user_id") \
                .department_id_type("department_id") \
                .start_date(start_date) \
                .end_date(end_date) \
                .department_id("id——num") \
                .page_size(60) \
                .page_token(token) \
                .build()
            num = num + 1
        response: ListAdminUserStatResponse = client.admin.v1.admin_user_stat.list(request)
        # 处理失败返回
        if not response.success():
            lark.logger.error(
                f"client.admin.v1.admin_user_stat.list failed, code: {response.code}, msg: {response.msg}, log_id: {response.get_log_id()}, resp: \n{json.dumps(json.loads(response.raw.content), indent=4, ensure_ascii=False)}")
            return
        more = response.data.has_more
        token = response.data.page_token
        items_j = lark.JSON.marshal(response.data, indent=4)
        items = json.loads(items_j)
        for item in items['items']:
            o_data = [item['date'], item['user_name'], item['user_id'], item['department_path'], item['suite_active_flag'], item['last_active_time']]
            r_data.append(o_data)
    return r_data

def p2excel(wbname, wsname, l_value):
    wb = load_workbook(wbname)
    ws = wb[wsname]
    for a in l_value:
        ws.append(a)
    wb.save(wbname)

def main():
    start_date_s = '2024-07-01'
    end_date_s = '2024-12-31'
    format_str = '%Y-%m-%d'
    start_date = datetime.strptime(start_date_s, format_str)
    end_date = datetime.strptime(end_date_s, format_str)
    # 数据表表头
    wb_header = [['时间', '用户名', '用户id', '部门路径', '活跃状态', '最近活跃时间']]
    nowdt = time.strftime("%Y-%m-%d-%H%M%S", time.localtime())
    print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), ":创建文件")
    # 文件名
    wbname = '飞书活跃用户数据_' + nowdt + '.xlsx'
    # sheet 名
    wsname = '活跃用户数据'
    # 创建表格
    log_wb = openpyxl.Workbook()
    log_ws = log_wb.create_sheet(wsname, 0)
    log_wb.save(wbname)
    print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), ":加入表头")
    # 加入表头
    p2excel(wbname, wsname, wb_header)
    # 数据插入
    print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), ":开始数据插入:")
    while start_date <= end_date:
        result = []
        next_date = start_date + timedelta(days=31)
        if next_date > end_date:
            next_date = end_date
        print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), ":", start_date.strftime(format_str), "-", next_date.strftime(format_str))
        print('获取数据')
        result = data_r(start_date.strftime(format_str), next_date.strftime(format_str))
        print('插入数据')
        p2excel(wbname, wsname, result)
        print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), ":", start_date.strftime(format_str), "-",
              next_date.strftime(format_str), '  完成')
        start_date = next_date + timedelta(days=1)


if __name__ == "__main__":
    main()

http://www.kler.cn/a/455679.html

相关文章:

  • 六十:HTTP/2与gRPC框架
  • python装饰器学习案例
  • Python einops库介绍
  • Web安全攻防入门教程——hvv行动详解
  • RustDesk内置ID服务器,Key教程
  • MetaRename for Mac,适用于 Mac 的文件批量重命名工具
  • Go Redis实现排行榜
  • 神经网络-ResNet
  • 【社区投稿】自动特征auto trait的扩散规则
  • Effective C++ 条款32:确定你的 public 继承塑模出 is-a 关系
  • Pytorch | 利用IE-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
  • 如何在 Spring Boot 微服务中设置和管理多个数据库
  • 对外发PDF设置打开次数
  • Python机器学习笔记(十五、聚类算法的对比和评估)
  • 【JavaEE进阶】@RequestMapping注解
  • 《一文读懂BP神经网络:从原理到应用》
  • redis中,msyql数据库读写分离搭建
  • Gitlab17.7+Jenkins2.4.91实现Fastapi/Django项目持续发布版本详细操作(亲测可用)
  • C语言-结构体嵌套
  • 服务器数据恢复—Lustre分布式文件系统下服务器节点进水的数据恢复案例
  • 【网络工程师教程】六、网络互联与互联网
  • github codespaces推送镜像时unauthorized: access token has insufficient scopes 解决方法
  • 云服务器yum无法解析mirrorlist.centos.org
  • 网安瞭望台第17期:Rockstar 2FA 故障催生 FlowerStorm 钓鱼即服务扩张现象剖析
  • oracle基础:理解 Oracle SQL 中的 WHERE 后的 (+) 用法
  • 在k8s上使用strimzi operator安装kafka集群