用deepseek写的第一段代码——定时自动发短信

成功关键还在于选对了工具
中间用了好几个手机Python编译器,
包括Python编译器ide
QPython,最后还是只有QPython Plus有短信权限选择。
在这里插入图片描述

import os
import time
import datetime
import androidhelper
import threading

===== 用户配置区域 =====

PHONE_NUMBER = “15177101512”
MESSAGE = “生日快乐”
TARGET_HOUR = 15 # 凌晨1点
TARGET_MINUTE = 2 # 25分

=======================

全局Android对象

droid = androidhelper.Android()

日志功能

def log(msg):
“”“记录日志”""
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
full_msg = f"[{timestamp}] {msg}"
print(full_msg)

# 在设备上显示 toast
try:
    droid.makeToast(full_msg)
except:
    pass

设备控制

def wake_device():
“”“唤醒设备”""
try:
# 物理按键唤醒
droid.wakeLockAcquireDim()
droid.wakeUp()
time.sleep(1)

    # 滑动解锁
    droid.drag(500, 1500, 500, 500, 0.5)
    time.sleep(1)
    
    log("设备已唤醒")
except Exception as e:
    log(f"唤醒设备出错: {e}")

def keep_screen_on():
“”“保持屏幕常亮”""
try:
# 使用系统API设置常亮
droid.toggleRingerSilentMode(False)
droid.setRingerVolume(0)
log(“屏幕保持常亮”)
except Exception as e:
log(f"保持屏幕常亮出错: {e}")

短信发送功能

def send_sms_direct():
“”“直接发送短信(不依赖UI)”""
try:
log(“尝试直接发送短信…”)
droid.smsSend(PHONE_NUMBER, MESSAGE)
log(“短信发送请求已提交”)
return True
except Exception as e:
log(f"直接发送失败: {e}")
return False

def send_sms_ui():
“”“通过UI发送短信”""
try:
log(“打开短信界面…”)

    # 使用正确的Intent格式
    droid.startActivity(
        "android.intent.action.SENDTO",
        f"smsto:{PHONE_NUMBER}",
        None,  # type
        None,  # extras
        False,  # wait
        {"sms_body": MESSAGE}  # bundle
    )
    time.sleep(5)  # 给更多时间加载
    
    log("尝试点击发送按钮...")
    
    # 尝试点击屏幕右下角(发送按钮通常位置)
    screen_info = droid.getDisplayInfo().result
    if screen_info:
        width = screen_info["width"]
        height = screen_info["height"]
        # 点击右下角区域
        droid.touch(width - 100, height - 100, "DOWN_AND_UP")
        time.sleep(2)
        return True
    else:
        # 默认点击位置
        droid.touch(700, 2200, "DOWN_AND_UP")
        time.sleep(2)
        return True
    
except Exception as e:
    log(f"UI发送失败: {e}")
    return False

主函数

def main():
try:
log(“短信发送程序启动”)

    # 唤醒设备并保持屏幕常亮
    wake_device()
    keep_screen_on()
    
    # 获取当前时间
    now = datetime.datetime.now()
    log(f"当前时间: {now.strftime('%Y-%m-%d %H:%M:%S')}")
    
    # 创建目标时间对象
    target_time = now.replace(hour=TARGET_HOUR, minute=TARGET_MINUTE, second=0, microsecond=0)
    if target_time < now:
        target_time += datetime.timedelta(days=1)  # 如果目标时间已过,顺延到明天
    
    log(f"目标时间: {target_time.strftime('%Y-%m-%d %H:%M:%S')}")
    
    # 计算时间差(秒)
    time_diff = (target_time - now).total_seconds()
    log(f"时间差: {time_diff}秒")
    
    # 时间控制逻辑
    if time_diff > 0:
        log("等待到达指定发送时间...")
        # 显示倒计时
        show_countdown(time_diff)
    elif time_diff > -300:  # 5分钟内误差补偿
        log("已达发送时间,立即发送")
    else:
        log("错误:指定时间已过期!")
        return
    
    # 首先尝试直接发送
    if send_sms_direct():
        log("✅ 短信发送成功!")
        return
        
    # 直接发送失败则尝试UI方式
    if send_sms_ui():
        log("✅ 短信发送成功!")
        return
        
    # 最后尝试基础方式
    log("尝试最终发送方案...")
    droid.sendSMS(PHONE_NUMBER, MESSAGE)
    log("✅ 短信发送请求已提交")
    
except Exception as e:
    log(f"主流程错误: {e}")
finally:
    try:
        droid.wakeLockRelease()
        log("释放唤醒锁")
    except:
        pass

def show_countdown(duration):
“”“显示倒计时”""
end_time = time.time() + duration
while time.time() < end_time:
remaining = int(end_time - time.time())
mins = remaining // 60
secs = remaining % 60
countdown = f"{mins:02d}:{secs:02d}"

    # 每10秒或最后30秒更新一次
    if remaining % 10 == 0 or remaining < 30:
        log(f"倒计时: {countdown}")
        try:
            droid.makeToast(f"倒计时: {countdown}")
        except:
            pass
    
    # 每秒检查一次
    time.sleep(1)

启动脚本

if name == “main”:
# 启动主函数
main()

问得我都快绝望了,反复卡在切换不到短信界面,或者点击不了短信界面的发送按钮。
分享几段对话在这里插入图片描述(https://i-blog.csdnimg.cn/direct/ae7064a0b8124f30a1ef7d9e15d75b70.jpg)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值