当前位置:   article > 正文

手把手教你用python一键抢12306火车票(附代码)_python抢票

python抢票

哈喽,哈喽~,一年一度的抢火车票大战正式拉开序幕…

然饿大多数人碰到的是这种情况:当你满心期待摩拳擦掌准备抢票的时候,你会发现一票难求!想回趟家真难!

那么作为程序猿的你,当然要用程序猿的方式来抢票!下面分享用python来抢票!

对于没有Python基础的人看这一篇:最新12306抢票软件已发布,在也不用自己运行脚本了-CSDN博客

网站提供各种免费资源!资源吧 -

在这里插入图片描述

城市cookie可根据具体需求自行添加!不懂的点这里!

  1. 导入所需模块:
  1. import re
  2. from splinter.browser import Browser
  3. from time import sleep
  4. import sys
  5. import httplib2
  6. from urllib import parse
  7. import smtplib
  8. from email.mime.text import MIMEText
  9. import time

此部分导入了代码所需的各种模块,用于实现不同的功能,包括正则表达式、网页浏览、时间操作、系统相关操作、HTTP连接、URL解析、发送电子邮件和短信等功能。

  1. BrushTicket 类初始化:
  1. class BrushTicket(object):
  2. def __init__(self, passengers, from_time, from_station, to_station, number, seat_type, receiver_mobile, receiver_email):
  3. # 初始化实例属性
  4. # ...

这部分定义了 BrushTicket 类并初始化了基于提供的参数的实例属性。这些属性包括乘客详细信息、车站信息、出发时间、座位类型、通知联系人和URL等。

  1. 登录功能:
  1. def do_login(self):
  2. self.driver.visit(self.login_url)
  3. sleep(1)
  4. print('请扫描二维码登录或使用您的账号登录...')
  5. while True:
  6. if self.driver.url != self.init_my_url:
  7. sleep(1)
  8. else:
  9. break

do_login 方法负责登录网站。它打开登录的URL,等待用户手动登录(可以通过扫描二维码或使用账号登录),并等待登录成功。

  1. 车票预订功能:
  1. def start_brush(self):
  2. self.driver.driver.maximize_window()
  3. self.do_login()
  4. self.driver.visit(self.ticket_url)
  5. try:
  6. # ...
  7. except Exception as error_info:
  8. print(error_info)

start_brush 方法实现了车票预订功能。它最大化浏览器窗口,执行登录操作,然后导航到车票预订页面。它不断查询是否有可用车票,选择所需的座位类型,并尝试为指定的乘客预订车票。它还处理异常情况,并在成功预订时提供通知。

  1. 短信通知:
  1. def send_sms(self, mobile, sms_info):
  2. # ...

send_sms 方法负责发送短信通知。它使用"互亿无线"服务发送测试短信。它接收接收者的手机号码和短信内容作为参数,并返回从服务端收到的响应。

大家都有所体会12306那种神级验证码,即使是聪明如你也不定每次都能把验证码找对找全。然而经过训练后的模型却是可以的,不得不感叹科技强大。当然该程序中并没有涉及到这一识别验证码的核心技术,它只是将这一工作丢给第三方若快平台去做,然后自身利用结果即可。那么若快是如何识别这种神级验证码呢?通过机器学习 训练所需要的模型?笔者在这方面所了解的较少,不能给过多解释。但是这确实是个值得研究的方向。

  1. 邮件通知:
  1. def send_mail(self, receiver_address, content):
  2. # ...

send_mail 方法处理发送电子邮件通知的功能。它使用SMTP协议连接到电子邮件服务器,使用发件人的凭据登录,并向指定的接收者地址发送电子邮件。它包括主题、正文以及发件人/收件人的详细信息。它接收接收者的电子邮件地址和邮件内容作为参数。

注:给我们推送相关消息,需要用户去提供账户和密码,这是个冒险的尝试,避免不了信息泄露的可能。

  1. 主程序执行:
  1. if __name__ == '__main__':
  2. # 用户输入和初始化
  3. # ...
  4. # 开始预订车票
  5. ticket = BrushTicket(passengers, from_time, from_station, to_station, number, seat_type, receiver_mobile, receiver_email)
  6. ticket.start_brush()

主程序执行部分接收用户输入以获取预订车票所需的各个参数,使用提供的值初始化 BrushTicket 对象,并调用 start_brush 方法开始预订车票的过程。

注意!!!以下是Python部分主要代码

源码资源获取:资源吧 -

  1. def start_brush(self):
  2. """买票功能实现"""
  3. # 浏览器窗口最大化
  4. self.driver.driver.maximize_window()
  5. # 登陆
  6. self.do_login()
  7. # 跳转到抢票页面
  8. self.driver.visit(self.ticket_url)
  9. try:
  10. print('开始刷票……')
  11. # 加载车票查询信息
  12. self.driver.cookies.add({"_jc_save_fromStation": self.from_station})
  13. self.driver.cookies.add({"_jc_save_toStation": self.to_station})
  14. self.driver.cookies.add({"_jc_save_fromDate": self.from_time})
  15. self.driver.reload()
  16. count = 0
  17. while self.driver.url == self.ticket_url:
  18. try:
  19. self.driver.find_by_text('查询').click()
  20. except Exception as error_info:
  21. print(error_info)
  22. sleep(1)
  23. continue
  24. sleep(0.2)
  25. count += 1
  26. local_date = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
  27. print('第%d次点击查询……[%s]' % (count, local_date))
  28. try:
  29. current_tr = self.driver.find_by_xpath(
  30. '//tr[@datatran="' + self.number + '"]/preceding-sibling::tr[1]')
  31. if current_tr:
  32. if current_tr.find_by_tag('td')[self.seat_type_index].text == '--':
  33. print('无此座位类型出售,已结束当前刷票,请重新开启!')
  34. sys.exit(1)
  35. elif current_tr.find_by_tag('td')[self.seat_type_index].text == '无':
  36. print('无票,继续尝试……')
  37. sleep(1)
  38. else:
  39. # 有票,尝试预订
  40. print('刷到票了(余票数:' + str(
  41. current_tr.find_by_tag('td')[self.seat_type_index].text) + '),开始尝试预订……')
  42. current_tr.find_by_css('td.no-br>a')[0].click()
  43. sleep(1)
  44. key_value = 1
  45. for p in self.passengers:
  46. if '()' in p:
  47. p = p[:-1] + '学生' + p[-1:]
  48. # 选择用户
  49. print('开始选择用户……')
  50. self.driver.find_by_text(p).last.click()
  51. # 选择座位类型
  52. print('开始选择席别……')
  53. if self.seat_type_value != 0:
  54. self.driver.find_by_xpath(
  55. "//select[@id='seatType_" + str(key_value) + "']/option[@value='" + str(
  56. self.seat_type_value) + "']").first.click()
  57. key_value += 1
  58. sleep(0.2)
  59. if p[-1] == ')':
  60. self.driver.find_by_id('dialog_xsertcj_ok').click()
  61. print('正在提交订单……')
  62. self.driver.find_by_id('submitOrder_id').click()
  63. sleep(2)
  64. # 查看放回结果是否正常
  65. submit_false_info = self.driver.find_by_id('orderResultInfo_id')[0].text
  66. if submit_false_info != '':
  67. print(submit_false_info)
  68. self.driver.find_by_id('qr_closeTranforDialog_id').click()
  69. sleep(0.2)
  70. self.driver.find_by_id('preStep_id').click()
  71. sleep(0.3)
  72. continue
  73. print('正在确认订单……')
  74. self.driver.find_by_id('qr_submit_id').click()
  75. print('预订成功,请及时前往支付……')
  76. # 发送通知信息
  77. self.send_mail(self.receiver_email, '恭喜您,抢到票了,请及时前往12306支付订单!')
  78. self.send_sms(self.receiver_mobile, '您的验证码是:1230。请不要把验证码泄露给其他人。')
  79. else:
  80. print('不存在当前车次【%s】,已结束当前刷票,请重新开启!' % self.number)
  81. sys.exit(1)
  82. except Exception as error_info:
  83. print(error_info)
  84. # 跳转到抢票页面
  85. self.driver.visit(self.ticket_url)
  86. except Exception as error_info:
  87. print(error_info)
  88. def send_sms(self, mobile, sms_info):
  89. """发送手机通知短信,用的是-互亿无线-的测试短信"""
  90. host = "106.ihuyi.com"
  91. sms_send_uri = "/webservice/sms.php?method=Submit"
  92. account = "C59782899"
  93. pass_word = "19d4d9c0796532c7328e8b82e2812655"
  94. params = parse.urlencode(
  95. {'account': account, 'password': pass_word, 'content': sms_info, 'mobile': mobile, 'format': 'json'}
  96. )
  97. headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
  98. conn = httplib2.HTTPConnectionWithTimeout(host, port=80, timeout=30)
  99. conn.request("POST", sms_send_uri, params, headers)
  100. response = conn.getresponse()
  101. response_str = response.read()
  102. conn.close()
  103. return response_str
  104. def send_mail(self, receiver_address, content):
  105. """发送邮件通知"""
  106. # 连接邮箱服务器信息
  107. host = 'smtp.163.com'
  108. port = 25
  109. sender = 'gxcuizy@163.com' # 你的发件邮箱号码
  110. pwd = '******' # 不是登陆密码,是客户端授权密码
  111. # 发件信息
  112. receiver = receiver_address
  113. body = '<h2>温馨提醒:</h2><p>' + content + '</p>'
  114. msg = MIMEText(body, 'html', _charset="utf-8")
  115. msg['subject'] = '抢票成功通知!'
  116. msg['from'] = sender
  117. msg['to'] = receiver
  118. s = smtplib.SMTP(host, port)
  119. # 开始登陆邮箱,并发送邮件
  120. s.login(sender, pwd)
  121. s.sendmail(sender, receiver, msg.as_string())

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号