一个用于同步步数到小米运动(Zepp Life)应用的 PHP API 接口,将项目文件上传到 PHP 服务器,确保服务器支持 cURL 扩展,直接通过 URL 参数调用接口,本项目默认支持手机号or邮箱登录。
建议步数设置在合理范围内(8000-30000)避免在短时间内对同一账号多次修改步数。

在单 IP 多账号的情况下可能导致 IP 被拉黑!
为避免 IP 被限制,请注意:
- 单 IP 建议不要同时处理过多账号
- 如需批量处理多个账号,请使用代理 IP 或分散到不同服务器
- 设置合理的请求间隔,避免频繁请求
<?php
/**
* 小米运动刷步数 - 单账号固定步数 API 版
* 使用方法(GET/POST均可):
* user - 账号(手机号或邮箱)
* pwd - 密码
* step - 固定步数(必填)
*
* 示例:
* curl "http://你的服务器/index.php?user=13800138000&pwd=123456&step=20000&token=147369"
*/
$token = "147369";
if (!isset($_GET['token']) || $_GET['token'] !== $token) {
die("密码错误或为空");
}
date_default_timezone_set('Asia/Shanghai');
// 从 POST 获取参数,否则从 GET 获取
function param($key, $default = '') {
return isset($_POST[$key]) ? trim($_POST[$key]) : (isset($_GET[$key]) ? trim($_GET[$key]) : $default);
}
// 脱敏账号
function desensitizeUserName($user) {
$len = strlen($user);
if ($len <= 8) {
$ln = max(intval(floor($len / 3)), 1);
return substr($user, 0, $ln) . "***" . substr($user, -$ln);
}
return substr($user, 0, 3) . "****" . substr($user, -4);
}
// 安全文件名过滤
function getSafeFilename($username) {
// 移除可能引起路径遍历的字符
$safeName = preg_replace('/[^a-zA-Z0-9_-@.]/', '_', $username);
// 限制文件名长度
if (strlen($safeName) > 100) {
$safeName = substr($safeName, 0, 100);
}
return $safeName;
}
class MiMotionRunner {
private $user;
private $password;
public $logStr = "";
public $invalid = false;
private $cacheDir = __DIR__ . '/cache/'; // 缓存目录,可自定义
private $cacheFile;
function __construct($user, $passwd) {
if (!$user || !$passwd) {
$this->invalid = true;
$this->logStr .= "用户名或密码填写有误!n";
return;
}
$this->user = $user;
$this->password = $passwd;
if (!is_dir($this->cacheDir)) {
mkdir($this->cacheDir, 0755, true);
}
$this->cacheFile = $this->cacheDir . getSafeFilename($user) . '.txt';
}
// 读取缓存
private function readCache() {
if (!file_exists($this->cacheFile)) {
return null;
}
$fp = fopen($this->cacheFile, 'r');
if (!$fp) {
return null;
}
if (flock($fp, LOCK_SH)) {
$data = file_get_contents($this->cacheFile);
flock($fp, LOCK_UN);
fclose($fp);
$cache = json_decode($data, true);
if (!$cache || !isset($cache['expire_time']) || $cache['expire_time'] < time()) {
$this->clearCache();
return null;
}
return $cache;
} else {
fclose($fp);
return null;
}
}
// 写入缓存
private function writeCache($access, $third_name) {
$cacheData = [
'access' => $access,
'third_name' => $third_name,
'user' => $this->user,
'create_time' => time(),
'expire_time' => time() + 604800 // 7天后过期(暂时还不知道具体多久过期,后续可能修改)
];
$jsonData = json_encode($cacheData);
// 保险起见先写入临时文件,然后重命名
$tempFile = $this->cacheFile . '.tmp.' . uniqid();
$fp = fopen($tempFile, 'w');
if (!$fp) {
return false;
}
if (flock($fp, LOCK_EX)) {
fwrite($fp, $jsonData);
fflush($fp);
flock($fp, LOCK_UN);
fclose($fp);
if (rename($tempFile, $this->cacheFile)) {
return true;
} else {
unlink($tempFile);
return false;
}
} else {
fclose($fp);
unlink($tempFile);
return false;
}
}
// 清除缓存
private function clearCache() {
if (file_exists($this->cacheFile)) {
unlink($this->cacheFile);
}
}
private function encryptData($plain) {
$key = 'xeNtBVqzDc6tuNTh';
$iv = 'MAAAYAAAAAAAAABg';
$cipher = openssl_encrypt($plain, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
return $cipher;
}
private function curl($url, $data = null, $app_token = null, $ekv = false) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
$httpheader[] = "Accept: application/json";
$httpheader[] = "Accept-Language: zh-CN,zh;q=0.8";
$httpheader[] = "Connection: keep-alive";
if ($ekv) $httpheader[] = "x-hm-ekv: 1";
$httpheader[] = "app_name: com.xiaomi.hm.health";
$httpheader[] = "appname: com.xiaomi.hm.health";
$httpheader[] = "appplatform: android_phone";
if ($app_token) {
$httpheader[] = "apptoken: " . $app_token;
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $httpheader);
if ($data) {
if (is_array($data)) $data = http_build_query($data);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_POST, 1);
}
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_USERAGENT, 'MiFit6.14.0 (OPD2413; Android 15; Density/2.625)');
curl_setopt($ch, CURLOPT_HEADER, 1);
$ret = curl_exec($ch);
$headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($ret, 0, $headerSize);
$body = substr($ret, $headerSize);
$ret = array();
$ret['header'] = $header;
$ret['body'] = $body;
curl_close($ch);
return $ret;
}
private function getAccess($username, $password) {
// 首先尝试从缓存读取
$cache = $this->readCache();
if ($cache && isset($cache['access']) && isset($cache['third_name'])) {
return [$cache['access'], $cache['third_name']];
}
// 缓存不存在或已过期,从API获取
$third_name = strpos($username, '@') === false ? 'huami_phone' : 'email';
if (!strpos($username, '@')) $username = '+86' . $username;
$url = 'https://api-user.zepp.com/v2/registrations/tokens';
$data = [
'emailOrPhone' => $username,
'password' => $password,
'state' => 'REDIRECTION',
'client_id' => 'HuaMi',
'country_code' => 'CN',
'token' => 'access',
'redirect_uri' => 'https://s3-us-west-2.amazonaws.com/hm-registration/successsignin.html',
];
$body = $this->encryptData(http_build_query($data));
$response = $this->curl($url, $body, null, true);
if (preg_match("/access=(.*?)&/", $response['header'], $access)) {
// 成功获取,写入缓存
$this->writeCache($access[1], $third_name);
return [$access[1], $third_name];
} elseif (preg_match("/refresh=(.*?)&/", $response['header'], $refresh)) {
// 成功获取,写入缓存
$this->writeCache($refresh[1], $third_name);
return [$refresh[1], $third_name];
} elseif (strpos($response['header'], 'error=')) {
// 登录失败时清除可能存在的旧缓存
$this->clearCache();
throw new Exception('账号或密码错误!');
} else {
throw new Exception('登录token接口请求失败');
}
}
public function login() {
try {
list($access, $third_name) = $this->getAccess($this->user, $this->password);
$url = 'https://account.zepp.com/v2/client/login';
$data = [
'app_name' => 'com.xiaomi.hm.health',
'country_code' => 'CN',
'code' => $access,
'device_id' => 'efd38eeb-160d-44e4-9317-6df2145bcb0a',
'device_model' => 'android_phone',
'app_version' => '6.14.0',
'grant_type' => 'access_token',
'allow_registration' => 'false',
'dn' => 'account.zepp.com,api-user.zepp.com,api-mifit.zepp.com,api-watch.zepp.com,app-analytics.zepp.com,api-analytics.huami.com,auth.zepp.com',
'third_name' => $third_name,
'source' => 'com.xiaomi.hm.health:6.14.0:50818',
'lang' => 'zh',
];
$response = $this->curl($url, $data);
$arr = json_decode($response['body'], true);
if (!$arr) {
throw new Exception('登录接口请求失败');
} elseif (isset($arr['result']) && $arr['result'] == 'ok') {
$token = $arr['token_info']['app_token'];
$userid = $arr['token_info']['user_id'];
return [$token, $userid];
} else {
// 登录失败时清除缓存,因为token可能已失效
$this->clearCache();
throw new Exception('登录失败' . $response['body']);
}
} catch (Exception $e) {
return [0, 0];
}
}
public function loginAndPostStep($step) {
if ($this->invalid) return ["账号或密码配置有误", false];
list($token, $userid) = $this->login();
if (!$token) return ["登录失败!", false];
try {
$url = "https://api-mifit-cn.zepp.com/v1/data/band_data.json?&t=" . time();
$json = '[{"data_hr":"//////9L////////////Vv///////////0v///////////9e/////0n/a///S////////////0b//////////1FK////////////R/////////////////9PTFFpaf9L////////////R////////////0j///////////9K////////////Ov///////////zf///86/zr/Ov88/zf/Pf///0v/S/8/////////////Sf///////////z3//////0r/Ov//////S/9L/zb/Sf9K/0v/Rf9H/zj/Sf9K/0//N////0D/Sf83/zr/Pf9M/0v/Ov9e////////////S////////////zv//z7/O/83/zv/N/83/zr/N/86/z//Nv83/zn/Xv84/zr/PP84/zj/N/9e/zr/N/89/03/P/89/z3/Q/9N/0v/Tv9C/0H/Of9D/zz/Of88/z//PP9A/zr/N/86/zz/Nv87/0D/Ov84/0v/O/84/zf/MP83/zH/Nv83/zf/N/84/zf/Of82/zf/OP83/zb/Mv81/zX/R/9L/0v/O/9I/0T/S/9A/zn/Pf89/zn/Nf9K/07/N/83/zn/Nv83/zv/O/9A/0H/Of8//zj/PP83/zj/S/87/zj/Nv84/zf/Of83/zf/Of83/zb/Nv9L/zj/Nv82/zb/N/85/zf/N/9J/zf/Nv83/zj/Nv84/0r/Sv83/zf/MP///zb/Mv82/zb/Of85/z7/Nv8//0r/S/85/0H/QP9B/0D/Nf89/zj/Ov83/zv/Nv8//0f/Sv9O/0ZeXv///////////1X///////////9B////////////TP///1b//////0////////////9N/////////v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+","date":"' . date('Y-m-d') . '","data":[{"start":0,"stop":1439,"value":"UA8AUBQAUAwAUBoAUAEAYCcAUBkAUB4AUBgAUCAAUAEAUBkAUAwAYAsAYB8AYB0AYBgAYCoAYBgAYB4AUCcAUBsAUB8AUBwAUBIAYBkAYB8AUBoAUBMAUCEAUCIAYBYAUBwAUCAAUBgAUCAAUBcAYBsAYCUAATIPYD0KECQAYDMAYB0AYAsAYCAAYDwAYCIAYB0AYBcAYCQAYB0AYBAAYCMAYAoAYCIAYCEAYCYAYBsAYBUAYAYAYCIAYCMAUB0AUCAAUBYAUCoAUBEAUC8AUB0AUBYAUDMAUDoAUBkAUC0AUBQAUBwAUA0AUBsAUAoAUCEAUBYAUAwAUB4AUAwAUCcAUCYAUCwKYDUAAUUlEC8IYEMAYEgAYDoAYBAAUAMAUBkAWgAAWgAAWgAAWgAAWgAAUAgAWgAAUBAAUAQAUA4AUA8AUAkAUAIAUAYAUAcAUAIAWgAAUAQAUAkAUAEAUBkAUCUAWgAAUAYAUBEAWgAAUBYAWgAAUAYAWgAAWgAAWgAAWgAAUBcAUAcAWgAAUBUAUAoAUAIAWgAAUAQAUAYAUCgAWgAAUAgAWgAAWgAAUAwAWwAAXCMAUBQAWwAAUAIAWgAAWgAAWgAAWgAAWgAAWgAAWgAAWgAAWREAWQIAUAMAWSEAUDoAUDIAUB8AUCEAUC4AXB4AUA4AWgAAUBIAUA8AUBAAUCUAUCIAUAMAUAEAUAsAUAMAUCwAUBYAWgAAWgAAWgAAWgAAWgAAWgAAUAYAWgAAWgAAWgAAUAYAWwAAWgAAUAYAXAQAUAMAUBsAUBcAUCAAWwAAWgAAWgAAWgAAWgAAUBgAUB4AWgAAUAcAUAwAWQIAWQkAUAEAUAIAWgAAUAoAWgAAUAYAUB0AWgAAWgAAUAkAWgAAWSwAUBIAWgAAUC4AWSYAWgAAUAYAUAoAUAkAUAIAUAcAWgAAUAEAUBEAUBgAUBcAWRYAUA0AWSgAUB4AUDQAUBoAXA4AUA8AUBwAUA8AUA4AUA4AWgAAUAIAUCMAWgAAUCwAUBgAUAYAUAAAUAAAUAAAUAAAUAAAUAAAUAAAUAAAUAAAWwAAUAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAeSEAeQ8AcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBcAcAAAcAAAcCYOcBUAUAAAUAAAUAAAUAAAUAUAUAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcCgAeQAAcAAAcAAAcAAAcAAAcAAAcAYAcAAAcBgAeQAAcAAAcAAAegAAegAAcAAAcAcAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcCkAeQAAcAcAcAAAcAAAcAwAcAAAcAAAcAIAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcCIAeQAAcAAAcAAAcAAAcAAAcAAAeRwAeQAAWgAAUAAAUAAAUAAAUAAAUAAAcAAAcAAAcBoAeScAeQAAegAAcBkAeQAAUAAAUAAAUAAAUAAAUAAAUAAAcAAAcAAAcAAAcAAAcAAAcAAAegAAegAAcAAAcAAAcBgAeQAAcAAAcAAAcAAAcAAAcAAAcAkAegAAegAAcAcAcAAAcAcAcAAAcAAAcAAAcAAAcA8AeQAAcAAAcAAAeRQAcAwAUAAAUAAAUAAAUAAAUAAAUAAAcAAAcBEAcA0AcAAAWQsAUAAAUAAAUAAAUAAAUAAAcAAAcAoAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAYAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBYAegAAcAAAcAAAegAAcAcAcAAAcAAAcAAAcAAAcAAAeRkAegAAegAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAEAcAAAcAAAcAAAcAUAcAQAcAAAcBIAeQAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBsAcAAAcAAAcBcAeQAAUAAAUAAAUAAAUAAAUAAAUBQAcBYAUAAAUAAAUAoAWRYAWTQAWQAAUAAAUAAAUAAAcAAAcAAAcAAAcAAAcAAAcAMAcAAAcAQAcAAAcAAAcAAAcDMAeSIAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcAAAcBQAeQwAcAAAcAAAcAAAcAMAcAAAeSoAcA8AcDMAcAYAeQoAcAwAcFQAcEMAeVIAaTYAbBcNYAsAYBIAYAIAYAIAYBUAYCwAYBMAYDYAYCkAYDcAUCoAUCcAUAUAUBAAWgAAYBoAYBcAYCgAUAMAUAYAUBYAUA4AUBgAUAgAUAgAUAsAUAsAUA4AUAMAUAYAUAQAUBIAASsSUDAAUDAAUBAAYAYAUBAAUAUAUCAAUBoAUCAAUBAAUAoAYAIAUAQAUAgAUCcAUAsAUCIAUCUAUAoAUA4AUB8AUBkAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAAfgAA","tz":32,"did":"DA932FFFFE8816E7","src":24}],"summary":"{"v":6,"slp":{"st":1628296479,"ed":1628296479,"dp":0,"lt":0,"wk":0,"usrSt":-1440,"usrEd":-1440,"wc":0,"is":0,"lb":0,"to":0,"dt":0,"rhr":0,"ss":0},"stp":{"ttl":' . $step . ',"dis":10627,"cal":510,"wk":41,"rn":50,"runDist":7654,"runCal":397,"stage":[{"start":327,"stop":341,"mode":1,"dis":481,"cal":13,"step":680},{"start":342,"stop":367,"mode":3,"dis":2295,"cal":95,"step":2874},{"start":368,"stop":377,"mode":4,"dis":1592,"cal":88,"step":1664},{"start":378,"stop":386,"mode":3,"dis":1072,"cal":51,"step":1245},{"start":387,"stop":393,"mode":4,"dis":1036,"cal":57,"step":1124},{"start":394,"stop":398,"mode":3,"dis":488,"cal":19,"step":607},{"start":399,"stop":414,"mode":4,"dis":2220,"cal":120,"step":2371},{"start":415,"stop":427,"mode":3,"dis":1268,"cal":59,"step":1489},{"start":428,"stop":433,"mode":1,"dis":152,"cal":4,"step":238},{"start":434,"stop":444,"mode":3,"dis":2295,"cal":95,"step":2874},{"start":445,"stop":455,"mode":4,"dis":1592,"cal":88,"step":1664},{"start":456,"stop":466,"mode":3,"dis":1072,"cal":51,"step":1245},{"start":467,"stop":477,"mode":4,"dis":1036,"cal":57,"step":1124},{"start":478,"stop":488,"mode":3,"dis":488,"cal":19,"step":607},{"start":489,"stop":499,"mode":4,"dis":2220,"cal":120,"step":2371},{"start":500,"stop":511,"mode":3,"dis":1268,"cal":59,"step":1489},{"start":512,"stop":522,"mode":1,"dis":152,"cal":4,"step":238}]},"goal":8000,"tz":"28800"}","source":24,"type":0}]';
$data = [
'data_json' => $json,
'userid' => $userid,
'device_type' => '0',
'last_sync_data_time' => time() . '',
'last_deviceid' => 'C4D2D4FFFE8C5068',
];
$response = $this->curl($url, $data, $token);
$arr = json_decode($response['body'], true);
if (!$arr) {
throw new Exception('修改步数接口请求失败');
} elseif (isset($arr['code']) && $arr['code'] == 1) {
return ["修改步数({$step})", true];
} else {
$message = isset($arr['message']) ? $arr['message'] : $response['body'];
throw new Exception('修改步数失败:' . $message);
}
} catch (Exception $e) {
return [$e->getMessage(), false];
}
}
}
// ---------------- 主执行逻辑 ----------------
$user = param('user');
$pwd = param('pwd');
$step = intval(param('step'));
if (!$user || !$pwd || !$step) {
echo json_encode([
"error" => "参数不完整,必须提供 user, pwd, step"
], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
exit;
}
$runner = new MiMotionRunner($user, $pwd);
list($msg, $success) = $runner->loginAndPostStep($step);
$output = [
"time" => date("Y-m-d H:i:s"),
"user" => desensitizeUserName($user),
"step" => $step,
"status" => $success ? "success" : "failed",
"message" => $msg
];
header('Content-Type: application/json; charset=utf-8');
echo json_encode($output, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
?>
文章评论