概述
最近公司为了员工身体健康,举行一个健步走的活动,活动周期为一个月,前十名会有对应的奖励,一个同事就问我有没有走捷径的方法,虽说我也是一个比较爱运动的人(用不到),但也很好奇,经过面向百度,最后看看效果吧,可提供接口,直接使用!
需下载第三方APP:zepp life(小米运动)
实现效果
AutoJS:



网页版地址:http://117.72.103.61:3000/#/wx
数据来源(如有侵犯,请联系删除)
我是在GitHub上面找的,看到大佬都是用Python,但是我想用Java写,就仿写了一个。
源代码(没真正的测试过):
# -*- coding: utf8 -*-
import math
import traceback
from datetime import datetime
import pytz
import json
import random
import re
import time
import os
import requests
# 获取北京时间
def get_beijing_time():
target_timezone = pytz.timezone('Asia/Shanghai')
# 获取当前时间
return datetime.now().astimezone(target_timezone)
# 格式化时间
def format_now():
return get_beijing_time().strftime("%Y-%m-%d %H:%M:%S")
# 获取默认值转int
def get_int_value_default(_config: dict, _key, default):
_config.setdefault(_key, default)
return int(_config.get(_key))
# 获取当前时间对应的最大和最小步数
def get_min_max_by_time(hour=None, minute=None):
if hour is None:
hour = time_bj.hour
if minute is None:
minute = time_bj.minute
time_rate = min((hour * 60 + minute) / (22 * 60), 1)
min_step = get_int_value_default(config, 'MIN_STEP', 18000)
max_step = get_int_value_default(config, 'MAX_STEP', 25000)
return int(time_rate * min_step), int(time_rate * max_step)
# 虚拟ip地址
def fake_ip():
# 随便找的国内IP段:223.64.0.0 - 223.117.255.255
return f"{
223}.{
random.randint(64, 117)}.{
random.randint(0, 255)}.{
random.randint(0, 255)}"
# 账号脱敏
def desensitize_user_name(user):
if len(user) <= 8:
ln = max(math.floor(len(user) / 3), 1)
return f'{
user[:ln]}***{
user[-ln:]}'
return f'{
user[:3]}****{
user[-4:]}'
# 获取时间戳
def get_time():
current_time = get_beijing_time()
return "%.0f" % (current_time.timestamp() * 1000)
# 获取登录code
def get_access_token(location):
code_pattern = re.compile("(?<=access=).*?(?=&)")
result = code_pattern.findall(location)
if result is None or len(result) == 0:
return None
return result[0]
# pushplus消息推送
def push_plus(title, content):
requestUrl = f"http://www.pushplus.plus/send"
data = {
"token": PUSH_PLUS_TOKEN,
"title": title,
"content": content,
"template": "html",
"channel": "wechat"
}
try:
response = requests.post(requestUrl, data=data)
if response.status_code == 200:
json_res = response.json()
print(f"pushplus推送完毕:{
json_res['code']}-{
json_res['msg']}")
else:
print("pushplus推送失败")
except:
print("pushplus推送异常")
class MiMotionRunner:
def __init__(self, _user, _passwd):
user = str(_user)
password = str(_passwd)
self.invalid = False
self.log_str = ""
if user == '' or password == '':
self.error = "用户名或密码填写有误!"
self.invalid = True
pass
self.password = password
if ("+86" in user) or "@" in user:
user = user
else:
user = "+86" + user
if "+86" in user:
self.is_phone = True
else:
self.is_phone = False
self.user = user
self.fake_ip_addr = fake_ip()
self.log_str += f"创建虚拟ip地址:{
self.fake_ip_addr}\n"
# 登录
def login(self):
url1 = "https://api-user.huami.com/registrations/" + self.user + "/tokens"
login_headers = {
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8",
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 14_7_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2",
"X-Forwarded-For": self.fake_ip_addr
}
data1 = {
"client_id": "HuaMi",
"password": f"{
self.password}",
"redirect_uri": "https://s3-us-west-2.amazonaws.com/hm-registration/successsignin.html",
"token": "access"
}
r1 = requests.post(url1, data=data1, headers=login_headers, allow_redirects=False)
if r1.status_code != 303:
self.log_str += "登录异常,status: %d\n" % r1.status_code
return 0, 0
location = r1.headers["Location"]
try:
code = get_access_token(location)
if code is None:
self.log_str += "获取accessToken失败\n"
return 0, 0
except:
self.log_str += f"获取accessToken异常:{
traceback.format_exc()}\n"
return 0, 0
# print("access_code获取成功!")
# print(code)
url2 = "https://account.huami.com/v2/client/login"
if self.is_phone:
data2 = {
"app_name": "com.xiaomi.hm.health",
"app_version": "4.6.0",
"code": f"