广告位联系
返回顶部
分享到

python无需验证码免登录12306抢票

python 来源:互联网 作者:佚名 发布时间:2025-02-02 18:01:26 人浏览
摘要

就在刚刚我抢的票:2025年1月8日 上午9.00多 抢到了哈哈哈哈 其实还是有用的我是在 8:59:56运行程序的 配置selenium自动化的帖子链接:https://blog.csdn.net/xaing1314/article/details/144869489?spm=1001.2014.30

就在刚刚我抢的票:2025年1月8日 上午9.00多 抢到了哈哈哈哈— 其实还是有用的我是在 8:59:56运行程序的


配置selenium自动化的帖子链接:https://blog.csdn.net/xaing1314/article/details/144869489?spm=1001.2014.3001.5502
需求:上此的帖子,需要自动登录,并且需要手机验证码,在真实抢票中太过繁琐,所有我自己也在思索,找了帖子和B站,终于实现了用cookie技术自动免登录12306。在今天上午9.00 (2025-01-07)抢票(2025-01-21)成功。
如何使用:1.比如9.00正式抢票,可以在8.53左右二维码扫描登录,当然是要配合下方程序,这样9.00可以正式抢票无需登录,cookie也不会失效。2.直接在8.59.58左右运行此程序,即可。
今日实战:今天运行其实是抢到了,但是他一直在等待,也就是页面一直停在哪里,其实那个时候你可以用手点击操作,因为我们是进来了,不需要去管程序的对错。也就是说,程序帮你操作到哪一步,如果卡住了,直接上手。这也让我有想做一个多线程的想法,将多线程加入这个程序中。


提示:以下是本篇文章正文内容,下面案例可供参考

一、cookie免登录
1.cookie的讲解: Cookie也被称为小型文本文件,是由服务器发送到用户浏览器并保存在用户计算机或移动设备上的一种数据形式。以下是对Cookie的详细解释:
定义与工作原理定义:Cookie是网站在用户浏览器中创建和存储的小型文本文件,用于辨别用户身份和存储用户相关信息。工作原理:当用户访问某个网站时,服务器会在用户的浏览器中创建一个Cookie,并将其存储在用户的计算机或移动设备上。当用户再次访问该网站时,浏览器会将Cookie发送回服务器,服务器通过读取Cookie中的信息来识别用户身份或获取用户的个性化设置。
2.获取cookie的代码如下: 程序运行后会打开登录界面,然后使用的二维码登录。这样程序可以得到当前的cookie值字段,在cookie失效前无须再进行登录。
<0001>初始化浏览器的函数— browser_initial():
def browser_initial():
    """"
    进行浏览器初始化
    """
    # os.chdir('E:\pythonwork')

    # 1.将加载项配置到启动浏览器中 打开/创建浏览器对象
    browser = webdriver.Chrome(service=Service(path))
    # 2.网址 https://kyfw.12306.cn/otn/resources/login.html -- 登录界面
    # https://kyfw.12306.cn/otn/leftTicket/init 选票界面可以 判断是否登录
    log_url = 'https://kyfw.12306.cn/otn/resources/login.html'
    return log_url, browser

1
2
3
4
5
6
7
8
9
10
11
12
13
<0002> 获得cookie的函数— get_cookies(browser):
def get_cookies(browser):
    """
    获取cookies保存至本地
    """
    browser.get(log_url)
    time.sleep(15)  # 进行扫码
    # selenium_login(browser)
    # print("登录成功")
    dictCookies = browser.get_cookies()  # 获取list的cookies
    string_Cookies = json.dumps(dictCookies)  # 转换成字符串保存
    with open('string_cookies.json', 'w') as f:
        f.write(string_Cookies)
    print('cookies保存成功!')

if __name__ == "__main__":
    log_url, browser = browser_initial()
    browser.get(log_url)
    # 1.二维码登录 保存 -- cookie -- 用完关掉
    get_cookies(browser)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
运行后就会变成这样,找到二维码,让手机自动登录。


你也可以在get_cookies(browser)中修改此代码,只有自己扫了登录成功,后续出现的cookie保存成功,才是最新的cookie值。

二、cookie登录函数与自动化 – 可以实现cookie值的匹配–实现自动登录 – 无须手机验证码
1.login_cookie函数代码
代码如下(示例):

def login_cookie(log_url, browser):
    """
    从本地读取cookies并刷新页面,成为已登录状态
    """
    # browser.get(log_url)
    with open('string_cookies.json', 'r', encoding='utf8') as f:
        listCookies = json.loads(f.read())

    # 往browser里添加cookies
    for cookie in listCookies:
        browser.add_cookie(cookie)
   
    time.sleep(1)
    # 如果是已登录的界面,免登录应该打开这个界面 https://kyfw.12306.cn/otn/view/index.html
    # https://www.12306.cn/index/ --12306官网首页
    browser.get(log_url)
    return browser

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2.selenium_run(driver)函数代码 – 这里是可以到预定,然后抢票成功要10分钟之内自己付款。
def selenium_run(driver):

    # 11.1 选择出发的城市--点击那个框
    driver.find_element(by="css selector", value="#fromStationText").click()
    # 11.2 选择出发的城市--选择城市
    driver.find_element(by="css selector", value="#fromStationText").send_keys(login["from_city"])
    # 11.3 选择出发的城市--回车确定
    driver.find_element(by="css selector", value="#fromStationText").send_keys(Keys.ENTER)

    # 12.1 选择目的的城市--点击那个框
    driver.find_element(by="css selector", value="#toStationText").click()
    # 12.2 选择目的的城市--选择城市
    driver.find_element(by="css selector", value="#toStationText").send_keys(login['to_city'])
    # 12.3 选择目的的城市--回车确定
    driver.find_element(by="css selector", value="#toStationText").send_keys(Keys.ENTER)

    # 13.1 选择出发的日期--点击那个框
    driver.find_element(by="css selector", value="#train_date").clear()
    # 12.2 选择出发的日期--选择城市
    driver.find_element(by="css selector", value="#train_date").send_keys(login['train_date'])
    # 12.3 选择出发的日期--回车确定
    driver.find_element(by="css selector", value="#train_date").send_keys(Keys.ENTER)
    # # 12.4 点击--显示全部可预订的车次
    # driver.find_element(by="css selector", value="avail_ticket").click()
    # 12.5 点击查询
    driver.implicitly_wait(5)
    driver.find_element(by="css selector", value="#query_ticket").click()
    # num = int(input('请输入您想要的车次:'))
    # 点击预订按钮 -- 选择要预定的是第几躺车 -- 这个代码没有问题
    # driver.find_element(by="css selector", value='#ticket_65000G279007_01_03 > td.no-br').click()

    # //div//tbody[@id="queryLeftTable"]/tr[contains(@id,"ticket")]/@id -- 但是selenium的find_elements不可以用@id找到元素。
    ticket_list = driver.find_elements(by="xpath", value='//div//tbody[@id="queryLeftTable"]/tr[contains(@id,"ticket")]')
    ticket_num = ticket_list[login['num']].get_attribute("id")
    ticket_pre = ticket_num + ' > td.no-br'
    # 12.6 点击想要车次的预定按钮
    driver.find_element(by="css selector", value=f"#{ticket_pre}").click()

    # 13.1 勾选想要的乘车人
    driver.find_element(by="css selector", value='#normalPassenger_0').click()

    # 13.2 提交订单
    driver.find_element(by="css selector", value='#submitOrder_id').click()
    driver.implicitly_wait(5)
    # 13.3 选择靠窗的1F的位置 #erdeng1 > ul:nth-child(4) > li:nth-child(2) 是在浏览器右键copy selector选择出来的
    # # 1F是不可以选中的
    driver.find_element(by="css selector", value='#erdeng1 > ul:nth-child(4) > li:nth-child(2)').click()
    # 13.4 再次确认提交
    time.sleep(1)
    # 如果此处没有响应多点击就好 -- 加上 "try -- except"
    driver.find_element(by="css selector", value='#qr_submit_id').click()
    # driver.find_element(by="css selector", value='#qr_submit_id').click()
    # driver.find_element(by="css selector", value='#qr_submit_id').click()

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
三、完整的代码
1.代码主体 – 先运行get_cookies(browser),注释掉后面的两句代码,二维码登录以后,再注释掉get_cookies(browser),运行后面两个即可。
if __name__ == "__main__":
    log_url, browser = browser_initial()
    browser.get(log_url)
    # 1.二维码登录 保存 -- cookie -- 用完关掉
    get_cookies(browser)
    # 2.自动登录
    driver = login_cookie(log_url, browser)
    selenium_run(driver)

1
2
3
4
5
6
7
8
9
2.完整代码
import time
import json
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.keys import Keys
path = r'D:gamechromedriver.exe'


def browser_initial():
    """"
    进行浏览器初始化
    """
    # os.chdir('E:\pythonwork')

    # 1.将加载项配置到启动浏览器中 打开/创建浏览器对象
    browser = webdriver.Chrome(service=Service(path))
    # 2.网址 https://kyfw.12306.cn/otn/resources/login.html -- 登录界面
    # https://kyfw.12306.cn/otn/leftTicket/init 选票界面可以 判断是否登录
    log_url = 'https://kyfw.12306.cn/otn/leftTicket/init'
    return log_url, browser


def get_cookies(browser):
    """
    获取cookies保存至本地
    """
    browser.get(log_url)
    time.sleep(15)  # 进行扫码
    # selenium_login(browser)
    # print("登录成功")
    dictCookies = browser.get_cookies()  # 获取list的cookies
    string_Cookies = json.dumps(dictCookies)  # 转换成字符串保存
    with open('string_cookies.json', 'w') as f:
        f.write(string_Cookies)
    print('cookies保存成功!')

def login_cookie(log_url, browser):
    """
    从本地读取cookies并刷新页面,成为已登录状态
    """
    # 这个是12306的登录界面 https://kyfw.12306.cn/otn/resources/login.html
    # browser.get(log_url)
    with open('string_cookies.json', 'r', encoding='utf8') as f:
        listCookies = json.loads(f.read())

    # 往browser里添加cookies
    for cookie in listCookies:
        # cookie_dict = {
        #     'domain': cookie.get('domain'),
        #     # "expires": cookie.get('value'),
        #     'httpOnly': cookie.get('httpOnly'),
        #     'name': cookie.get('name'),
        #     'path': cookie.get('path'),
        #     "sameSite": "Lax",
        #     'Secure': cookie.get('Secure'),
        #     'value': cookie.get('value'),
        # }
        browser.add_cookie(cookie)
    # browser.refresh()
    time.sleep(1)
    # 如果是已登录的界面,可以免登录直接进 https://kyfw.12306.cn/otn/view/index.html
    # https://www.12306.cn/index/ --12306官网首页
    browser.get(log_url)
    return browser

def selenium_run(driver):

    # 11.1 选择出发的城市--点击那个框
    driver.find_element(by="css selector", value="#fromStationText").click()
    # 11.2 选择出发的城市--选择城市
    driver.find_element(by="css selector", value="#fromStationText").send_keys(login["from_city"])
    # 11.3 选择出发的城市--回车确定
    driver.find_element(by="css selector", value="#fromStationText").send_keys(Keys.ENTER)

    # 12.1 选择目的的城市--点击那个框
    driver.find_element(by="css selector", value="#toStationText").click()
    # 12.2 选择目的的城市--选择城市
    driver.find_element(by="css selector", value="#toStationText").send_keys(login['to_city'])
    # 12.3 选择目的的城市--回车确定
    driver.find_element(by="css selector", value="#toStationText").send_keys(Keys.ENTER)

    # 13.1 选择出发的日期--点击那个框
    driver.find_element(by="css selector", value="#train_date").clear()
    # 12.2 选择出发的日期--选择城市
    driver.find_element(by="css selector", value="#train_date").send_keys(login['train_date'])
    # 12.3 选择出发的日期--回车确定
    driver.find_element(by="css selector", value="#train_date").send_keys(Keys.ENTER)
    # # 12.4 点击--显示全部可预订的车次
    # driver.find_element(by="css selector", value="avail_ticket").click()
    # 12.5 点击查询
    driver.implicitly_wait(5)
    driver.find_element(by="css selector", value="#query_ticket").click()
    # num = int(input('请输入您想要的车次:'))
    # 点击预订按钮 -- 选择要预定的是第几躺车 -- 这个代码没有问题
    # driver.find_element(by="css selector", value='#ticket_65000G279007_01_03 > td.no-br').click()

    # //div//tbody[@id="queryLeftTable"]/tr[contains(@id,"ticket")]/@id -- 但是selenium的find_elements不可以用@id找到元素。
    ticket_list = driver.find_elements(by="xpath", value='//div//tbody[@id="queryLeftTable"]/tr[contains(@id,"ticket")]')
    ticket_num = ticket_list[login['num']].get_attribute("id")
    ticket_pre = ticket_num + ' > td.no-br'
    # 12.6 点击想要车次的预定按钮
    driver.find_element(by="css selector", value=f"#{ticket_pre}").click()

    # 13.1 勾选想要的乘车人
    driver.find_element(by="css selector", value='#normalPassenger_0').click()

    # 13.2 提交订单
    driver.find_element(by="css selector", value='#submitOrder_id').click()
    driver.implicitly_wait(5)
    # 13.3 选择靠窗的1F的位置 #erdeng1 > ul:nth-child(4) > li:nth-child(2) 是在浏览器右键copy selector选择出来的
    # # 1F是不可以选中的
    driver.find_element(by="css selector", value='#erdeng1 > ul:nth-child(4) > li:nth-child(2)').click()
    # 13.4 再次确认提交
    time.sleep(1)
    # 如果此处没有响应多点击就好 -- 加上 "try -- except"
    # driver.find_element(by="css selector", value='#qr_submit_id').click()
    # driver.find_element(by="css selector", value='#qr_submit_id').click()
    # driver.find_element(by="css selector", value='#qr_submit_id').click()

f = open('login.json', encoding='utf-8').read()
login = json.loads(f)

if __name__ == "__main__":
    log_url, browser = browser_initial()
    browser.get(log_url)
    # 1.二维码登录 保存 -- cookie -- 用完关掉
    # get_cookies(browser)
    # 计算程序运行时间
    # start = time.perf_counter()
    # 2.自动登录

    driver = login_cookie(log_url, browser)
    # # 如果没有登录那就自动登录 -- 然后获得cookie自动保存
    # # if browser.find_element(by="css selector", value="#login_user").text == "登录":
    # # 3.自动买票
    selenium_run(driver)
    # end = time.perf_counter()
    # runTime = end - start
    # runTime_ms = runTime * 1000
    # # 输出运行时间
    # print("运行时间:", runTime, "秒")
    # print("运行时间:", runTime_ms, "毫秒")

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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
3.login.json – 解释这个文件


图中字典信息:代表的是地址日期,num代表的是第几躺车,id_card身份证,后4位。这里面有用账户密码登录的信息,虽然这里用不上,但是我们上一个帖子是用这个的,所以我把它写在了一起。
四、总结
1.几个注意:代码中的url最好是用登录成功的页面,而非登录页面。不然会一直显示要登录。

log_url = 'https://kyfw.12306.cn/otn/resources/login.html'
log_url = 'https://kyfw.12306.cn/otn/leftTicket/init'  ##---用这个
1
2
3
2.改进:今天真正的实战我也挺满意的就是想着再改进一下,看看多线程是否可以直接抢到。明天就要真正抢票啦 – 给大家看看今天的战果。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • Matplotlab显示OpenCV读取到的图像
    一. 确认图像的数组类型 在使用 OpenCV 的cv2.imread()函数读取图像时,第二个参数(标志)决定了图像的读取方式。具体来说,0、1和-1分别对
  • python无需验证码免登录12306抢票
    就在刚刚我抢的票:2025年1月8日 上午9.00多 抢到了哈哈哈哈 其实还是有用的我是在 8:59:56运行程序的 配置selenium自动化的帖子链接:https
  • python怎么计算超出int范围内的书
    在Python中,整型(int)可以根据需要动态扩展其大小,不会因为数值超出某个固定范围而造成溢出。尽管如此,处理非常大的整数或在某些
  • 使用Python实现操作mongodb的介绍

    使用Python实现操作mongodb的介绍
    一、示例 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
  • 使用Python合并Excel单元格指定行列或单元格范围
    合并 Excel 单元格是 Excel 数据处理和表格设计中的一项常用操作。例如,在制作表格标题时,经常会将多个单元格合并,使标题能够跨列显示
  • Python中数据清洗与处理的常用方法
    在数据处理与分析过程中,缺失值、重复值、异常值等问题是常见的挑战。 本文总结了多种数据清洗与处理方法: 缺失值处理包括删除缺失
  • PyCharm接入DeepSeek实现AI编程的操作流程

    PyCharm接入DeepSeek实现AI编程的操作流程
    DeepSeek 是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的 AI 模型。DeepSeek-V3 是 DeepSeek 公司推出的最新一代 AI 模型。其
  • 使用Python实现高效的端口扫描器
    1. 端口扫描的基本原理 端口扫描的基本原理是向目标主机的指定端口发送数据包,并监听是否有来自该端口的响应。根据响应的不同,可以
  • Python判断for循环最后一次的6种方法
    1.使用enumerate()和len()来判断for循环最后一次迭代 一种常见的方法是使用enumerate()函数来获取迭代的索引和值,并通过比较索引和可迭代对象
  • Python中使用defaultdict和Counter的方法

    Python中使用defaultdict和Counter的方法
    在Python编程中,字典(dict)是最常用的数据结构之一,广泛应用于数据存储、检索和操作。然而,随着数据规模的增大和复杂性的提升,传
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计