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

使用python实现无需验证码免登录12306抢票功能

python 来源:互联网 作者:佚名 发布时间:2025-01-11 22:07:22 人浏览
摘要

就在刚刚我抢的票:2025年1月8日 上午9.00多 抢到了哈哈哈哈 其实还是有用的我是在 8:59:56运行程序的 上一篇帖子,我们已经了解了如何用python自动登录12306实现自动抢票,现在我们来一个进

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

上一篇帖子,我们已经了解了如何用python自动登录12306实现自动抢票,现在我们来一个进阶的版本,实现cookie免登录,这样可绕过验证码实现自动抢票。同时包括环境如何配置,也在这个帖子里面。

需求:上此的帖子,需要自动登录,并且需要手机验证码,在真实抢票中太过繁琐,所有我自己也在思索,找了帖子和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():

1

2

3

4

5

6

7

8

9

10

11

12

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

<0002> 获得cookie的函数— get_cookies(browser):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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)

运行后就会变成二维码,找到二维码,让手机自动登录。

用手机扫描即可,这个操作是设置了时间time.sleep(15),你也可以在get_cookies(browser)中修改此代码,只有自己扫了登录成功,后续出现的cookie保存成功,才是最新的cookie值。

二、cookie登录函数与自动化 – 可以实现cookie值的匹配–实现自动登录 – 无须手机验证码

1.login_cookie函数代码

代码如下(示例):

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

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

2.selenium_run(driver)函数代码 – 这里是可以到预定,然后抢票成功要10分钟之内自己付款。

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

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.代码主体

先运行get_cookies(browser),注释掉后面的两句代码,二维码登录以后,再注释掉get_cookies(browser),运行后面两个即可。

1

2

3

4

5

6

7

8

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)

2.完整代码

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

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:\game\chromedriver.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, "毫秒")

3.login.json – 解释这个文件

图中字典信息:代表的是地址日期,num代表的是第几躺车,id_card身份证,后4位。这里面有用账户密码登录的信息,虽然这里用不上,但是我们上一个帖子是用这个的,所以我把它写在了一起。

四、总结

1.几个注意:代码中的url最好是用登录成功的页面,而非登录页面。不然会一直显示要登录。

1

2

log_url = 'https://kyfw.12306.cn/otn/resources/login.html'

log_url = 'https://kyfw.12306.cn/otn/leftTicket/init'  ##---用这个

2.改进:今天真正的实战我也挺满意的就是想着再改进一下,看看多线程是否可以直接抢到。明天就要真正抢票啦 – 给大家看看今天的战果。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 基于Python实现的通用小规模搜索引擎

    基于Python实现的通用小规模搜索引擎
    1.1背景 《信息内容安全》网络信息内容获取技术课程项目设计 一个至少能支持10个以上网站的爬虫程序,且支持增量式数据采集;并至少采集
  • 使用python实现无需验证码免登录12306抢票功能

    使用python实现无需验证码免登录12306抢票功能
    就在刚刚我抢的票:2025年1月8日 上午9.00多 抢到了哈哈哈哈 其实还是有用的我是在 8:59:56运行程序的 上一篇帖子,我们已经了解了如何用
  • python字典根据key排序的实现
    在 Python 中,字典是无序的,不支持直接按照键排序。但是可以通过以下方法实现字典按照键排序: 方法一:使用 sorted() 函数和字典的 it
  • 在Ubuntu上部署Flask应用的流程步骤
    一、部署准备 在开始之前,请确保你具备以下条件: 一台运行 Ubuntu(如 Ubuntu 20.04 或 22.04)的服务器,具有 SSH 访问权限。 Python 应用程序
  • 怎么使用celery进行异步处理和定时任务(django)

    怎么使用celery进行异步处理和定时任务(django)
    一、celery的作用 celery 是一个简单、灵活且可靠的分布式系统,用于处理大量消息,同时为操作提供一致的接口。它专注于实时操作,但支持
  • 使用Python绘制蛇年春节祝福艺术图

    使用Python绘制蛇年春节祝福艺术图
    1. 绘图的基本概念 在 Python 中,我们将使用以下方法和模块完成绘制任务: matplotlib.patches 模块: 提供了绘制基本几何图形的功能,例如圆
  • Python如何实现HTTP echo服务器

    Python如何实现HTTP echo服务器
    一个用来做测试的简单的 HTTP echo 服务器。 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 from ht
  • python中_init_.py的作用

    python中_init_.py的作用
    1. __init__.py 是个啥? __init__.py,顾名思义,这个文件名就透露出它是用来初始化的。在Python里,它主要用于标识一个目录是一个包(Package)
  • Python调用JavaScript代码的几种方法
    1. 使用PyExecJS执行JavaScript代码 PyExecJS是一个流行的Python库,它可以用来在Python中运行JavaScript代码。通过这个库,Python代码可以调用JS函数,
  • python中json.dumps和json.dump区别
    1、json.dumps和json.dump的区别 json.dumps()是将 Python 对象序列化为 JSON 格式的字符串。如果你想将 JSON 数据写入文件,可以将json.dumps()生成的字符
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计