【优秀课设V2.1】基于运动步数API的自动更新系统(修复BUG,增加完成度显示,支持断线重连、数据补偿)

【V2.1】基于运动步数API的自动更新系统(修复BUG,增加完成度显示,支持断线重连、数据补偿)

步数API

前文:

blog.csdn.net/weixin_53403301/article/details/123026380

资源及APP:

download.csdn.net/download/weixin_53403301/82884936

采用小米运动API 实现对微信步数等数据的修改 并且增加了GUI 做成了APP 可以设置步数自动更新 支持断线重连、数据补偿

界面如图(已打包成APP):
在这里插入图片描述
引用:https://blog.csdn.net/chinaherolts2008/article/details/119921976
https://blog.csdn.net/Jaeger_Java/article/details/109631118

初次运行时没有用户信息,点击记住用户后,自动存储在程序目录下的“steps.txt”文件中,方便下次读取

步数范围是为了在更新步数时 若没有设置步数 或设置错误步数而设定的最低-最高值 用于随机更新

点击更新步数后 则可以更新步数 若未填 或填写有误 则按随机大小

自动更新功能要设置起始步数 单次步数和循环次数 默认为0 6 1 即0步开始 每3秒循环1次 共循环1次 每次增加6步

每次增加的步数值为随机数 ± N/6 即默认为6的话 显示5-7

在这里插入图片描述
最后可以设置TG的BOT_TOKEN和USER_ID 用于推送 点击设置推送后 即可在更新步数时开始推送

关闭窗口后 开启终端模式 但是功能就少的多 只能填写用户 然后填写步数 不填的话 便为随机步数 如图:

在这里插入图片描述
自动更新功能演示:

在这里插入图片描述
在自动更新过程中,步数那一栏会跟着显示当前步数结果

重连功能演示:
在这里插入图片描述

开始重连后 每30s通知一次 自动重连后 自动校准步数和循环次数 继续循环

在这里插入图片描述

设置随机步数更新模式下 可以更新范围显示 也可以填好以后直接点击更新步数 输入框会自动校准过来:

在这里插入图片描述

代码如下:

import requests,time,re,json,random
import os
import tkinter as tk
from tkinter import ttk
from tkinter.filedialog import *
import tkinter.messagebox
import threading

TG_BOT_TOKEN = ""           # telegram bot token 自行申请
TG_USER_ID = ""             # telegram 用户ID
global now 
now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
headers = {
        'User-Agent': 'Dalvik/2.1.0 (Linux; U; Android 9; MI 6 MIUI/20.6.18)'
        }

#推送函数
def telegram_bot(title, content):
    try:
        tg_bot_token = TG_BOT_TOKEN
        tg_user_id = TG_USER_ID
        if "TG_BOT_TOKEN" in os.environ and "TG_USER_ID" in os.environ:
            tg_bot_token = os.environ["TG_BOT_TOKEN"]
            tg_user_id = os.environ["TG_USER_ID"]
        if not tg_bot_token or not tg_user_id:
            print("Telegram推送的TG_BOT_TOKEN或者TG_USER_ID未设置!!")
            return
        print("Telegram 推送开始")
        send_data = {"chat_id": tg_user_id, "text": title +
                     '\n\n'+content, "disable_web_page_preview": "true"}
        response = requests.post(
            url='https://api.telegram.org/bot%s/sendMessage' % (tg_bot_token), data=send_data)
        print(response.text)
    except:
        print("Error")
  
#获取登录code
def get_code(location):
    code_pattern = re.compile("(?<=access=).*?(?=&)")
    code = code_pattern.findall(location)[0]
    return code
  
#登录
def login(user,password):
    url1 = "https://api-user.huami.com/registrations/+86" + user + "/tokens"
    headers = {
        "Content-Type":"application/x-www-form-urlencoded;charset=UTF-8",
    "User-Agent":"MiFit/4.6.0 (iPhone; iOS 14.0.1; Scale/2.00)"
        }
    data1 = {
        "client_id":"HuaMi",
        "password":f"{password}",
        "redirect_uri":"https://s3-us-west-2.amazonaws.com/hm-registration/successsignin.html",
        "token":"access"
        }
    r1 = requests.post(url1,data=data1,headers=headers,allow_redirects=False)
    location = r1.headers["Location"]
    try:
        code = get_code(location)
    except:
        return 0,0
    #print("access_code获取成功!")ste
    #print(code)
      
    url2 = "https://account.huami.com/v2/client/login"
    data2 = {
        "app_name":"com.xiaomi.hm.health",
        "app_version":"4.6.0",
        "code":f"{code}",
        "country_code":"CN",
        "device_id":"2C8B4939-0CCD-4E94-8CBA-CB8EA6E613A1",
        "device_model":"phone",
        "grant_type":"access_token",
        "third_name":"huami_phone",
        } 
    r2 = requests.post(url2,data=data2,headers=headers).json()
    login_token = r2["token_info"]["login_token"]
    #print("login_token获取成功!")
    #print(login_token)
    userid = r2["token_info"]["user_id"]
    #print("userid获取成功!")
    #print(userid)
  
    return login_token,userid
  
#主函数
def step_main(user, passwd, step, min_num, max_num):
    user = str(user)
    password = str(passwd)
    step = str(step)
    if user == '' or password == '':
        print ("用户名或密码填写有误!")
        return
     
    if step == '':
        print ("已设置为随机步数("+str(min_num)+"-"+str(max_num)+")")
        step = str(random.randint(min_num,max_num))
    login_token = 0
    login_token,userid = login(user,password)
    if login_token == 0:
        print("登陆失败!")
        return "login fail!"
  
    t = get_time()
      
    app_token = get_app_token(login_token)
  
    today = time.strftime("%F")
  
    data_json = '%5B%7B%22data_hr%22%3A%22%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9L%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FVv%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0v%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9e%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0n%5C%2Fa%5C%2F%5C%2F%5C%2FS%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0b%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F1FK%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FR%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9PTFFpaf9L%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FR%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0j%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9K%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FOv%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2Fzf%5C%2F%5C%2F%5C%2F86%5C%2Fzr%5C%2FOv88%5C%2Fzf%5C%2FPf%5C%2F%5C%2F%5C%2F0v%5C%2FS%5C%2F8%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FSf%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2Fz3%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0r%5C%2FOv%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FS%5C%2F9L%5C%2Fzb%5C%2FSf9K%5C%2F0v%5C%2FRf9H%5C%2Fzj%5C%2FSf9K%5C%2F0%5C%2F%5C%2FN%5C%2F%5C%2F%5C%2F%5C%2F0D%5C%2FSf83%5C%2Fzr%5C%2FPf9M%5C%2F0v%5C%2FOv9e%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FS%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2Fzv%5C%2F%5C%2Fz7%5C%2FO%5C%2F83%5C%2Fzv%5C%2FN%5C%2F83%5C%2Fzr%5C%2FN%5C%2F86%5C%2Fz%5C%2F%5C%2FNv83%5C%2Fzn%5C%2FXv84%5C%2Fzr%5C%2FPP84%5C%2Fzj%5C%2FN%5C%2F9e%5C%2Fzr%5C%2FN%5C%2F89%5C%2F03%5C%2FP%5C%2F89%5C%2Fz3%5C%2FQ%5C%2F9N%5C%2F0v%5C%2FTv9C%5C%2F0H%5C%2FOf9D%5C%2Fzz%5C%2FOf88%5C%2Fz%5C%2F%5C%2FPP9A%5C%2Fzr%5C%2FN%5C%2F86%5C%2Fzz%5C%2FNv87%5C%2F0D%5C%2FOv84%5C%2F0v%5C%2FO%5C%2F84%5C%2Fzf%5C%2FMP83%5C%2FzH%5C%2FNv83%5C%2Fzf%5C%2FN%5C%2F84%5C%2Fzf%5C%2FOf82%5C%2Fzf%5C%2FOP83%5C%2Fzb%5C%2FMv81%5C%2FzX%5C%2FR%5C%2F9L%5C%2F0v%5C%2FO%5C%2F9I%5C%2F0T%5C%2FS%5C%2F9A%5C%2Fzn%5C%2FPf89%5C%2Fzn%5C%2FNf9K%5C%2F07%5C%2FN%5C%2F83%5C%2Fzn%5C%2FNv83%5C%2Fzv%5C%2FO%5C%2F9A%5C%2F0H%5C%2FOf8%5C%2F%5C%2Fzj%5C%2FPP83%5C%2Fzj%5C%2FS%5C%2F87%5C%2Fzj%5C%2FNv84%5C%2Fzf%5C%2FOf83%5C%2Fzf%5C%2FOf83%5C%2Fzb%5C%2FNv9L%5C%2Fzj%5C%2FNv82%5C%2Fzb%5C%2FN%5C%2F85%5C%2Fzf%5C%2FN%5C%2F9J%5C%2Fzf%5C%2FNv83%5C%2Fzj%5C%2FNv84%5C%2F0r%5C%2FSv83%5C%2Fzf%5C%2FMP%5C%2F%5C%2F%5C%2Fzb%5C%2FMv82%5C%2Fzb%5C%2FOf85%5C%2Fz7%5C%2FNv8%5C%2F%5C%2F0r%5C%2FS%5C%2F85%5C%2F0H%5C%2FQP9B%5C%2F0D%5C%2FNf89%5C%2Fzj%5C%2FOv83%5C%2Fzv%5C%2FNv8%5C%2F%5C%2F0f%5C%2FSv9O%5C%2F0ZeXv%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F1X%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9B%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2FTP%5C%2F%5C%2F%5C%2F1b%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F0%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F9N%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2F%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%5C%2Fv7%2B%22%2C%22date%22%3A%222021-08-07%22%2C%22data%22%3A%5B%7B%22start%22%3A0%2C%22stop%22%3A1439%2C%22value%22%3A%22UA8AUBQAUAwAUBoAUAEAYCcAUBkAUB4AUBgAUCAAUAEAUBkAUAwAYAsAYB8AYB0AYBgAYCoAYBgAYB4AUCcAUBsAUB8AUBwAUBIAYBkAYB8AUBoAUBMAUCEAUCIAYBYAUBwAUCAAUBgAUCAAUBcAYBsAYCUAATIPYD0KECQAYDMAYB0AYAsAYCAAYDwAYCIAYB0AYBcAYCQAYB0AYBAAYCMAYAoAYCIAYCEAYCYAYBsAYBUAYAYAYCIAYCMAUB0AUCAAUBYAUCoAUBEAUC8AUB0AUBYAUDMAUDoAUBkAUC0AUBQAUBwAUA0AUBsAUAoAUCEAUBYAUAwAUB4AUAwAUCcAUCYAUCwKYDUAAUUlEC8IYEMAYEgAYDoAYBAAUAMAUBkAWgAAWgAAWgAAWgAAWgAAUAgAWgAAUBAAUAQAUA4AUA8AUAkAUAIAUAYAUAcAUAIAWgAAUAQAUAkAUAEAUBkAUCUAWgAAUAYAUBEAWgAAUBYAWgAAUAYAWgAAWgAAWgAAWgAAUBcAUAcAWgAAUBUAUAoAUAIAWgAAUAQAUAYAUCgAWgAAUAgAWgAAWgAAUAwAWwAAXCMAUBQAWwAAUAIAWgAAWgAAWgAAWgAAWgAAWgAAWgAAWgAAWREAWQIAUAMAWSEAUDoAUDIAUB8AUCEAUC4AXB4AUA4AWgAAUBIAUA8AUBAAUCUAUCIAUAMAUAEAUAsAUAMAUCwAUBYAWgAAWgAAWgAAWgAAWgAAWgAAUAYAWgAAWgAAWgAAUAYAWwAAWgAAUAYAXAQAUAMAUBsAUBcAUCAAWwAAWgAAWgAAWgAAWgAAUBgAUB4AWgAAUAcAUAwAWQIAWQkAUAEAUAIAWgAAUAoAWgAAUAYAUB0AWgAAWgAAUAkAWgAAWSwAUBIAWgAAUC4AWSYAWgAAUAYAUAoAUAkAUAIAUAcAWgAAUAEAUBEAUBgAUBcAWRYAUA0AWSgAUB4AUDQAUBoAXA4AUA8AUBwAUA8AUA4AUA4AWgAAUAIAUCMAWgAAUCwAUBgAUAYAUAAAUAAAUAAAUAAAUAAAUAAAUAAAUAAAUAAAWwAAUAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAeSEAeQ8AcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBcAcAAAcAAAcCYOcBUAUAAAUAAAUAAAUAAAUAUAUAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcCgAeQAAcAAAcAAAcAAAcAAAcAAAcAYAcAAAcBgAeQAAcAAAcAAAegAAegAAcAAAcAcAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcCkAeQAAcAcAcAAAcAAAcAwAcAAAcAAAcAIAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcCIAeQAAcAAAcAAAcAAAcAAAcAAAeRwAeQAAWgAAUAAAUAAAUAAAUAAAUAAAcAAAcAAAcBoAeScAeQAAegAAcBkAeQAAUAAAUAAAUAAAUAAAUAAAUAAAcAAAcAAAcAAAcAAAcAAAcAAAegAAegAAcAAAcAAAcBgAeQAAcAAAcAAAcAAAcAAAcAAAcAkAegAAegAAcAcAcAAAcAcAcAAAcAAAcAAAcAAAcA8AeQAAcAAAcAAAeRQAcAwAUAAAUAAAUAAAUAAAUAAAUAAAcAAAcBEAcA0AcAAAWQsAUAAAUAAAUAAAUAAAUAAAcAAAcAoAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAYAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBYAegAAcAAAcAAAegAAcAcAcAAAcAAAcAAAcAAAcAAAeRkAegAAegAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAEAcAAAcAAAcAAAcAUAcAQAcAAAcBIAeQAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBsAcAAAcAAAcBcAeQAAUAAAUAAAUAAAUAAAUAAAUBQAcBYAUAAAUAAAUAoAWRYAWTQAWQAAUAAAUAAAUAAAcAAAcAAAcAAAcAAAcAAAcAMAcAAAcAQAcAAAcAAAcAAAcDMAeSIAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBQAeQwAcAAAcAAAcAAAcAMAcAAAeSoAcA8AcDMAcAYAeQoAcAwAcFQAcEMAeVIAaTYAbBcNYAsAYBIAYAIAYAIAYBUAYCwAYBMAYDYAYCkAYDcAUCoAUCcAUAUAUBAAWgAAYBoAYBcAYCgAUAMAUAYAUBYAUA4AUBgAUAgAUAgAUAsAUAsAUA4AUAMAUAYAUAQAUBIAASsSUDAAUDAAUBAAYAYAUBAAUAUAUCAAUBoAUCAAUBAAUAoAYAIAUAQAUAgAUCcAUAsAUCIAUCUAUAoAUA4AUB8AUBkAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAA%22%2C%22tz%22%3A32%2C%22did%22%3A%22DA932FFFFE8816E7%22%2C%22src%22%3A24%7D%5D%2C%22summary%22%3A%22%7B%5C%22v%5C%22%3A6%2C%5C%22slp%5C%22%3A%7B%5C%22st%5C%22%3A1628296479%2C%5C%22ed%5C%22%3A1628296479%2C%5C%22dp%5C%22%3A0%2C%5C%22lt%5C%22%3A0%2C%5C%22wk%5C%22%3A0%2C%5C%22usrSt%5C%22%3A-1440%2C%5C%22usrEd%5C%22%3A-1440%2C%5C%22wc%5C%22%3A0%2C%5C%22is%5C%22%3A0%2C%5C%22lb%5C%22%3A0%2C%5C%22to%5C%22%3A0%2C%5C%22dt%5C%22%3A0%2C%5C%22rhr%5C%22%3A0%2C%5C%22ss%5C%22%3A0%7D%2C%5C%22stp%5C%22%3A%7B%5C%22ttl%5C%22%3A18272%2C%5C%22dis%5C%22%3A10627%2C%5C%22cal%5C%22%3A510%2C%5C%22wk%5C%22%3A41%2C%5C%22rn%5C%22%3A50%2C%5C%22runDist%5C%22%3A7654%2C%5C%22runCal%5C%22%3A397%2C%5C%22stage%5C%22%3A%5B%7B%5C%22start%5C%22%3A327%2C%5C%22stop%5C%22%3A341%2C%5C%22mode%5C%22%3A1%2C%5C%22dis%5C%22%3A481%2C%5C%22cal%5C%22%3A13%2C%5C%22step%5C%22%3A680%7D%2C%7B%5C%22start%5C%22%3A342%2C%5C%22stop%5C%22%3A367%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A2295%2C%5C%22cal%5C%22%3A95%2C%5C%22step%5C%22%3A2874%7D%2C%7B%5C%22start%5C%22%3A368%2C%5C%22stop%5C%22%3A377%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A1592%2C%5C%22cal%5C%22%3A88%2C%5C%22step%5C%22%3A1664%7D%2C%7B%5C%22start%5C%22%3A378%2C%5C%22stop%5C%22%3A386%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A1072%2C%5C%22cal%5C%22%3A51%2C%5C%22step%5C%22%3A1245%7D%2C%7B%5C%22start%5C%22%3A387%2C%5C%22stop%5C%22%3A393%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A1036%2C%5C%22cal%5C%22%3A57%2C%5C%22step%5C%22%3A1124%7D%2C%7B%5C%22start%5C%22%3A394%2C%5C%22stop%5C%22%3A398%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A488%2C%5C%22cal%5C%22%3A19%2C%5C%22step%5C%22%3A607%7D%2C%7B%5C%22start%5C%22%3A399%2C%5C%22stop%5C%22%3A414%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A2220%2C%5C%22cal%5C%22%3A120%2C%5C%22step%5C%22%3A2371%7D%2C%7B%5C%22start%5C%22%3A415%2C%5C%22stop%5C%22%3A427%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A1268%2C%5C%22cal%5C%22%3A59%2C%5C%22step%5C%22%3A1489%7D%2C%7B%5C%22start%5C%22%3A428%2C%5C%22stop%5C%22%3A433%2C%5C%22mode%5C%22%3A1%2C%5C%22dis%5C%22%3A152%2C%5C%22cal%5C%22%3A4%2C%5C%22step%5C%22%3A238%7D%2C%7B%5C%22start%5C%22%3A434%2C%5C%22stop%5C%22%3A444%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A2295%2C%5C%22cal%5C%22%3A95%2C%5C%22step%5C%22%3A2874%7D%2C%7B%5C%22start%5C%22%3A445%2C%5C%22stop%5C%22%3A455%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A1592%2C%5C%22cal%5C%22%3A88%2C%5C%22step%5C%22%3A1664%7D%2C%7B%5C%22start%5C%22%3A456%2C%5C%22stop%5C%22%3A466%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A1072%2C%5C%22cal%5C%22%3A51%2C%5C%22step%5C%22%3A1245%7D%2C%7B%5C%22start%5C%22%3A467%2C%5C%22stop%5C%22%3A477%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A1036%2C%5C%22cal%5C%22%3A57%2C%5C%22step%5C%22%3A1124%7D%2C%7B%5C%22start%5C%22%3A478%2C%5C%22stop%5C%22%3A488%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A488%2C%5C%22cal%5C%22%3A19%2C%5C%22step%5C%22%3A607%7D%2C%7B%5C%22start%5C%22%3A489%2C%5C%22stop%5C%22%3A499%2C%5C%22mode%5C%22%3A4%2C%5C%22dis%5C%22%3A2220%2C%5C%22cal%5C%22%3A120%2C%5C%22step%5C%22%3A2371%7D%2C%7B%5C%22start%5C%22%3A500%2C%5C%22stop%5C%22%3A511%2C%5C%22mode%5C%22%3A3%2C%5C%22dis%5C%22%3A1268%2C%5C%22cal%5C%22%3A59%2C%5C%22step%5C%22%3A1489%7D%2C%7B%5C%22start%5C%22%3A512%2C%5C%22stop%5C%22%3A522%2C%5C%22mode%5C%22%3A1%2C%5C%22dis%5C%22%3A152%2C%5C%22cal%5C%22%3A4%2C%5C%22step%5C%22%3A238%7D%5D%7D%2C%5C%22goal%5C%22%3A8000%2C%5C%22tz%5C%22%3A%5C%2228800%5C%22%7D%22%2C%22source%22%3A24%2C%22type%22%3A0%7D%5D'
  
    finddate = re.compile(r'.*?date%22%3A%22(.*?)%22%2C%22data.*?')
    findstep = re.compile(r'.*?ttl%5C%22%3A(.*?)%2C%5C%22dis.*?')
    data_json = re.sub(finddate.findall(data_json)[0], today, str(data_json))
    data_json = re.sub(findstep.findall(data_json)[0], step, str(data_json))
      
    url = f'https://api-mifit-cn.huami.com/v1/data/band_data.json?&t={t}'
    head = {
        "apptoken": app_token,
        "Content-Type": "application/x-www-form-urlencoded"
        }
      
    data = f'userid={userid}&last_sync_data_time=1597306380&device_type=0&last_deviceid=DA932FFFFE8816E7&data_json={data_json}'
     
    response = requests.post(url, data=data, headers=head).json()
    #print(response)
    result = f"{user[:3]}****{user[-4:]}: [{now}] 修改步数({step})"+ response['message']
    print(result)
    return result
   
#获取时间戳
def get_time():
    url = 'http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp'
    response = requests.get(url,headers=headers).json()
    t = response['data']['t']
    return t
   
#获取app_token
def get_app_token(login_token):
    url = f"https://account-cn.huami.com/v1/client/app_tokens?app_name=com.xiaomi.hm.health&dn=api-user.huami.com%2Capi-mifit.huami.com%2Capp-analytics.huami.com&login_token={login_token}"
    response = requests.get(url,headers=headers).json()
    app_token = response['token_info']['app_token']
    #print("app_token获取成功!")
    #print(app_token)
    return app_token
 
def gui_start():
    root=Tk()
    root.title("小米运动API")
    mainfram=Frame(root,width=320, height=660)
    mainfram.grid_propagate(0)
    mainfram.grid()
    
    labelName=tkinter.Label(root, text='用户名:', justify=tkinter.RIGHT, width=80)
    labelName.place(x=10, y=10, width=80, height=40)
    labelName=tkinter.Label(root, text='密码:', justify=tkinter.RIGHT, width=80)
    labelName.place(x=10, y=50, width=80, height=40)
    labelName=tkinter.Label(root, text='步数范围:', justify=tkinter.RIGHT, width=80)
    labelName.place(x=10, y=130, width=80, height=40)
    labelName=tkinter.Label(root, text='至', justify=tkinter.RIGHT, width=80)
    labelName.place(x=180, y=130, width=40, height=40)
    labelName=tkinter.Label(root, text='步数:', justify=tkinter.RIGHT, width=80)
    labelName.place(x=10, y=210, width=80, height=40)
    labelName=tkinter.Label(root, text='自动更新起始:', justify=tkinter.RIGHT, width=80)
    labelName.place(x=10, y=290, width=80, height=40)
    labelName=tkinter.Label(root, text='单次步数(N):', justify=tkinter.RIGHT, width=80)
    labelName.place(x=10, y=330, width=80, height=40)
    labelName=tkinter.Label(root, text='循环次数:', justify=tkinter.RIGHT, width=80)
    labelName.place(x=10, y=370, width=80, height=40)    
    labelName=tkinter.Label(root, text='BOT_TOKEN:', justify=tkinter.RIGHT, width=80)
    labelName.place(x=10, y=490, width=80, height=40) 
    labelName=tkinter.Label(root, text='USER_ID:', justify=tkinter.RIGHT, width=80)
    labelName.place(x=10, y=530, width=80, height=40) 

    user = ''
    passwd = ''
    step = ''
    user_list = []
    passwd_list = []
    setp_array = []
    push = ''
    auto_step = 0
    auto_loops = 1
    auto_solo = 6
    begin_step = 0
    end_step = 6
    min_num = 20000
    max_num = 29999
    global auto_flag
    auto_flag = 1
    global TG_flag
    TG_flag = 1
    
    f0 = open("steps.txt", 'a')
    f0.close()
    f1 = open("steps.txt", 'r')
    users=[]
    for line in f1.readlines():
        users.append(line)
    if len(users)>0:
        user = (users[0].split("\n")[0])
        if len(users)>1:
            passwd = (users[1].split("\n")[0])
    f1.close()
    
    e1 = Entry(mainfram)
    #e1.grid(ipadx=50,row=0,column=1)
    e1.delete(0, END)  # 将输入框里面的内容清空
    e1.insert(0, user)  
    e1.place(x=100, y=10, width=200, height=40)
    
    e2 = Entry(mainfram)
    #e2.grid(ipadx=50,row=1,column=1)
    e2.delete(0, END)  # 将输入框里面的内容清空
    e2.insert(0, passwd)
    e2.place(x=100, y=50, width=200, height=40)
    
    e3 = Entry(mainfram)
#    e3.grid(ipadx=50,row=3,column=0)
    e3.delete(0, END)  # 将输入框里面的内容清空
    e3.insert(0, "随机步数("+str(min_num)+"-"+str(max_num)+")") 
    e3.place(x=100, y=210, width=200, height=40)
    
    e4 = Entry(mainfram)
#    e3.grid(ipadx=50,row=3,column=0)
    e4.delete(0, END)  # 将输入框里面的内容清空
    e4.insert(0, str(min_num)) 
    e4.place(x=100, y=130, width=80, height=40)
    
    e5 = Entry(mainfram)
#    e3.grid(ipadx=50,row=3,column=0)
    e5.delete(0, END)  # 将输入框里面的内容清空
    e5.insert(0, str(max_num)) 
    e5.place(x=220, y=130, width=80, height=40)
    
    e6 = Entry(mainfram)
#    e3.grid(ipadx=50,row=3,column=0)
    e6.delete(0, END)  # 将输入框里面的内容清空
    e6.insert(0, str(begin_step)) 
    e6.place(x=100, y=290, width=200, height=40)
    
    e7 = Entry(mainfram)
#    e3.grid(ipadx=50,row=3,column=0)
    e7.delete(0, END)  # 将输入框里面的内容清空
    e7.insert(0, "默认为:"+str(auto_loops)+";约每N步/3s循环") 
    e7.place(x=100, y=370, width=200, height=40)
    
    e8 = Entry(mainfram)
#    e3.grid(ipadx=50,row=3,column=0)
    e8.delete(0, END)  # 将输入框里面的内容清空
    e8.insert(0, "默认为:"+str(auto_solo)+";20%随机浮动") 
    e8.place(x=100, y=330, width=200, height=40)
    
    e9 = Entry(mainfram)
#    e3.grid(ipadx=50,row=3,column=0)
    e9.delete(0, END)  # 将输入框里面的内容清空
    e9.insert(0, str(TG_BOT_TOKEN)) 
    e9.place(x=100, y=490, width=200, height=40)
    
    e10 = Entry(mainfram)
#    e3.grid(ipadx=50,row=3,column=0)
    e10.delete(0, END)  # 将输入框里面的内容清空
    e10.insert(0, str(TG_USER_ID)) 
    e10.place(x=100, y=530, width=200, height=40)
    
    def start():
        global TG_flag
        global now 
        now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        user = str(e1.get())
        passwd = str(e2.get())
        try:
            step = str(int(float(e3.get())))
        except:
            step = ""
        try:
            min_num_tem = int(float(e4.get()))
            max_num_tem = int(float(e5.get()))
            if min_num_tem < max_num_tem:
                min_num = int(min_num_tem)
                max_num = int(max_num_tem)
            else:
                min_num = 20000
                max_num = 29999
        except:
             min_num = 20000
             max_num = 29999
             
        e3.delete(0, END)  # 将输入框里面的内容清空
        e3.insert(0, str(step)) 
        
        if step == "":
            e3.delete(0, END)  # 将输入框里面的内容清空
            e3.insert(0, "随机步数("+str(min_num)+"-"+str(max_num)+")") 
            
        user_list = user.split('#')
        passwd_list = passwd.split('#')
        setp_array = step.split('-')
        
        if len(user_list) == len(passwd_list):
            push = ''
            for line in range(0,len(user_list)):
                if len(setp_array) == 2:
                    step = str(random.randint(int(setp_array[0]),int(setp_array[1])))
                elif str(step) == '0':
                    step = ''
                push += step_main(user_list[line], passwd_list[line], step, min_num, max_num) + '\n'
            if TG_flag == 0:
                thread2 = threading.Thread(target=telegram_bot("小米运动", push))
                thread2.start()
            else:
                TG_flag = 1
        else:
            print('用户名和密码数量不对')
            
    def save_user():
        user = str(e1.get())
        passwd = str(e2.get())
        
        f2 = open("steps.txt", 'w')
        f2.write(str(user))
        f2.write("\n")
        f2.write(str(passwd))
        f2.write("\n")
        f2.close()
        
    def save_random():        
        try:
            min_num_tem = int(float(e4.get()))
            max_num_tem = int(float(e5.get()))
            if min_num_tem < max_num_tem:
                min_num = int(min_num_tem)
                max_num = int(max_num_tem)
            else:
                min_num = 20000
                max_num = 29999
        except:
             min_num = 20000
             max_num = 29999

        e3.delete(0, END)  # 将输入框里面的内容清空
        e3.insert(0, "随机步数("+str(min_num)+"-"+str(max_num)+")") 
       
    def auto_steps():
        global auto_flag
        global TG_flag
        global now
        now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        time_flag = 0
        auto_flag = 0
        loop_flag = 0
        over_flag = 0
        one_step_time = 1
        loop_time_flag = 0
        time_over_flag = 0
        time_over_step = 0
        time_over_loop = 0
        first_time_flag = 0

        if auto_flag==0:
            try:
                auto_loops = int(float(e7.get()))
            except:
                auto_loops = 1
            print("循环总次数:"+str(auto_loops))  
            try:
                begin_step = int(float(e6.get()))
            except:
                begin_step = 0
            print("起始步数:"+str(begin_step))  
            try:
                auto_solo = int(float(e8.get()))
            except:
                auto_solo = 6
            random_step = random.randint(auto_solo-int(auto_solo/5),auto_solo+int(auto_solo/5))
            print("单次步数:"+str(auto_solo-int(auto_solo/5))+"-"+str(auto_solo+int(auto_solo/5)))
            auto_step = begin_step
            end_step = auto_loops*auto_solo+begin_step
            print("预计更新步数:"+str(begin_step)+"-"+str(end_step))
            print("预计所需时间:"+str(int(auto_loops*3/3600))+"时"+str(int(((auto_loops*3/3600)%1)*60))+"分")
            user = str(e1.get())
            passwd = str(e2.get())
            user_list = user.split('#')
            passwd_list = passwd.split('#')
            
            time_over = time.time()
            begin_time = time.time()
            print("开始循环\n")
            while True:
                
                random_step = random.randint(auto_solo-int(auto_solo/5),auto_solo+int(auto_solo/5))
                auto_step = auto_step + random_step
                
                step = str(auto_step)
                setp_array = step.split('-')
                
                if len(user_list) == len(passwd_list):
                    push = ''
                    for line in range(0,len(user_list)):
                        if len(setp_array) == 2:
                            step = str(random.randint(int(setp_array[0]),int(setp_array[1])))
                        elif str(step) == '0':
                            step = ''
                        try:
                            push += step_main(user_list[line], passwd_list[line], step, min_num, max_num) + '\n'
                            if time_over_flag == 1:
                                if first_time_flag == 0:
                                    first_time_flag = 1
                                    over_flag = (time.time()-begin_time)/3
                                else:                                    
                                    over_flag = (time.time()-time_over)/one_step_time
                                time_over_step = int(over_flag*auto_solo)
                                time_flag = time_flag + int(over_flag)
                                time_over = time.time()
                                time_over_flag = 0
                                print("重置成功")
                            else:
                                time_over = time.time()
                                time_over_flag = 0
                        except:                            
                            time_over_flag = 1
                            time_flag = time_flag
                            loop_time_flag = time_flag+1
                            auto_step = auto_step - random_step
                            time.sleep(1)
                    if TG_flag == 0:
                        thread2 = threading.Thread(target=telegram_bot("小米运动", push))
                        thread2.start()
                    else:
                        TG_flag = 1
                else:
                    print('用户名和密码数量不对')
                    
                if time_over_flag == 1:
                    if time_over_loop == 0:
                        time_over_loop = time.time()
                        print("已断线,正在重置")
                    elif time.time() - time_over_loop > 30:
                        print("仍在断线中,请等待\n")
                        time_over_loop = 0
                else:
                    print("已自动更新步数:"+str(auto_step)+"    完成度:"+str(int(100*((auto_step-begin_step)/(end_step-begin_step))))+"%")
                    e3.delete(0, END)  # 将输入框里面的内容清空
                    e3.insert(0, str(auto_step)) 
                    loop_time_flag = time_flag+1
                    one_step_time = (time.time()-begin_time)/loop_time_flag
                    print("已循环次数:"+str(loop_time_flag))
                    print("平均每步用时:"+str(one_step_time))
                    now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                    print("当前时间:"+time.ctime()+"\n")
                    time.sleep(1)
                    if auto_flag == 1:
                        print("循环关闭")
                        print("自动更新结束\n")
                        return 0
                    if time_flag+1>=auto_loops:
                        print("已完成所有循环")
                        if auto_step < end_step:
                            print("正在补充剩余步数")
                            auto_step = end_step
                            step = str(auto_step)
                            setp_array = step.split('-')
                            while True:
                                try:
                                    push = ''+step_main(user_list[line], passwd_list[line], step, min_num, max_num) + '\n'
                                    print("已自动更新步数:"+str(auto_step)+"    完成度:"+str(int(100*((auto_step-begin_step)/(end_step-begin_step))))+"%")
                                    e3.delete(0, END)  # 将输入框里面的内容清空
                                    e3.insert(0, str(auto_step))
                                    now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                                    print("当前时间:"+time.ctime()+"\n")
                                    print("剩余步数补充完成")
                                    break
                                except:
                                    print("剩余步数补充失败,正在重试")
                                    time.sleep(1)
                                if auto_flag == 1:
                                    print("循环关闭")
                                    print("自动更新结束\n")
                                    return 0
                                else:
                                    auto_flag=0
                        print("自动更新结束\n")
                        return 0
                    else:
                        for j in range(time_flag+1,auto_loops):
                            if time_over_step > 0:
                                auto_step = auto_step + time_over_step
                                time_over_step = 0
                            else:
                                random_step = random.randint(auto_solo-int(auto_solo/5),auto_solo+int(auto_solo/5))
                                auto_step = auto_step + random_step
                            if auto_step > end_step:
                                auto_step = end_step
                            step = str(auto_step)
                            setp_array = step.split('-')
                            try:
                                push = ''+step_main(user_list[line], passwd_list[line], step, min_num, max_num) + '\n'
                                time_over = time.time()
                                time_over_flag = 0
                            except:
                                time_over_flag = 1
                                time_flag = j-1
                                auto_step = auto_step - random_step
                                print("已断线,正在重置")
                                break
                            if TG_flag == 0:
                                thread2 = threading.Thread(target=telegram_bot("小米运动", push))
                                thread2.start()
                            else:
                                TG_flag = 1
                            
                            print("已自动更新步数:"+str(auto_step)+"    完成度:"+str(int(100*((auto_step-begin_step)/(end_step-begin_step))))+"%")
                            e3.delete(0, END)  # 将输入框里面的内容清空
                            e3.insert(0, str(auto_step))
                            loop_time_flag = j+1
                            one_step_time = (time.time()-begin_time)/loop_time_flag
                            print("已循环次数:"+str(loop_time_flag))
                            print("平均每步用时:"+str(one_step_time))
                            now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                            print("当前时间:"+time.ctime()+"\n")
                            if j+1 == auto_loops:
                                print("已完成所有循环")
                                if auto_step < end_step:
                                    print("正在补充剩余步数")
                                    auto_step = end_step
                                    step = str(auto_step)
                                    setp_array = step.split('-')
                                    while True:
                                        try:
                                            push = ''+step_main(user_list[line], passwd_list[line], step, min_num, max_num) + '\n'
                                            print("已自动更新步数:"+str(auto_step)+"    完成度:"+str(int(100*((auto_step-begin_step)/(end_step-begin_step))))+"%")
                                            e3.delete(0, END)  # 将输入框里面的内容清空
                                            e3.insert(0, str(auto_step))
                                            now = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
                                            print("当前时间:"+time.ctime()+"\n")
                                            print("剩余步数补充完成")
                                            break
                                        except:
                                            print("剩余步数补充失败,正在重试")
                                            time.sleep(1)
                                        if auto_flag == 1:
                                            print("循环关闭")
                                            print("自动更新结束\n")
                                            return 0
                                        else:
                                            auto_flag=0
                                print("自动更新结束\n")
                                return 0
                            if auto_flag == 1:
                                print("循环关闭")
                                print("自动更新结束\n")
                                return 0
                            else:
                                auto_flag=0
                                time.sleep(1)
                    
                if loop_flag == 1:
                    print("已完成所有循环")
                    print("自动更新结束")
                    return 0
                if auto_flag == 1:
                    print("循环关闭")
                    print("自动更新结束\n")
                    return 0
            else:
                print("循环关闭")
                
            print("自动更新结束\n")
            return 0

    def start_thread():
        thread0 = threading.Thread(target=start)
        thread0.start()
        
    def auto_thread():
        global auto_flag
        auto_flag=0
        thread1 = threading.Thread(target=auto_steps)
        thread1.start() 
    
    def auto_close():
        global auto_flag
        auto_flag=1
        print("正在关闭自动更新")
        
    def TG_set():
        global TG_BOT_TOKEN
        global TG_USER_ID
        global TG_flag
        TG_flag=0
        TG_BOT_TOKEN=e9.get()
        TG_USER_ID=e10.get()
        print("已设置推送")
    
    def TG_close():
        global TG_BOT_TOKEN
        global TG_USER_ID
        global TG_flag
        TG_flag=1
        TG_BOT_TOKEN=""
        TG_USER_ID=""
        print("已关闭推送")
        
    button0=Button(mainfram,width=30,text="记住用户",command=save_user).place(x=100, y=90, width=200, height=40)
    button1=Button(mainfram,width=30,text="更新步数",command=start_thread).place(x=100, y=250, width=200, height=40)
    button2=Button(mainfram,width=30,text="更新随机步数范围显示",command=save_random).place(x=100, y=170, width=200, height=40)
    button3=Button(mainfram,width=30,text="开启步数自动更新",command=auto_thread).place(x=100, y=410, width=200, height=40)
    button4=Button(mainfram,width=30,text="关闭自动更新",command=auto_close).place(x=100, y=450, width=200, height=40)
    button5=Button(mainfram,width=30,text="设置推送",command=TG_set).place(x=100, y=570, width=200, height=40)
    button6=Button(mainfram,width=30,text="关闭推送",command=TG_close).place(x=100, y=610, width=200, height=40)
    
    root.mainloop()
    
def normal_start():
    # 用户名(单用户的格式为 13800138000 ,多用户用#隔开,例如13800138000#13800138000#13800138000)
    user = input("用户名:")
    # 登录密码(用#隔开,例如123456#123456#123456)
    if user == "":
        print("未登录用户")
        return 0
    passwd = input("密码:")
    # 要修改的步数,直接输入想要修改的步数值,留空为随机步数20000至29999之间
    if passwd == "":
        print("未登录用户")
        return 0
    step = input("步数(默认为20000-29999的随机数):")
    
    min_num = 20000
    max_num = 29999
    
    user_list = user.split('#')
    passwd_list = passwd.split('#')
    setp_array = step.split('-')
    
    if len(user_list) == len(passwd_list):
        push = ''
        for line in range(0,len(user_list)):
            if len(setp_array) == 2:
                step = str(random.randint(int(setp_array[0]),int(setp_array[1])))
            elif str(step) == '0':
                step = ''
            push += step_main(user_list[line], passwd_list[line], step, min_num, max_num) + '\n'
        telegram_bot("小米运动", push)
    else:
        print('用户名和密码数量不对')

if __name__ ==  "__main__":
    print("已打开窗口")
    gui_start()
    print("已关闭窗口,并开启终端模式")
    while True:
        normal_start()
        normal_flag = input("是否继续(Y/N)?:")
        if normal_flag == "N":
            print("程序结束")
            break
        if normal_flag == "Y":
            print("程序继续")
        else:
            print("程序结束")
            break
    

附录:列表的赋值类型和py打包

列表赋值

BUG复现

闲来无事写了个小程序 代码如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 19 19:47:01 2021

@author: 16016
"""

a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
#print(len(a_list))
#b_list = ['','','','','','','','','','','','','','','','']
c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
#for i in range(16):
if len(a_list):
    for j in range(16):
        a_list[j]=str(a_list[j])+'_'+str(j)
        print("序号:",j)
        print('a_list:\n',a_list)
        
        
        c_list[j]=a_list
        print('c_list[0]:\n',c_list[0])
        print('\n')
#        b_list[j]=a_list[7],a_list[8]
#        print(b_list[j])
        # 写入到Excel:
#print(c_list,'\n')    

我在程序中 做了一个16次的for循环 把列表a的每个值后面依次加上"_"和循环序号
比如循环第x次 就是把第x位加上_x 这一位变成x_x 我在输出测试中 列表a的每一次输出也是对的
循环16次后列表a应该变成[‘0_0’, ‘1_1’, ‘2_2’, ‘3_3’, ‘4_4’, ‘5_5’, ‘6_6’, ‘7_7’, ‘8_8’, ‘9_9’, ‘10_10’, ‘11_11’, ‘12_12’, ‘13_13’, ‘14_14’, ‘15_15’] 这也是对的

同时 我将每一次循环时列表a的值 写入到空列表c中 比如第x次循环 就是把更改以后的列表a的值 写入到列表c的第x位
第0次循环后 c[0]的值应该是[‘0_0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘10’, ‘11’, ‘12’, ‘13’, ‘14’, ‘15’] 这也是对的
但是在第1次循环以后 c[0]的值就一直在变 变成了c[x]的值
相当于把c_list[0]变成了c_list[1]…以此类推 最后得出的列表c的值也是每一项完全一样
我不明白这是怎么回事
我的c[0]只在第0次循环时被赋值了 但是后面它的值跟着在改变

如图:
在这里插入图片描述
第一次老出bug 赋值以后 每次循环都改变c[0]的值 搞了半天都没搞出来
无论是用appen函数添加 还是用二维数组定义 或者增加第三个空数组来过渡 都无法解决

代码改进

后来在我华科同学的指导下 突然想到赋值可以赋的是个地址 地址里面的值一直变化 导致赋值也一直变化 于是用第二张图的循环套循环深度复制实现了

代码如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 19 19:47:01 2021

@author: 16016
"""

a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
#print(len(a_list))
#b_list = ['','','','','','','','','','','','','','','','']
c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
#for i in range(16):
if len(a_list):
    for j in range(16):
        a_list[j]=str(a_list[j])+'_'+str(j)
        print("序号:",j)
        print('a_list:\n',a_list)
        
        
        for i in range(16):
            c_list[j].append(a_list[i])
        print('c_list[0]:\n',c_list[0])
        print('\n')
#        b_list[j]=a_list[7],a_list[8]
#        print(b_list[j])
        # 写入到Excel:
print(c_list,'\n')    

解决了问题

在这里插入图片描述

优化

第三次是请教了老师 用copy函数来赋真值

代码如下:

# -*- coding: utf-8 -*-
"""
Created on Fri Nov 19 19:47:01 2021

@author: 16016
"""

a_list = ['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15']
#print(len(a_list))
#b_list = ['','','','','','','','','','','','','','','','']
c_list = [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]
#for i in range(16):
if len(a_list):
    for j in range(16):
        a_list[j]=str(a_list[j])+'_'+str(j)
        print("序号:",j)
        print('a_list:\n',a_list)
        
        
        c_list[j]=a_list.copy()
        print('c_list[0]:\n',c_list[0])
        print('\n')
#        b_list[j]=a_list[7],a_list[8]
#        print(b_list[j])
        # 写入到Excel:
#print(c_list,'\n')    

同样能解决问题
在这里插入图片描述
最后得出问题 就是指针惹的祸!

a_list指向的是个地址 而不是值 a_list[i]指向的才是单个的值 copy()函数也是复制值而不是地址

如果这个用C语言来写 就直观一些了 难怪C语言是基础 光学Python不学C 遇到这样的问题就解决不了

C语言yyds Python是什么垃圾弱智语言

总结

由于Python无法单独定义一个值为指针或者独立的值 所以只能用列表来传送
只要赋值是指向一个列表整体的 那么就是指向的一个指针内存地址 解决方法只有一个 那就是将每个值深度复制赋值(子列表内的元素提取出来重新依次连接) 或者用copy函数单独赋值

如图测试:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
部分代码:

# -*- coding: utf-8 -*-
"""
Created on Sat Nov 20 16:45:48 2021

@author: 16016
"""

def text1():
    A=[1,2,3]
    B=[[],[],[]]
    for i in range(len(A)):
        A[i]=A[i]+i
        B[i]=A
        print(B)

def text2():
    A=[1,2,3]
    B=[[],[],[]]
    
    A[0]=A[0]+0
    B[0]=A
    print(B)
    A[1]=A[1]+1
    B[1]=A
    print(B)
    A[2]=A[2]+2
    B[2]=A
    print(B)
    
if __name__ == '__main__':
    text1()
    print('\n')
    text2()

py打包

Pyinstaller打包exe(包括打包资源文件 绝不出错版)

依赖包及其对应的版本号

PyQt5 5.10.1
PyQt5-Qt5 5.15.2
PyQt5-sip 12.9.0

pyinstaller 4.5.1
pyinstaller-hooks-contrib 2021.3

Pyinstaller -F setup.py 打包exe

Pyinstaller -F -w setup.py 不带控制台的打包

Pyinstaller -F -i xx.ico setup.py 打包指定exe图标打包

打包exe参数说明:

-F:打包后只生成单个exe格式文件;

-D:默认选项,创建一个目录,包含exe文件以及大量依赖文件;

-c:默认选项,使用控制台(就是类似cmd的黑框);

-w:不使用控制台;

-p:添加搜索路径,让其找到对应的库;

-i:改变生成程序的icon图标。

如果要打包资源文件
则需要对代码中的路径进行转换处理
另外要注意的是 如果要打包资源文件 则py程序里面的路径要从./xxx/yy换成xxx/yy 并且进行路径转换
但如果不打包资源文件的话 最好路径还是用作./xxx/yy 并且不进行路径转换

def get_resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)

而后再spec文件中的datas部分加入目录
如:

a = Analysis(['cxk.py'],
             pathex=['D:\\Python Test\\cxk'],
             binaries=[],
             datas=[('root','root')],
             hiddenimports=[],
             hookspath=[],
             hooksconfig={},
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)

而后直接Pyinstaller -F setup.spec即可

如果打包的文件过大则更改spec文件中的excludes 把不需要的库写进去(但是已经在环境中安装了的)就行

这些不要了的库在上一次编译时的shell里面输出
比如:
在这里插入图片描述

在这里插入图片描述
然后用pyinstaller --clean -F 某某.spec

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式拳铁编曲MikeZhou

光电帝国,光联万物!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值