基于Python3与PyAutoGUI的社交媒体账号自动化集成求助
解决方案:集成API数据获取与PyAutoGUI自动化脚本
先帮你梳理下原代码的核心问题:
- 原API获取脚本的
main函数用递归循环反复调用自身,不仅容易触发栈溢出,而且没有返回获取到的手机号和OTP,只是打印出来,导致模拟脚本拿不到数据 - 模拟脚本里调用了不存在的
fetchapidata.callingfun(),而且y、r_y这些变量未定义,根本没法填入表单 - 原API逻辑里的状态判断有冗余,重复调用
main会导致流程混乱
下面是重构后的完整集成方案:
1. 重构API数据获取脚本(命名为fetch_sms_data.py)
把递归改成while循环,让函数明确返回手机号和OTP,同时优化API调用的等待逻辑:
import requests import json import time API_KEY = "my_api_key" def get_phone_and_otp(): # 第一步:获取tzid result = requests.get(f'http://api.sms-reg.com/getNum.php?country=ru&service=gmail&apikey={API_KEY}') x = json.loads(result.text) tzid = str(x["tzid"]) print(f"获取到tzid: {tzid}") # 第二步:等待手机号准备完成 while True: result2 = requests.get(f"http://api.sms-reg.com/getState.php?tzid={tzid}&apikey={API_KEY}") y = json.loads(result2.text) print(f"当前状态: {y['response']}") if y["response"] == "TZ_NUM_PREPARE": phone_number = y["number"] print(f"获取到手机号: {phone_number}") break time.sleep(3) # 避免频繁调用API,设置合理间隔 # 第三步:标记手机号已准备好 result3 = requests.get(f"http://api.sms-reg.com/setReady.php?tzid={tzid}&apikey={API_KEY}") zx = json.loads(result3.text) print(f"标记准备状态结果: {zx['response']}") if zx["response"] != "1": raise Exception("标记手机号准备失败,请检查API密钥或服务状态") # 第四步:等待获取OTP while True: result4 = requests.get(f"http://api.sms-reg.com/getState.php?tzid={tzid}&apikey={API_KEY}") r_y = json.loads(result4.text) print(f"OTP获取状态: {r_y['response']}") if r_y["response"] == "TZ_NUM_ANSWER": otp_code = r_y["answer"] print(f"获取到OTP: {otp_code}") return phone_number, otp_code time.sleep(5) # OTP生成需要时间,间隔长一点 if __name__ == "__main__": # 测试函数 get_phone_and_otp()
2. 修改PyAutoGUI自动化脚本
现在可以直接调用上面的函数获取手机号和OTP,替换原脚本中未定义的变量和错误调用:
import pyautogui import time import pandas as pd from fetch_sms_data import get_phone_and_otp # 导入重构后的函数 df = pd.read_csv("input.csv") df0 = df ["name1"] df1 = df ["job"] df2 = df ["name2"] df3 = df ["name3"] df4 = df ["name4"] for i in range(1): # 原有的登出/创建账号流程保留 pyautogui.click(1308, 170) # 点击小账号图标 time.sleep(5) pyautogui.click(1159, 527) # 点击登出按钮 time.sleep(4) pyautogui.click(1270, 169) # 点击登录按钮 time.sleep(4.5) pyautogui.click(620, 468) # 点击移除账号 time.sleep(2.5) pyautogui.click(888, 396) # 点击移除图标 time.sleep(3.5) pyautogui.click(802, 528) # 确认移除 time.sleep(5) pyautogui.click(580, 601) # 创建账号 time.sleep(6) pyautogui.click(594, 654) # 为自己创建 time.sleep(4) # 填写个人信息 pyautogui.click(450, 345) # 名字输入框 pyautogui.write(df0[i], interval=0.5) time.sleep(2) pyautogui.click(641, 344) # 姓氏输入框 pyautogui.write(df1[i], interval=0.5) time.sleep(1.5) pyautogui.click(453, 407) # 用户ID输入框 pyautogui.write(df2[i], interval=0.4) time.sleep(1.8) pyautogui.click(423, 515) # 密码输入框 pyautogui.write(df3[i], interval=0.4) time.sleep(1.4) pyautogui.click(592, 516) # 确认密码输入框 pyautogui.write(df4[i], interval=0.6) time.sleep(0.5) pyautogui.click(706, 637) # 点击完成按钮 time.sleep(7) # 获取手机号并填写 pyautogui.click(516, 452) # 点击手机号输入框 time.sleep(3) phone_number, otp_code = get_phone_and_otp() # 调用API获取数据 pyautogui.write(phone_number, interval=0.2) # 填入手机号 time.sleep(1) pyautogui.click(705, 532) # 发送验证码 time.sleep(5) # 填写OTP pyautogui.click(449, 480) # 点击OTP输入框 time.sleep(1.5) pyautogui.write(otp_code, interval=0.2) # 填入OTP time.sleep(1) pyautogui.click(710, 570) # 点击验证按钮 time.sleep(6) # 后续生日、性别等流程保留 pyautogui.click(414, 580) # 点击月份选择 time.sleep(1) pyautogui.click(415, 359) # 选择月份 time.sleep(0.5) pyautogui.click(533, 585) # 点击日期输入框 pyautogui.write("1") # 填写日期 time.sleep(0.5) pyautogui.click(664, 585) # 点击年份输入框 time.sleep(0.3) pyautogui.write("2000") # 填写年份 time.sleep(0.2) pyautogui.click(423, 669) # 点击性别选择 time.sleep(0.2) pyautogui.click(401, 735) # 选择性别 time.sleep(1.5) pyautogui.scroll(-100) time.sleep(0.5) pyautogui.click(697, 638) # 点击下一步 time.sleep(8) pyautogui.click(621, 618) # 点击跳过 pyautogui.moveTo(189, 589) time.sleep(0.1) pyautogui.scroll(-100) time.sleep(0.4) pyautogui.click(699, 642) # 点击同意按钮 time.sleep(10)
关键优化点说明
- 把递归改成while循环:避免递归深度过大导致的
RecursionError,同时流程更可控 - 函数返回明确的数据:
get_phone_and_otp()直接返回手机号和OTP,让自动化脚本可以直接使用 - 增加API调用间隔:避免频繁请求被API限流,同时减少不必要的网络请求
- 错误处理:增加了标记准备失败的异常抛出,方便排查问题
- 修复模拟脚本的变量错误:替换了原脚本中未定义的
y、r_y,用实际获取到的数据填充
内容的提问来源于stack exchange,提问作者Sanjeet Kunwar
相关产品推荐
相关产品推荐

