利用python代码写的12306订票代码

下面是关于“利用Python代码写的12306订票代码”的完整攻略:

1. 背景介绍

12306是中国铁路客户服务中心开发的一套网络订票系统,也是全国人民购买火车票的主要途径之一。由于12306订票系统访问量大、用户集中,往往会出现抢票难的情况,因此有些程序员开发了一些自动化的代码来辅助用户进行抢票,提高购票成功率。

2. 编写过程

2.1 获取登录验证码

在进行订票前需要登录12306系统,因此需要获取登录页面的验证码。下面是获取验证码的Python代码示例:

import requests
import re
from PIL import Image

# 获取登录页面html
url = 'https://kyfw.12306.cn/otn/login/init'
html = requests.get(url).text

# 解析登录页面获取验证码图片地址
img_url = re.findall(r'id="loginImg".*?src="(.*?)".*?', html)[0]

# 下载验证码图片并打开
img = Image.open(requests.get(img_url, stream=True).raw)
img.show()

# 获取用户输入的验证码
code = input('请输入验证码:')

2.2 提交登录信息

在获取了验证码之后,需要提交登录表单来进行登录,下面是Python代码示例:

import requests

# 构建登录表单
data = {
    'loginUserDTO.user_name': 'username',
    'userDTO.password': 'password',
    'randCode': code,
    '_json_att': ''
}

# 提交登录表单
url = 'https://kyfw.12306.cn/passport/web/login'
response = requests.post(url, data=data, allow_redirects=False)

# 检查登录是否成功,成功的话会返回302跳转链接
if response.status_code == 302:
    print('登录成功!')
else:
    print('登录失败,请检查用户名和密码以及验证码是否正确。')

2.3 查询车票信息

登录成功后,需要查询车票信息来进行抢票,下面是Python代码示例:

import requests
import json

# 构建查询车次的url
date = '2022-01-02'
from_station = 'CQW'
to_station = 'BJP'
url = f'https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date={date}&leftTicketDTO.from_station={from_station}&leftTicketDTO.to_station={to_station}&purpose_codes=ADULT'

# 查询车次信息
response = requests.get(url)
data = json.loads(response.text)

# 解析车次信息
results = data['data']['result']
for result in results:
    items = result.split('|')
    train_no = items[2]
    start_station = items[6]
    end_station = items[7]
    start_time = items[8]
    end_time = items[9]
    duration = items[10]
    print(f'车次:{train_no},出发站:{start_station},到达站:{end_station},出发时间:{start_time},到达时间:{end_time},历时:{duration}')

2.4 提交抢票请求

查询到符合要求的车次后,就可以提交抢票请求了,下面是Python代码示例:

import requests

# 构建提交抢票信息的url和表单
train_date = '2022-01-02'
train_no = 'G101'
from_station = 'CQW'
to_station = 'BJP'
passenger_name = '张三'
data = {
    'secretStr': '',
    'train_date': train_date,
    'back_train_date': '2022-01-01',
    'tour_flag': 'dc',
    'purpose_codes': 'ADULT',
    'query_from_station_name': '重庆万州',
    'query_to_station_name': '北京',
    'undefined': '',
    'cancel_flag': '2',
    'bed_level_order_num': '000000000000000000000000000000',
    'passengerTicketStr': f'1,0,1,{passenger_name},1,ID Card,15723456789N,,
    'oldPassengerStr': f'{passenger_name},1,ID Card,15723456789N_',
    'tour_flag': 'dc',
    'randCode': ''
}
url = f'https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest'
response = requests.post(url, data=data)

# 检查提交是否成功,成功的话会返回json格式的数据,其中submitStatus为True
if response.json()['status'] == True:
    print('提交抢票请求成功!')
else:
    print('提交失败,请检查信息是否正确。')

3. 注意事项

  1. 对于使用自动化代码抢票的行为,12306官方并不支持,因此使用此代码可能会存在一定风险。
  2. 本文提供的代码仅供学习交流使用,请勿用于非法用途。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:利用python代码写的12306订票代码 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • 举例讲解Linux系统下Python调用系统Shell的方法

    当在Linux系统下需要调用系统的Shell命令时,Python提供了subprocess模块作为实现方式。在下面的攻略中,将在Python 3环境下讲解如何使用subprocess模块调用Shell命令。 1. subprocess模块的基本使用方法 在Python中使用subprocess模块可以轻松地调用系统的Shell命令,并获取执行结果。 impo…

    python 2023年6月2日
    00
  • python基于socketserver实现并发,验证客户端的合法性

    实现一个基于socketserver的并发客户端验证系统可以分为以下步骤: 创建一个继承自socketserver.BaseRequestHandler的处理器类,该类必须定义handle()方法,用来处理客户端请求; 在处理器类中实现验证客户端合法性的逻辑,可以采用各种认证方式进行验证; 创建一个继承自socketserver.ThreadingMixIn…

    python 2023年6月3日
    00
  • odoo 开发入门教程系列-添加修饰

    添加修饰 我们的房地产模块现在从商业角度来看是有意义的。我们创建了特定的视图,添加了几个操作按钮和约束。然而,我们的用户界面仍然有点粗糙。我们希望为列表视图添加一些颜色,并使一些字段和按钮有条件地消失。例如,当房产已出售或取消时,“已售出”和“取消”按钮应消失,因为此时不再允许更改状态。 参考: 文档关联的主题可以查看 Views. 内联视图(Inline …

    python 2023年4月18日
    00
  • python实现五子棋算法

    下面是关于“Python实现五子棋算法”的完整攻略。 1. 五子棋算法简介 五子棋是一种双人对弈的纯策略型棋类游戏,通常在15×15的棋盘上进行。子棋的目标是在棋盘上先形成一条连续的、由相同颜色的棋子组成的直线,即五子连,获得胜利。 2. Python实现五子棋算法 2.1 算法流程 五子棋算法的流程如下: 初始化棋盘,括棋盘大小、棋子颜色等。 玩家落子,即…

    python 2023年5月13日
    00
  • 使用自带的IDLE进行程序调试

    1.打开IDLE,在主菜单选择debug—debugger菜单项,将打开debug control对话框 2.在Python-shell窗口选择file-open菜单项,打开要调试的文件 3.添加断点,鼠标右击选择set-breakpoint菜单项,添加断点的行将以黄色底纹标记,删除断点,选择clear-breakpoint菜单项 4.按快捷键F5执行程…

    python 2023年4月20日
    00
  • 计算一个二维NumPy数组中所有列的总和

    计算一个二维NumPy数组中所有列的总和的完整攻略如下: 导入NumPy模块:在使用NumPy计算数组的列总和之前,需要先导入NumPy模块。可以使用以下语句导入NumPy模块: import numpy as np 创建二维NumPy数组:接下来需要创建一个二维NumPy数组。可以使用以下语句创建一个二维数组: arr = np.array([[1, 2,…

    python-answer 2023年3月25日
    00
  • 在IPython中执行Python程序文件的示例

    在IPython中执行Python程序文件的步骤: 在IPython命令行中输入 %run 文件路径 运行命令,可以执行指定的Python程序文件。 如果你的程序文件包含函数或者全局变量,在运行程序文件之后,这些函数和变量也会被载入到IPython的命名空间中,可以直接在命令行中调用。 如果你修改了程序文件并保存后,可以在IPython命令行中使用 %run…

    python 2023年6月5日
    00
  • 自己编程中遇到的Python错误和解决方法汇总整理

    当我们在Python编程过程中,可能会遇到各种各样的错误,例如语法错误、逻辑错误、模块导入错误等。这些错误可能会导致程序无法正运行,因此我们需要及时解决这些错误。以下是自己编程中遇到的Python错误和解决方法的汇总整理: 1. TypeError 当我们在Python编程过程中遇到以下的报错: TypeError: unsupported operand …

    python 2023年5月13日
    00
合作推广
合作推广
分享本页
返回顶部