跳转至

脚本编写

脚本的编写

举个简单的例子 背景: 某平台预约茅台程序,5000个账号
流程:
     1.循环5000个账号
     2.获取每个手机号
     3.滑动验证
     4.发送短信
     5.登陆
     6.获取实名信息&资格
     7.预约,预约码

注意事项:
1> 若要写脚本,第一步写.
   def run():pass
   if __name__ == "__main__":
       run()
2> 打开文件单独写个函数,返回生成器对象
3> 5000个账号使用 10个多线程, 10个10个的并发执行任务
4> 特别注意,若使用多线程的话,在执行的任务中切记加上 try..except..
   若不加,在线程池中遇到错误,它就直接忽略了!程序也不会报任何错. 
5> 在task函数中依次执行业务的 滑动验证发送短信登陆 
   若某一步失败了,就不往下面走了,但需要记录一条日志!!
6> <若涉及到网络IO>,让它重试几次,都出错了,就返回False

代码框架如下:

from concurrent.futures import ThreadPoolExecutor


def geetest():
    """实现滑动验证"""
    try:
        # ... 写具体的业务代码
        return True, 123  # 成功后返回 True和想要的结果
    except Exception as e:
        return False, str(e)  # 出错了返回 False和错误的信息


def send_sms():
    """发送短信 <若涉及到网络IO>,让它重试几次,都出错了,就返回False"""
    for i in range(5):
        try:
            # 发送短信
            return True, 123
        except Exception as e:
            print(str(e))
    return False, "短信发送异常了"


def login():
    """登陆 若你保证程序没问题,就是因为网络的原因,那就死循环,直到成功"""
    while True:
        try:
            return True, 123
        except Exception as e:
            print(str(e))


def task(mobile, pwd):
    try:
        # 1.滑动验证 2.发送短信 3.登录
        func_list = [geetest, send_sms, login]
        for func in func_list:
            status, data = func()
            if not status:
                # ... 记录错误日志 eg:"mobile+pwd+data_or_error + 滑动验证"
                # 表明该步骤报错了,return不继续往下走,但需要记录错误记录
                return
    except Exception as e:
        print("异常", e)  # 记录下来


def read_file():
    """读取文件"""
    # 假设文件中,每一行是 手机号,密码
    with open('account.txt', mode='r', encoding='utf-8') as f:
        for line in f:
            line = line.strip()
            mobile, pwd = line.split(',')
            # 并不会将循环结果放到列表中返回,而是返回一个生成器
            yield mobile, pwd


def run():
    pool = ThreadPoolExecutor(10)  # 线程池中维护10个线程

    gen = read_file()
    for mobile, pwd in gen:
        pool.submit(task, mobile, pwd)

    pool.shutdown()  # 主线程等待
    print("--5000个任务全部执行完毕--")


if __name__ == '__main__':
    run()