成功关键还在于选对了工具
中间用了好几个手机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)