吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 954|回复: 2
收起左侧

[Python 原创] uniapp数据统计及发送报表到企业微信

[复制链接]
suizhi 发表于 2025-7-22 14:43
uniapp统计自己所需要的数据并发送到企业微信。
进行简单的uniapp对应的账号信息即可完成统计,格式、数据内容,随意调整。
如果需要做定时发送的话自行百度Python定时运行的配置,这个比较简单。
代码以学习交流为主:handshake
如有疑问,随时交流。
全部完整代码如下:
get_data.py:需配置企业微信key,如果发送到其他平台自行接入对应机器人。
[Python] 纯文本查看 复制代码
import base64
import hashlib
import random
import time

import requests
import xlwt
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
from matplotlib.ticker import MultipleLocator

import req_uni


qywx_key = ''  #企业微信机器人key
ra = random.randint(0, 63)


def tongji():
    total_list = list()
    a = req_uni.login()
    total_list.append(a)
    aps = req_uni.apps_overview()
    total_list.append(aps)
    ov = req_uni.overview()
    total_list.append(ov)
    de = req_uni.detail()
    total_list.append(de)
    pl = req_uni.platform_pie_d_new()
    total_list.append(pl)
    pd = req_uni.platform_pie_d()
    total_list.append(pd)
    pmn = req_uni.platform_pie_m_new()
    total_list.append(pmn)
    pm = req_uni.platform_pie_m()
    total_list.append(pm)
    pt = req_uni.platform_pie_total()
    total_list.append(pt)
    re = req_uni.changjingzhi()
    total_list.append(re)
    fx = req_uni.shijianfenxi()
    total_list.append(fx)
    save_excel(total_list)


def save_excel(res: [any]):
    xlsx = xlwt.Workbook()
    sheet = xlsx.add_sheet('uniapp')
    style = xlwt.XFStyle()
    al = xlwt.Alignment()
    al.horz = 0x02  # 设置水平居中
    al.vert = 0x01  # 设置垂直居中
    al.wrap = 1  # 设置自动换行
    style.alignment = al
    total = 0
    for m in range(len(res)):
        results = res[m]
        if results is None:
            continue
        for i in range(len(results)):
            sec_res = results[i]
            if isinstance(sec_res, list):
                for t in range(len(sec_res)):
                    set_style(total, style, sheet, t, sec_res)
                total += 1
            else:
                set_style(total, style, sheet, i, results)
        total += 1
    cur_time = time.strftime('%Y-%m-%d', time.localtime(time.time()))
    xlsx.save('tem_file/uniapp统计' + cur_time + '.xlsx')
    print('报表生成')


def set_style(total, style, sheet, t, sec_res):
    # pattern = xlwt.Pattern()
    # pattern.pattern = xlwt.Pattern.SOLID_PATTERN
    # pattern.pattern_fore_colour = ra
    # style.pattern = pattern
    # font = xlwt.Font()
    # font.colour_index = 2 if ra == 63 or ra == 62 else (ra + 2)
    # style.font = font
    sheet.write(total, t, sec_res[t], style)
    sheet.col(t).width = 256 * 20
    sheet.row(total).height_mismatch = True
    sheet.row(total).height = 20 * 50


def upload_excel():
    cur_time = time.strftime('%Y-%m-%d', time.localtime(time.time()))
    name = 'uniapp统计' + cur_time + '.xlsx'
    fl = open('tem_file/'+name, 'rb')
    files = {'files': (name, fl, 'application/octet-stream', {'Expires': '0'})}
    request_url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?key='+qywx_key+'&type=file'
    req = requests.post(request_url, files=files)
    assert req.json()['media_id'] is not None
    send_url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key='+qywx_key
    send_json = {
        "msgtype": "file",
        "file": {
             "media_id": req.json()['media_id']
        }
    }
    tixing = {
        "msgtype": "text",
        "text": {
            'content': '运营牛逼',
            "mentioned_list": ["@all"]
        }
    }
    requests.post(send_url, json=tixing)
    requests.post(send_url, json=send_json)


def imp_chart():
    new_user = req_uni.imp_data_tongji('num_new_visitor')
    creat_plot(new_user, '新增用户', 'r')
    new_user = req_uni.imp_data_tongji('num_visitor')
    creat_plot(new_user, '活跃用户', 'cyan')
    new_user = req_uni.imp_data_tongji('num_total_visitor')
    creat_plot(new_user, '总用户', 'lime', True)


def creat_plot(data, name, color, last=False):
    plt.figure()
    x = data['xAxis']
    y = data['series'][0]['data']
    plt.plot(x, y, marker='o', color=color)
    ax = plt.gca()
    ax.xaxis.set_major_locator(MultipleLocator(7))
    st_time = time.strftime('%Y-%m-%d', time.localtime(time.time()))
    for a, b in zip(x, y):
        if (a == st_time) or (last is False):
            plt.text(a, b, '%.0f' % b, ha='center', va='bottom', fontsize=6)
    myfont = FontProperties(fname='Arial Unicode.ttf',
                            size=15)
    plt.title('30日'+name, fontproperties=myfont)
    plt.savefig('tem_file/30日'+name)
    a_name = 'tem_file/30日'+name+'.png'
    with open(a_name, "rb") as f:
        md = hashlib.md5(f.read())
        res1 = md.hexdigest()
    with open(a_name, "rb") as f:
        base64_data = base64.b64encode(f.read())
    im_json = {
        "msgtype": "image",
        "image": {
            "base64": str(base64_data, 'utf-8'),
            "md5": res1
        }
    }
    send_url = 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=' + qywx_key
    requests.post(send_url, json=im_json)
    print('30日'+name+'图表生成完成')


tongji()
upload_excel()
imp_chart()



req_uni.py:需配置uniapp平台的账号和密码
[Python] 纯文本查看 复制代码
import datetime
import time
import requests
import gb

req_url = 'https://tongji-api.dcloud.net.cn/uni/stat/api/'
req_header = {'token': ''}


def req_judge(data, mod):
    print(mod, data)
    assert data['ret'] == 0, mod + '失败:' + data['desc']

#uniapp账户登录。自行填入邮箱和密码
def login(email='', password=''):
    login_data = requests.post(url=req_url + 'user/login', data={'email': email, 'password': password}).json()
    req_judge(login_data, '登录')
    gb.gb.token = login_data['token']
    req_header['token'] = login_data['token']


def apps_overview():
    over = requests.get(url=req_url + 'visit/apps-overview?p=0', headers=req_header).json()
    req_judge(over, '首页')
    yes_data = over['data']['yesterday']
    tit = '昨日'
    over_list = [tit + '新增用户:' + yes_data['num_new_visitor'],
                 tit + '活跃用户:' + yes_data['num_page_views'],
                 tit + '访问次数:' + yes_data['num_total_visitor'],
                 tit + '总用户数:' + yes_data['num_visitor']]
    return over_list


def overview():
    over = requests.get(url=req_url + 'visit/overview?id_app='+gb.gb.id_app+'&p=0', headers=req_header).json()
    req_judge(over, '概况-今日概况')
    yes_data = over['data']['yesterday']
    tit = '昨日'
    over_list = [tit + '新增用户:' + yes_data['num_new_visitor'],
                 tit + '活跃用户:' + yes_data['num_page_views'],
                 tit + '访问次数:' + yes_data['num_total_visitor'],
                 tit + '总用户数:' + yes_data['num_visitor'],
                 tit + '跳出率:' + yes_data['bounce_rate'],
                 tit + '启动次数:' + yes_data['num_visits'],
                 tit + '次均停留时长:' + yes_data['visit_avg_time'],
                 tit + '人均停留时长:' + yes_data['visitor_avg_time']]
    return over_list


def detail():
    st_time = time.strftime('%Y-%m-%d', time.localtime(time.time()))
    over = requests.get(url=req_url + 'activity/detail?id_app='+gb.gb.id_app+'&p=0&ch=0&v=0&start='+st_time+'&end='+st_time+'&page=1&page_size=1', headers=req_header).json()
    req_judge(over, '概况-用户活跃度')
    yes_data = over['data']['item'][0]
    tit = ''
    over_list = [tit + '日活:' + str(yes_data['dau']),
                 tit + '周活:' + yes_data['wau'],
                 tit + '月活:' + yes_data['mau'],
                 tit + '日活/周活:' + yes_data['dau_wau_rate'],
                 tit + '日活/月活:' + yes_data['dau_mau_rate']]
    return over_list


def platform_pie_d_new():
    st_time = time.strftime('%Y-%m-%d', time.localtime(time.time()))
    over = requests.get(url=req_url + 'visit/platform-pie?id_app='+gb.gb.id_app+'&start='+st_time+'&end='+st_time+'&period=1&item=num_new_visitor', headers=req_header).json()
    tit = '日新增-'
    req_judge(over, '概况-平台对比'+tit)
    yes_data = over['data']
    over_list = []
    for t in yes_data:
        if t['name'] == '微信小程序' or t['name'] == '支付宝小程序':
            over_list.append(tit + t['name'] + ':' + str(t['value']))
    return over_list


def platform_pie_d():
    st_time = time.strftime('%Y-%m-%d', time.localtime(time.time()))
    over = requests.get(url=req_url + 'visit/platform-pie?id_app='+gb.gb.id_app+'&start='+st_time+'&end='+st_time+'&period=1&item=num_visitor', headers=req_header).json()
    tit = '日活-'
    req_judge(over, '概况-平台对比'+tit)
    yes_data = over['data']
    over_list = []
    for t in yes_data:
        if t['name'] == '微信小程序' or t['name'] == '支付宝小程序':
            over_list.append(tit+t['name']+':'+str(t['value']))
    return over_list


def platform_pie_m_new():
    st_time = time.strftime('%Y-%m-%d', time.localtime(time.time()))
    over = requests.get(url=req_url + 'visit/platform-pie?id_app='+gb.gb.id_app+'&start='+st_time+'&end='+st_time+'&period=3&item=num_new_visitor', headers=req_header).json()
    tit = '月新增-'
    req_judge(over, '概况-平台对比'+tit)
    yes_data = over['data']
    over_list = []
    for t in yes_data:
        if t['name'] == '微信小程序' or t['name'] == '支付宝小程序':
            over_list.append(tit + t['name'] + ':' + str(t['value']))
    return over_list


def platform_pie_m():
    st_time = time.strftime('%Y-%m-%d', time.localtime(time.time()))
    over = requests.get(url=req_url + 'visit/platform-pie?id_app='+gb.gb.id_app+'&start='+st_time+'&end='+st_time+'&period=3&item=num_visitor', headers=req_header).json()
    tit = '月活-'
    req_judge(over, '概况-平台对比'+tit)
    yes_data = over['data']
    over_list = []
    for t in yes_data:
        if t['name'] == '微信小程序' or t['name'] == '支付宝小程序':
            over_list.append(tit + t['name'] + ':' + str(t['value']))
    return over_list


def platform_pie_total():
    st_time = time.strftime('%Y-%m-%d', time.localtime(time.time()))
    over = requests.get(url=req_url + 'visit/platform-pie?id_app='+gb.gb.id_app+'&start='+st_time+'&end='+st_time+'&period=1&item=num_total_visitor', headers=req_header).json()
    tit = '总用户数-'
    req_judge(over, '概况-平台对比'+tit)
    yes_data = over['data']
    over_list = []
    for t in yes_data:
        if t['name'] == '微信小程序' or t['name'] == '支付宝小程序':
            over_list.append(tit + t['name'] + ':' + str(t['value']))
    return over_list


def changjingzhi():
    st_time = time.strftime('%Y-%m-%d', time.localtime(time.time()))
    over = requests.get(url=req_url + 'scene/detail?id_app='+gb.gb.id_app+'&p=0&start='+st_time+'&end='+st_time+'&page=1&page_size=60', headers=req_header).json()
    req_judge(over, '渠道/场景分享-场景值')
    yes_data = over['data']['item']
    over_list = []
    for t in yes_data:
        over_list.append([t['channel_name'], '新增:'+t['num_new_visitor'], '访问次数:'+t['num_page_views'], '总用户:'+t['num_total_visitor'], '活跃用户:'+t['num_visitor'], '启动次数:'+t['num_visits'], '次均停留时长:'+t['visit_avg_time'], '人均停留时长:'+t['visitor_avg_time'], '跳出率:'+t['bounce_rate']])
    return over_list


def shijianfenxi():
    st_time = time.strftime('%Y-%m-%d', time.localtime(time.time()))
    over = requests.get(url=req_url + 'event/list?id_app='+gb.gb.id_app+'&p=0&ch=0&v=0&start='+st_time+'&end='+st_time+'&page=1&page_size=100', headers=req_header).json()
    req_judge(over, '事件和转化-事件分析管理')
    yes_data = over['data']['item']
    over_list = []
    for t in yes_data:
        over_list.append(t['event_name']+'\n触发用户数:'+t['num_visitor']+'\n触发次数:'+t['num_visits']+'\n人均次数:'+t['visitor_avg_hits'])
    return over_list


def imp_data_tongji(item):
    st_time = time.strftime('%Y-%m-%d', time.localtime(time.time()))
    start_time_t = datetime.datetime.today() - datetime.timedelta(30)
    start_time = start_time_t.strftime("%Y-%m-%d")
    over = requests.get(
        url=req_url + 'visit/trend?id_app=' + gb.gb.id_app + '&p=0&start=' + start_time + '&end=' + st_time + '&compare=0&item='+item,
        headers=req_header).json()
    req_judge(over, '新增用户列表')
    return over['data']


gb.py: 除了token外,其余三个参数可在uniapp平台获取。
[Python] 纯文本查看 复制代码
class gb:
    token = ''

    id_app = ''
    appid = ''
    name = ''

免费评分

参与人数 2吾爱币 +14 热心值 +2 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
hrh123 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

kowade003 发表于 2025-7-22 14:49

uniapp还能这么玩!
Mint_Grass 发表于 2025-7-22 17:37
涨见识了,以为uniapp只是开发多端应用而已,从没想过还可以这样操作。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-2-27 12:21

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表