python实现12306抢票以及自动邮件发送提醒付款

作者: 网络编程  发布:2019-07-25

#写在日前,这几个程序作者已经弄出来了,然而因为黄牛泛滥以及懒人太多,整个程序的代码就不贴出来了,这里纯粹正是技巧交换。

python完结12306抢票以及电动邮件发送提示付款,python12306

#写在前方,那么些程序我早就弄出来了,不过因为黄牛泛滥以及懒人太多,整个程序的代码就不贴出来了,这里纯粹便是才干交换。

只做技艺调换、、、、、

图片 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.0
import urllib.request as ul
import urllib.parse as uz
import http.cookiejar as cookielib
from json import loads
c=cookielib.LWPCookieJar()#先把cookie对象存储为cookiejar的对象
cookie = ul.HTTPCookieProcessor(c)#把cookiejar对象转换为一个handle
opener = ul.build_opener(cookie)#建立一个模拟浏览器,需要handle作为参数
ul.install_opener(opener)#安装一个全局模拟浏览器,代表无论怎么访问都是一个浏览器操作而不是分开获取验证码等msg

好了,如此一来,大家代码的始发达成已经产生,接下去正是步入互连网深入分析部分

首先能够运用google浏览器照旧搜狗浏览器(自身用的搜狗),展开F12,也正是开荒者格局,登入12306的记名地址

图片 3

八个红圈中首个是验证码来源,此时我们只需求记录这些网页(点走入)的详细意况,写入代码其中,python3中urllib.request那一个模块张开既可

图片 4

如此那般正是验证码来源,那么哪些用代码捕捉呢?首先大家得以先乱输入密码,乱点验证码,然后大家直接点击登陆

图片 5

 

 

 

多了三个很稀奇的事物,此时,这里便是验证码认证的网站,那么大家是还是不是应当记录下来呢?很简单,到Headers里面就全都看获得了

图片 6

地点十一分是服务器验证网址,上边就是大家回复给他的东西,那么那么些163,121其实就是自己乱点的验证码坐标了。至于为什么是坐标,因为它是用鼠标去点图片,那么她只或然是记录坐标,除非她自身搞了一套人工智能验证图片,但依照他几年前就像此玩了,智能AI根本未曾怎么起来,他当然只好是最原始的技能而已。

那正是说那象征了她是先验证验证码,那么注脚密码的在哪?自然是内需验证码那关能过,那大家输贰个没有错的验证码,再写个错密码,登陆

图片 7

那会儿得以看来,和验证码同样的措施,大家的复苏与认证都在那多少个圈了,还记得下边验证码战败的时候回复给大家的code是或不是有个数字?这些也很关键,那么能够看看大家的表明成功的验证码重回给我们的是什么样东西

图片 8

这一次大家看到了,验证码成功,展现是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'}#先写个头,表示我这是浏览器用户登录而不是代码登录,如果不写,代码默认用的签名之类的是编程语言的标识,这样对方服务器很容易就发现你是个脚本了

def get_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,下同
    with open(r'C:UsersAdministratorDesktop12306自动抢票code.png','wb')as f:
        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 query string,此时是str,要把它变为byts。

    html = opener.open(req,data= data).read().decode()#读取出来是byts格式,转换为‘utf-8(默认)
    print(html)
    result = loads(html)
    if result['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)
        if result1['result_code'] == 0:
            print('账户密码验证通过')
        else:
            print(result1['result_message'])

    else:
        print('验证码校验失败,重来')


if __name__ == '__main__':
    main_()

此刻,我们就过了验证码密码这一关,前面是否又要查票?那么等同的主意,大家就足以由此及彼到最终一步,这里就不一一贴代码了

ps:查代码这几步的新闻可是很关键喔,大家要把它记录好,而且这中间的新闻富含了各样作为音信以及他们的顺序,多测量试验几遍基本都能搞出来,这里正是唤醒一点

图片 9

 

 找找规律,然后用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邮件公告:

def email():#这是我订票后给自己发邮件的函数
    import smtplib
    from email.mime.text import MIMEText
    import time
    text = '已经为%s抢到票,速度登录12306付款,用户名:%s,密码:%s'%(NAME,username,password)


    msg = MIMEText(text, 'plain', 'utf-8')
    msg_From = '2059****[email protected]'
    msg_To = '5043****[email protected]'#是的,我有两个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('邮件已发送~你可以安心去玩了')

def emailforcode():#此函数是防止查询有票但12306账号掉线人不在无法订票的提醒
    import smtplib
    from email.mime.text import MIMEText
    import time
    text = '%s账号下线,速度登录验证12306' % NAME

    msg = MIMEText(text, 'plain', 'utf-8')
    msg_From = '205****[email protected]'
    msg_To = '50****[email protected]'

    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('邮件已发送~')

诸如此比就顺理成章了。

 

无法发完整的代码(本人指标就是为着本事调换而已,防止懒人盗码乱搞),不过笔者深信不疑各位开辟中的朋友们借使有逻辑,有初阶,只要自己肯出手,都得以协调切磋出来,一举三反。究竟自个儿便是这么搞出来的,笔者向来都相信,只要肯学,都会学会,只要肯做,都得以做成。

 

好了,人生苦短,作者用python,作者是一枚土木人转行搞开采的小白。一切全靠自学,一齐加油,共勉~

#写在这段日子,这么些顺序笔者曾经弄出来了,可是因为黄牛泛滥以及懒人太多,整个程序...

只做本领交换、、、、、

图片 10图片 11

嗯,程序甘休后,本身可能得手动付款。

废话相当少说,上面就径直早先技能首要部分解说。

先讲理论部分:首先大家供给代码完毕四个浏览器作用,那么模块基本上能够规定urllib.parse、urllib.request,那多个包都以和网站有关的模块,那么大家去登陆二个网站,非常是有验证码这么些的网站,大家登陆进去是否就行了?答案是对的,不过大家用代码达成的话,那些网址恐怕每便都有一点都不小概率被代码去央浼,那么服务器怎么知道大家是一个人,实际不是四个浏览器区别的用户呢?

那会儿cookie就非凡主要了,在代码中安装好cookie,那么对方服务器自然就知道大家是一个人,相比服务器都以这般区分的。python3中 cookie那几个效应是封装在http.cookiejar这几个模块之内。好了,代码如下:

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

好了,如此一来,我们代码的初叶完结已经成功,接下去正是步向互联网深入分析部分

第一能够动用google浏览器依旧搜狗浏览器(本身用的搜狗),张开F12,相当于开拓者情势,登入12306的登入地址

图片 12

四个红圈中第二个是验证码来源,此时咱们只须求记录这些网页(点步向)的详细景况,写入代码个中,python3中urllib.request那一个模块张开既可

图片 13

这么正是验证码来源,那么什么样用代码捕捉呢?首先大家能够先乱输入密码,乱点验证码,然后我们一直点击登入

图片 14

 

 

 

多了叁个很奇怪的事物,此时,这里就是验证码验证的网站,那么大家是或不是相应记录下来呢?很简单,到Headers里面就全都看得到了

图片 15

上边拾贰分是服务器验证网站,上边正是我们过来给他的事物,那么那些163,121实在正是自个儿乱点的验证码坐标了。至于何以是坐标,因为它是用鼠标去点图片,那么她只大概是记录坐标,除非他自身搞了一套人工智能验证图片,但遵照他几年前如同此玩了,人工智能根本未曾怎样手,他当然只可以是最原始的工夫而已。

那么那代表了她是先验证验证码,那么注解密码的在哪?自然是需求验证码那关能过,那大家输一个不易的验证码,再写个错密码,登陆

图片 16

此时能够看出,和验证码一样的格局,大家的还原与认证都在那多少个圈了,还记得上边验证码失利的时候回复给大家的code是或不是有个数字?这些也很首要,那么能够看看大家的辨证成功的验证码重临给大家的是怎么着事物

图片 17

此次大家见到了,验证码成功,显示是4,好,那大家不就足以拓展标准推断了么?

本文由金沙澳门官网发布于网络编程,转载请注明出处:python实现12306抢票以及自动邮件发送提醒付款

关键词: 金沙澳门官网

上一篇:如何在Excel表格中插入
下一篇:没有了