火车票抢票代码公开揭秘
火车票抢票代码公开揭秘
闵开慧 发表于1周前
火车票抢票代码公开揭秘
  • 发表于 1周前
  • 阅读 6828
  • 收藏 142
  • 点赞 12
  • 评论 52

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: 火车票抢票代码公开揭秘

火车票抢票代码公开揭秘

市场上很多火车票抢票软件大家应该非常熟悉,但很少有人研究具体是怎么实现的,所以觉得很神秘,其实很简单。下面使用Python模拟抢票程序,给大家揭秘抢票到底是怎么回事。

该代码仅供参考,主要用于大家沟通交流,禁止用于商业用途。

具体代码如下,可以修改成自己的12306用户名账号:

# -*- coding: utf-8 -*-
"""
@author: liuyw
"""
from splinter.browser import Browser
from time import sleep
import traceback
import time, sys

class huoche(object):
	"""docstring for huoche"""
	driver_name=''
	executable_path=''
	#用户名,密码
	username = u"xxx@qq.com"
	passwd = u"xxxx"
	# cookies值得自己去找, 下面两个分别是上海, 太原南
	starts = u"%u4E0A%u6D77%2CSHH"
	ends = u"%u592A%u539F%2CTYV"
	# 时间格式2018-01-19
	dtime = u"2018-01-19"
	# 车次,选择第几趟,0则从上之下依次点击
	order = 0
	###乘客名
	users = [u"xxx",u"xxx"]
	##席位
	xb = u"二等座"
	pz=u"成人票"

	"""网址"""
	ticket_url = "https://kyfw.12306.cn/otn/leftTicket/init"
	login_url = "https://kyfw.12306.cn/otn/login/init"
	initmy_url = "https://kyfw.12306.cn/otn/index/initMy12306"
	buy="https://kyfw.12306.cn/otn/confirmPassenger/initDc"
	
	def __init__(self):
		self.driver_name='chrome'
		self.executable_path='/usr/local/bin/chromedriver'

	def login(self):
		self.driver.visit(self.login_url)
		self.driver.fill("loginUserDTO.user_name", self.username)
		# sleep(1)
		self.driver.fill("userDTO.password", self.passwd)
		print u"等待验证码,自行输入..."
		while True:
			if self.driver.url != self.initmy_url:
				sleep(1)
			else:
				break

	def start(self):
		self.driver=Browser(driver_name=self.driver_name,executable_path=self.executable_path)
		self.driver.driver.set_window_size(1400, 1000)
		self.login()
		# sleep(1)
		self.driver.visit(self.ticket_url)
		try:
			print u"购票页面开始..."
			# sleep(1)
			# 加载查询信息
			self.driver.cookies.add({"_jc_save_fromStation": self.starts})
			self.driver.cookies.add({"_jc_save_toStation": self.ends})
			self.driver.cookies.add({"_jc_save_fromDate": self.dtime})

			self.driver.reload()

			count=0
			if self.order!=0:
				while self.driver.url==self.ticket_url:
					self.driver.find_by_text(u"查询").click()
					count += 1
					print u"循环点击查询... 第 %s 次" % count
					# sleep(1)
					try:
						self.driver.find_by_text(u"预订")[self.order - 1].click()
					except Exception as e:
						print e
						print u"还没开始预订"
						continue
			else:
				while self.driver.url == self.ticket_url:
					self.driver.find_by_text(u"查询").click()
					count += 1
					print u"循环点击查询... 第 %s 次" % count
					# sleep(0.8)
					try:
						for i in self.driver.find_by_text(u"预订"):
							i.click()
							sleep(1)
					except Exception as e:
						print e
						print u"还没开始预订 %s" %count
						continue
			print u"开始预订..."
			# sleep(3)
			# self.driver.reload()
			sleep(1)
			print u'开始选择用户...'
			for user in self.users:
				self.driver.find_by_text(user).last.click()

			print u"提交订单..."
			sleep(1)
			# self.driver.find_by_text(self.pz).click()
			# self.driver.find_by_id('').select(self.pz)
			# # sleep(1)
			# self.driver.find_by_text(self.xb).click()
			# sleep(1)
			self.driver.find_by_id('submitOrder_id').click()
			# print u"开始选座..."
			# self.driver.find_by_id('1D').last.click()
			# self.driver.find_by_id('1F').last.click()

			sleep(1.5)
			print u"确认选座..."
			self.driver.find_by_id('qr_submit_id').click()

		except Exception as e:
			print e

if __name__ == '__main__':
	huoche=huoche()
	huoche.start()

 

共有 人打赏支持
粉丝 325
博文 601
码字总数 267148
评论 (52)
大连馋师
Python 程序员,有前途的说~
闵开慧

引用来自“大连馋师”的评论

Python 程序员,有前途的说~
这个代码只是用python写的,其它语言也可以实现,原理是一样的。
pdwjun
这个根本谈不上抢票,只是购票而已
闵开慧

引用来自“pdwjun”的评论

这个根本谈不上抢票,只是购票而已
你运行一下就知道了,这是可以直接运行的真实程序。
BoXuan
抢票程序的难点应该是图形验证码的分析匹配,你这个应该没有吧,12306的图形验证码好像是根据线路的紧俏程度来区分有无验证码的,繁忙的线路图形验证码我们肉眼有时都难以辨认。
Robinlblb
LZ,哪有splinter,traceback模块?
这程序3.6的少了splinter,traceback运行不了啊
爆炸的榴莲
等待验证码,自行输入... 这也叫抢票,,完全避过了难点啊,,,你这只能是购票
Zoker
看到评论我就呵呵了,楼主加油。
amita
感谢分享。以前用selenium写过,看来splinter写起来更清爽
flydo
现在是选择图片校验验证码,不是手输了。
肖特基在漏电
感谢楼主。

席位那里注释掉了我没发现,一不留神就给我抢了一张36小时的无座。
web实习虫
给你个思路强行pass验证码:
验证码是一张图片,根据图片的坐标来确定范围,宽度高度为一组,比如 第一张第五章就是 20,20,20,140 这样
那么可以随机生成几组验证码坐标,while循环内我测试的通过率很高。
qtfreet00
还好我有验证码识别
cyclamenkde
2.7版的吧
风里的叶子
只是模拟页面事件而已, 都不算真正的抢票....
OSC_pmmGIn
咋用啊
astars
首先你得在LINUX上面运行(self.executable_path='/usr/local/bin/chromedriver')
然后在LINUX要安装chrome浏览器(Browser(driver_name=self.driver_name,executable_path=self.executable_path))
最后运行的时候各种调错吧,因为在你与直接COPY代码后,运行脚本,发现有些包你可以没有
最后的最后:注成功:joy:
简单有效
其实就做个chrome插件, 插件里面发送ajax请求就搞定了,
觉得烦死
网页版的接口好抓 APP的不好抓 有app的就好了
感觉12306app抢票几率大些
卧龙大熊猫
标题党
×
闵开慧
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: