快捷搜索:
来自 计算机编程 2019-08-31 16:55 的文章
当前位置: 67677新澳门手机版 > 计算机编程 > 正文

【67677新澳门手机版】python实现12306抢票及自动邮

#写在前边,这么些程序笔者一度弄出来了,可是因为黄牛泛滥以及懒人太多,整个程序的代码就不贴出来了,这里纯粹便是工夫交流。

python达成12306抢票及机关邮件发送提示付款功效,python12306

#写在头里,那几个顺序笔者已经弄出来了,可是因为黄牛泛滥以及懒人太多,整个程序的代码就不贴出来了,这里纯粹正是技艺调换。

只做技能交换、、、、、

67677新澳门手机版 1 67677新澳门手机版 2

67677新澳门手机版 ,哦,程序甘休后,自身依然得手动付款。

废话没多少说,下边就直接初叶才干首要部分解说。

先讲理论部分:首先大家要求代码实现五个浏览器效能,那么模块基本上可以明确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的登入地址

67677新澳门手机版 3

八个红圈中第贰个是验证码来源,此时大家只必要记录这么些网页(点步向)的详情,写入代码当中,python3中urllib.request那个模块展开既可

67677新澳门手机版 4

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

67677新澳门手机版 5

多了多个很奇异的事物,此时,这里正是验证码认证的网站,那么我们是不是理所应当记录下来呢?很简短,到Headers里面就全都看获得了

67677新澳门手机版 6

下边十三分是服务器验证网站,上面正是我们恢复给她的事物,那么这些163,121实际上便是自家乱点的验证码坐标了。至于缘何是坐标,因为它是用鼠标去点图片,那么他只也许是记录坐标,除非她和睦搞了一套人工智能验证图片,但依靠他几年前就疑似此玩了,人工智能根本未有怎么起来,他自然只好是最原始的能力而已。

那么那意味了他是先验证验证码,那么证明密码的在哪?自然是索要验证码那关能过,那大家输贰个没有错的验证码,再写个错密码,登陆

67677新澳门手机版 7

此时能够看看,和验证码同样的情势,大家的卷土而来与认证都在那多少个圈了,还记得上边验证码战败的时候回复给大家的code是或不是有个数字?这几个也相当的重大,那么能够看看大家的验证成功的验证码再次来到给大家的是如丁芯西

67677新澳门手机版 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:查代码这几步的新闻然则很主要喔,我们要把它记录好,並且这里面包车型大巴音讯包括了各样作为音讯以及他们的逐一,多测量试验三遍基本都能搞出来,这里便是唤醒一点

67677新澳门手机版 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完成12306抢票及机动邮件发送提醒付款功效,希望对我们享有帮忙,假设我们有任何疑问请给自家留言,小编会及时苏醒大家的。在此也特别谢谢我们对帮客之家网址的帮忙!

#写在前边,那么些程序作者早已弄出来了,但是因为黄牛泛滥以及懒人太多,整个程...

只做技艺交流、、、、、

67677新澳门手机版 1067677新澳门手机版 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的记名地址

67677新澳门手机版 12

四个红圈中第四个是验证码来源,此时大家只供给记录这么些网页(点进去)的详细情况,写入代码个中,python3中urllib.request这些模块展开既可

67677新澳门手机版 13

如此正是验证码来源,那么怎样用代码捕捉呢?首先大家得以先乱输入密码,乱点验证码,然后大家一向点击登入

67677新澳门手机版 14

 

 

 

多了一个很蹊跷的东西,此时,这里正是验证码认证的网站,那么大家是或不是理所应当记录下来呢?非常粗略,到Headers里面就全都看得到了

67677新澳门手机版 15

地点拾分是服务器验证网站,上边便是我们恢复生机给她的东西,那么那多少个163,121实际正是自身乱点的验证码坐标了。至于怎么是坐标,因为它是用鼠标去点图片,那么他只大概是记录坐标,除非她自个儿搞了一套人工智能验证图片,但基于他几年前就那样玩了,人工智能根本未曾怎么起来,他本来只好是最原始的手艺而已。

那正是说那意味着了他是先表明验证码,那么评释密码的在哪?自然是索要验证码这关能过,那我们输贰个不错的验证码,再写个错密码,登陆

67677新澳门手机版 16

此刻得以见见,和验证码同样的议程,我们的复原与认证都在那多少个圈了,还记得下边验证码失利的时候回复给咱们的code是或不是有个数字?这么些也很要紧,那么可以看看大家的求证成功的验证码重返给大家的是何等东西

67677新澳门手机版 17

此次我们来看了,验证码成功,展现是4,好,这大家不就可以进行规范化判别了么?

本文由67677新澳门手机版发布于计算机编程,转载请注明出处:【67677新澳门手机版】python实现12306抢票及自动邮

关键词: