朋友圈疯传加速包抢票,还不如Python自动抢票来的靠谱!

写在前面

一年一度的春运已经悄然来临,不知道身在异乡的你是否抢到一张回家的火车票

又有多少人因为一张小小的火车票而不能回家过春节。漂泊在外的游子在这个时候的乡愁就是一张小小的火车票


近日在朋友圈被一波抢票加速包疯狂刷屏了

小编在群里看得干着急,现在市面上各种平台的抢票软件都是收费的的,而且不能保证百分百能抢到票,很多小伙伴甚至被一些钓鱼网站骗钱了。这不是得不偿失了嘛。

作为一个技术控,我喜欢通过自己的技术去解决问题,下面小编将制作一个12306抢票软件,实现自动抢票,一起期待吧~

代码编写

1、程序效果图

没错,抢到票之后还是需要手动付款的,这个对大家来说还是轻轻松松的吧~

废话不多说,下面就直接开始技术主要部分阐述。

2、主要代码及调试

理论部分:首先我们需要代码实现一个浏览器功能,那么模块基本上可以确定urllib.parse、urllib.request,这两个包都是和网址有关的模块,那么咱们去登录一个网址,特别是有验证码这些的网址,我们登录进去是不是就行了?答案是对的,但是我们用代码实现的话,这个网址可能每次都有可能被代码去请求,那么服务器怎么知道我们是一个人,而不是多个浏览器不同的用户呢?

此时cookie就非常重要了,在代码中设置好cookie,那么对方服务器自然就知道我们是一个人,比较服务器都是这么区分的。python3中 cookie这个功能是封装在http.cookiejar这个模块之内。好了,代码如下:

# coding=utf-8# author: Jason# time:2018/1/16 20:00:00#version:1.0importurllib.requestasulimporturllib.parseasuzimporthttp.cookiejarascookielibfromjsonimportloadsc=cookielib.LWPCookieJar()#先把cookie对象存储为cookiejar的对象cookie = ul.HTTPCookieProcessor(c)#把cookiejar对象转换为一个handleopener = ul.build_opener(cookie)#建立一个模拟浏览器,需要handle作为参数ul.install_opener(opener)#安装一个全局模拟浏览器,代表无论怎么访问都是一个浏览器操作而不是分开获取验证码等msg

接下来就是进入网络分析部分

首先可以使用google浏览器或者搜狗浏览器(本人用的搜狗),打开F12,也就是开发者模式,登录12306的登录地址https://kyfw.12306.cn/otn/login/init

两个红圈中第二个是验证码来源,此时我们只需要记录这个网页(点进去)的详细情况,写入代码当中,python3中urllib.request这个模块打开既可。

这时候多了一个很奇妙的东西,此时,这里就是验证码验证的网址,那么我们是不是应该记录下来呢?很简单,到Headers里面就全都看得到了

上面那个是服务器验证网址,下面就是我们回复给他的东西,那么那个163,121其实就是我乱点的验证码坐标了。至于为啥是坐标,因为它是用鼠标去点图片,那么他只可能是记录坐标,除非他自己搞了一套人工智能验证图片,但基于他几年前就这么玩了,人工智能根本没有怎么开始,他自然只能是最原始的技术而已。

那么这代表了他是先验证验证码,那么验证密码的在哪?自然是需要验证码这关能过,那我们输一个正确的验证码,再写个错密码,登录。

此时可以看到,和验证码一样的方法,我们的回复与验证都在这几个圈了,还记得上面验证码失败的时候回复给我们的code是不是有个数字?这个也很重要,那么可以看看我们的验证成功的验证码返回给我们的是什么东西。

这次我们看到了,验证码成功,显示是4,好,那我们不就可以进行条件判断了么?

那么如何打开一个网址然后把我们点的东西一起发过去呢?上代码

headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'}#先写个头,表示我这是浏览器用户登录而不是代码登录,如果不写,代码默认用的签名之类的是编程语言的标识,这样对方服务器很容易就发现你是个脚本了defget_code():#获取验证码的步骤req = ul.Request('https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&0.6758635422370105') req.headers = headers code_file = opener.open(req).read()#此时为浏览器的open而不再是ul.urlopen,下同withopen(r'C:\Users\Administrator\Desktop\12306自动抢票\code.png','wb')asf: f.write(code_file)

把验证码直接下载后方电脑上,后面要坐标只需要打开这个图既可输入,坐标的输入方式我用字典表示给大家看{1:(45,45)}{2:(120,45)}{3:(180,45)}{4:(255,45)}{5:(45,120)}{6:(120,120)}{7:(180,120)}{8:(255,120)}

根据这个验证码的排序,我相信读者应该知道顺序怎么来的吧,比较坐标就能懂了。

咱们继续往下写

def main_(): get_code() code =input('输入验证码:') req = ul.Request('https://kyfw.12306.cn/passport/captcha/captcha-check') req.headers = headers data = {'answer':code,'login_site':'E','rand':'sjrand'} data = uz.urlencode(data).encode()#把字典转换为URL querystring,此时是str,要把它变为byts。 html = opener.open(req,data= data).read().decode()#读取出来是byts格式,转换为‘utf-8(默认)print(html) result = loads(html)ifresult['result_code']=='4':print('验证码通过')rep= ul.Request('https://kyfw.12306.cn/passport/web/login')rep.headers = headers data = {'username':'这里就是你用户名','password':'这里就是你的密码','appid':'otn'} data = uz.urlencode(data).encode() #看到了吗,这就是你给服务器回复的东西 html1 = opener.open(rep,data = data ).read().decode() result1 = loads(html1)ifresult1['result_code'] ==0:print('账户密码验证通过')else:print(result1['result_message'])else:print('验证码校验失败,重来')if__name__ =='__main__': main_()

此时,咱们就过了验证码密码这一关,后面是不是又要查票?那么同样的方法,我们就可以以此类推到最后一步,这里就不一一贴代码了

ps:查代码这几步的信息可是很重要喔,我们要把它记录好,并且这里面的信息包含了各种作为信息以及他们的顺序,多测试几次基本都能搞出来,这里就是提醒一点

找找规律,然后用split的方法完全就可以切割出来,然后一个循环,就可以得到第几个元素是我们要的,那么后面就可以标志判断返回值如果是无,就没票可以继续查询,直到有票就可以下一步;

那么有票的话,后面一样也是以此类推的方式,代码我就不重现了,很简单,我就把后面出现需要请求的网址都发出来供大家观摩

查询车票信息

url ='https://kyfw.12306.cn/otn/leftTicket/queryZ?leftTicketDTO.train_date=%s&leftTicketDTO.from_station=%s&leftTicketDTO.to_station=%s&purpose_codes=ADULT'%(train_data,from_station,to_station)

req = ul.Request('https://kyfw.12306.cn/otn/leftTicket/submitOrderRequest')#确定订单信息

req = ul.Request("https://kyfw.12306.cn/otn/confirmPassenger/initDc")#验证订单

req = ul.Request('https://kyfw.12306.cn/otn/confirmPassenger/getPassengerDTOs')#准备跨到下单中的过度

req = ul.Request('https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo')#检查订单信息

req = ul.Request('https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount')#信息提交给服务器,准备进入下单步骤

req = ul.Request('https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue')#正式进入下单步骤

req = ul.Request('https://kyfw.12306.cn/otn/confirmPassenger/queryOrderWaitTime?random=%s&tourFlag=dc&_json_att=&REPEAT_SUBMIT_TOKEN=%s'%(numb,time.time()))#下单确认中,此时这个网址一般是进行两次访问,不知为何,我还是做了两次访问,numb是前面查询车票点击预定回复我们的信息中的一条,有点难找喔,我曾经找了三天。。。当然是因为自己不仔细而已

zreq = ul.Request("https://kyfw.12306.cn/otn/confirmPassenger/resultOrderForDcQueue")#最后的结果回执,如果一切都顺利,那么票就已经订了。我一般是打印他返回的内容

'''

zreq = ul.Request("https://kyfw.12306.cn/otn/confirmPassenger/resultOrderForDcQueue")

zreq.headers = headers

data ={"REPEAT_SUBMIT_TOKEN":"%s"%numb,

"_json_att": "",

"orderSequence_no":orderId

}

data = uz.urlencode(data).encode()

html = opener.open(zreq,data=data).read().decode()

result = loads(html)

print('代码全部过完,回去登录下是否搞定')

print(result)

print(result['data']['submitStatus'])

if result['data']['submitStatus'] == True:

print('购票成功')

return True

else:

print('购票失败,重试其他列车')

continue

'''

最终的回执代码详细 信息,读者可以自己尝试多次,得到自己的回复代码确认是否购票成功,因为result['data']['submitStatus']==True只不过是确认订单状态而已,这个被我改动过,你可以多次尝试

最后的最后,火车票预订成功只有30分钟支付时间,所以我为了防止订好票但是我人不在,特意写了qq邮件通知

qq邮件通知:

defemail():#这是我订票后给自己发邮件的函数importsmtplibfromemail.mime.textimportMIMETextimporttime text ='已经为%s抢到票,速度登录12306付款,用户名:%s,密码:%s'%(NAME,username,password) msg = MIMEText(text,'plain','utf-8') msg_From ='2059****16@qq.com'msg_To ='5043****75@qq.com'#是的,我有两个qq,一个发一个收smtpSever ='smtp.qq.com'# qq邮箱的smtp Sever地址smtpPort ='465'# 开放的端口sqm ='q********eghe'# 在登录smtp时需要login中的密码应当使用授权码而非账户密码msg['from'] = msg_From msg['to'] = msg_To msg['subject'] ='Python自动邮件-%s'% time.ctime() smtp = smtplib smtp = smtplib.SMTP_SSL()'''

smtplib的connect(连接到邮件服务器)、login(登陆验证)、sendmail(发送邮件)

'''smtp.connect(smtpSever, smtpPort) smtp.login(msg_From, sqm) smtp.sendmail(msg_From, msg_To, str(msg))# s = smtplib.SMTP("localhost")# s.send_message(msg)smtp.quit() print('邮件已发送~你可以安心去玩了')defemailforcode():#此函数是防止查询有票但12306账号掉线人不在无法订票的提醒importsmtplibfromemail.mime.textimportMIMETextimporttime text ='%s账号下线,速度登录验证12306'% NAME msg = MIMEText(text,'plain','utf-8') msg_From ='205****516@qq.com'msg_To ='50****75@qq.com'smtpSever ='smtp.qq.com'# qq邮箱的smtp Sever地址smtpPort ='465'# 开放的端口sqm ='qowa*******ghe'# 在登录smtp时需要login中的密码应当使用授权码而非账户密码msg['from'] = msg_From msg['to'] = msg_To msg['subject'] ='Python自动邮件-%s'% time.ctime() smtp = smtplib smtp = smtplib.SMTP_SSL()'''

smtplib的connect(连接到邮件服务器)、login(登陆验证)、sendmail(发送邮件)

'''smtp.connect(smtpSever, smtpPort) smtp.login(msg_From, sqm) smtp.sendmail(msg_From, msg_To, str(msg))# s = smtplib.SMTP("localhost")# s.send_message(msg)smtp.quit() print('邮件已发送~')

到这里抢票程序就写的差不多了,后面调试调试就行了。

最后再给你们看看结果吧,毕竟写出来不容易。

记得手动付款哦~

记得手动付款哦~记得手动付款哦~

付款是最重要的,其他的都不重要,你说呢?

写在最后

不知道你看了小编的文章有没有自己动手的冲动哦~

需要源码的小伙伴看下面,即可获得自动抢票源码哦~


有了源码,你也可以做到

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,670评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,928评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,926评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,238评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,112评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,138评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,545评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,232评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,496评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,596评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,369评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,226评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,600评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,906评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,185评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,516评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,721评论 2 335

推荐阅读更多精彩内容

  • 网络 理论模型,分为七层物理层数据链路层传输层会话层表示层应用层 实际应用,分为四层链路层网络层传输层应用层 IP...
    FlyingLittlePG阅读 734评论 0 0
  • 本文最后更新于2018年10月16日 后续接口和流程可能发生变化 一.流程分析 浏览器:chrome 工具:Fid...
    意梦春秋阅读 1,294评论 0 1
  • 之前已经说过,数据结构是数据的一种组织形式,根据不同的需求就会出现不同的数据结构,栈和队列就是两种特殊的线性表数据...
    我想吃碗牛肉面阅读 208评论 0 0
  • 成为VR开发者的六个基本问题 2016-05-31小小CTO未来CTO 我常被问起能否提供更多的建议,帮助其他人进...
    JiesonFive阅读 2,060评论 0 3
  • 一眨眼,春节已过完了,回想像是做了一个梦。终于有时间,好好写写过春节这件事。 春节,是中国最隆重的节日。年底,总是...
    诺feiyang阅读 284评论 6 3