DC's blog DC's blog
首页
  • 计算机基础
  • linux基础
  • mysql
  • git
  • 数据结构与算法
  • axure
  • english
  • docker
  • opp
  • oop
  • 网络并发编程
  • 不基础的py基础
  • 设计模式
  • html
  • css
  • javascript
  • jquery
  • UI
  • 第一次学vue
  • 第二次学vue
  • Django
  • drf
  • drf_re
  • 温故知新
  • flask
  • 前后端不分离

    • BBS
    • 订单系统
    • CRM
  • 前后端部分分离

    • pear-admin-flask
    • pear-admin-django
  • 前后端分离

    • 供应链系统
  • 理论基础
  • py数据分析包
  • 机器学习
  • 深度学习
  • 华中科大的网课
  • cursor
  • deepseek
  • 杂文
  • 罗老师语录
  • 关于我

    • me
  • 分类
  • 归档
GitHub (opens new window)

DC

愿我一生欢喜,不为世俗所及.
首页
  • 计算机基础
  • linux基础
  • mysql
  • git
  • 数据结构与算法
  • axure
  • english
  • docker
  • opp
  • oop
  • 网络并发编程
  • 不基础的py基础
  • 设计模式
  • html
  • css
  • javascript
  • jquery
  • UI
  • 第一次学vue
  • 第二次学vue
  • Django
  • drf
  • drf_re
  • 温故知新
  • flask
  • 前后端不分离

    • BBS
    • 订单系统
    • CRM
  • 前后端部分分离

    • pear-admin-flask
    • pear-admin-django
  • 前后端分离

    • 供应链系统
  • 理论基础
  • py数据分析包
  • 机器学习
  • 深度学习
  • 华中科大的网课
  • cursor
  • deepseek
  • 杂文
  • 罗老师语录
  • 关于我

    • me
  • 分类
  • 归档
GitHub (opens new window)
  • python面向过程

  • python面向对象

  • 网络并发编程

    • 计算机网络储备
    • TCP简单实现
    • TCP粘包问题
    • 文件传输、UDP
    • socketserver模块
    • 进程理论储备
    • 进程开发必用
    • 进程开发必知
    • 生产者消费者模型
    • 线程开发
    • GIL详解
    • 进程池与线程池
    • 协程
    • 网络IO模型
    • 轮询长轮询
    • channels
    • 小项目之手撸ORM
    • 小项目之仿优酷
    • 脚本编写
      • 脚本的编写
  • 不基础的py基础

  • 设计模式

  • python_Need
  • 网络并发编程
DC
2023-04-05
目录

脚本编写

# 脚本的编写

举个简单的例子 背景: 某平台预约茅台程序,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
1
2
3
4
5
6
7
8
9
10
11
12

代码框架如下:

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()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

小项目之仿优酷
默认参数

← 小项目之仿优酷 默认参数→

最近更新
01
deepseek本地部署+知识库
02-17
02
实操-微信小程序
02-14
03
教学-cursor深度探讨
02-13
更多文章>
Theme by Vdoing | Copyright © 2023-2025 DC | One Piece
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式