微信运动刷步基于zepp的刷步数

不需要手环设备,手机安装zepp运动软件进入zepp->我的->三方账户绑定  选择支付宝/微信完成绑定(微信和支付宝好像只能绑定一个)。

图片[1]-微信运动刷步基于zepp的刷步数-微分享自媒体驿站

基于Python代码,需要电脑安装Python,安装完成后,先执行pip install requests 安装模块后。

把以下完整代杩保存为py后缀的格式。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
 
import requests
import random
import time
import json
import logging
from datetime import datetime
import base64
import hashlib
 
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
 
# 多账号配置
ACCOUNTS = [
    {"username": "账号", "password": "密码"},    
]
 
# 步数范围配置
STEP_RANGES = {
    8: {"min": 6000, "max": 10000},
    12: {"min": 8000, "max": 14000},
    16: {"min": 10000, "max": 18000},
    20: {"min": 12000, "max": 22000},
    22: {"min": 15000, "max": 24000}
}
 
# 默认步数(当不在指定时间段时使用)
DEFAULT_STEPS = 24465
 
 
class StepSubmitter:
    def __init__(self):
        self.session = requests.Session()
        # 设置浏览器般的请求头
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.7339.128 Safari/537.36',
            'Accept': 'application/json, text/javascript, */*; q=0.01',
            'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'Origin': 'https://m.cqzz.top',
            'Referer': 'https://m.cqzz.top/',
            'X-Requested-With': 'XMLHttpRequest'
        }
        self.base_url = 'https://wzz.wangzouzou.com/motion/api/motion/Xiaomi'
 
    def get_current_steps(self):
        """根据当前时间获取对应的步数范围"""
        current_hour = datetime.now().hour
        logger.info(f"当前时间: {datetime.now()}, 小时: {current_hour}")
 
        # 找到最接近的配置时间段
        closest_hour = None
        min_diff = float('inf')
 
        for hour in STEP_RANGES.keys():
            diff = abs(current_hour - hour)
            if diff < min_diff:
                min_diff = diff
                closest_hour = hour
 
        # 如果找到接近的配置且在合理范围内(2小时内),使用该配置
        if min_diff <= 2 and closest_hour in STEP_RANGES:
            step_config = STEP_RANGES[closest_hour]
            steps = random.randint(step_config['min'], step_config['max'])
            logger.info(f"使用 {closest_hour} 点配置,生成步数: {steps}")
        else:
            steps = DEFAULT_STEPS
            logger.info(f"使用默认步数: {steps}")
 
        return steps
 
    def validate_credentials(self, username, password):
        """验证账号密码格式(模拟前端验证)"""
        import re
 
        # 手机号正则
        phone_pattern = r'^1[3-9]\d{9}$'
        # 邮箱正则(简化版)
        email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
 
        if not username or not password:
            return False, "账号或密码不能为空"
 
        if ' ' in password:
            return False, "密码不能包含空格"
 
        if re.match(phone_pattern, username) or re.match(email_pattern, username):
            return True, "验证通过"
        else:
            return False, "账号格式错误(需为手机号或邮箱)"
 
    def insert_str(self, s: str, pos: int, insert_value) -> str:
        s = s or ""
        return s[:pos] + str(insert_value) + s[pos:]
 
    def mm(self, xmphone: str, xmpwd: str, time_ms: int) -> str:
        """构建秘钥"""
        steps = ["4", "1", "0", "2", "3"]
        key = ""
        utc_time = datetime.utcfromtimestamp(time_ms / 1000.0)
        utc_month = utc_time.month - 1
 
        for step in steps:
            if step == "4":
                time_str = str(time_ms)
                key = f"{xmphone}{time_str[8:13]}{xmpwd}"
            elif step == "1":
                key = base64.b64encode(key.encode("utf-8")).decode("utf-8")
            elif step == "0":
                key = self.insert_str(key, utc_time.hour, utc_month)
            elif step == "2":
                key = self.insert_str(key, utc_month, utc_time.hour)[7:27]
            elif step == "3":
                key = hashlib.md5(key.encode("utf-8")).hexdigest()
 
        return key
 
    def submit_steps(self, username, password, steps):
        """提交步数到服务器"""
        try:
            # 先验证凭证格式
            is_valid, message = self.validate_credentials(username, password)
            if not is_valid:
                return False, f"验证失败: {message}"
 
            # 准备请求数据
            data = {
                'phone': username,
                'pwd': password,
                'num': steps
            }
 
            logger.info(f"准备提交 - 账号: {username}, 步数: {steps}")
 
            time_val = int(time.time() * 1000)
            self.headers["time"] = str(time_val)
            self.headers["Authorization"] = self.mm(username, password, time_val)
 
            # 发送请求
            response = self.session.post(
                self.base_url,
                data=data,
                headers=self.headers,
                timeout=30,
                proxies={"http": None, "https": None}
            )
 
            # 解析响应
            if response.status_code == 200:
                result = response.json()
                if result.get('code') == 200:
                    return True, f"提交成功! 步数: {steps}"
                else:
                    error_msg = result.get('data', '未知错误')
                    # 处理频繁提交的情况
                    if '频繁' in error_msg:
                        return False, "提交过于频繁,请稍后再试"
                    else:
                        return False, f"提交失败: {error_msg}"
            else:
                return False, f"HTTP错误: {response.status_code}"
 
        except requests.exceptions.RequestException as e:
            return False, f"网络请求错误: {str(e)}"
        except json.JSONDecodeError:
            return False, "响应解析错误"
        except Exception as e:
            return False, f"未知错误: {str(e)}"
 
    def run(self):
        """主执行函数"""
        logger.info("开始执行步数提交任务")
        logger.info(f"共有 {len(ACCOUNTS)} 个账号需要处理")
 
        success_count = 0
        fail_count = 0
 
        for i, account in enumerate(ACCOUNTS, 1):
            logger.info(f"处理第 {i}/{len(ACCOUNTS)} 个账号: {account['username']}")
 
            try:
                # 获取当前应提交的步数
                steps = self.get_current_steps()
 
                # 提交步数
                success, message = self.submit_steps(
                    account['username'],
                    account['password'],
                    steps
                )
 
                if success:
                    success_count += 1
                    logger.info(f"&#10003; 账号 {account['username']} - {message}")
                else:
                    fail_count += 1
                    logger.error(f"&#10007; 账号 {account['username']} - {message}")
 
            except Exception as e:
                fail_count += 1
                logger.error(f"&#10007; 账号 {account['username']} - 处理异常: {str(e)}")
 
            # 账号间间隔(最后一个账号不需要等待)
            if i < len(ACCOUNTS):
                logger.info("等待5秒后处理下一个账号...")
                time.sleep(5)
 
        # 汇总结果
        logger.info(f"任务完成! 成功: {success_count}, 失败: {fail_count}")
 
        return success_count, fail_count
 
 
def main():
    """主函数(青龙面板入口)"""
    try:
        submitter = StepSubmitter()
        success_count, fail_count = submitter.run()
 
        # 返回结果给青龙面板
        if fail_count == 0:
            print("所有账号提交成功!")
            exit(0)
        else:
            print(f"部分账号提交失败,成功: {success_count}, 失败: {fail_count}")
            exit(1)
 
    except Exception as e:
        logger.error(f"脚本执行异常: {str(e)}")
        exit(1)
 
 
if __name__ == "__main__":
    main()

图片[2]-微信运动刷步基于zepp的刷步数-微分享自媒体驿站

改后:执行python 加文件,然后去APP看是不是有步数了,最后看微信运动OK。

© 版权声明
THE END
喜欢就支持一下吧
点赞4181 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容