python自动登录12306并自动点击验证码完成登录的实现源代码


Posted in Python onApril 25, 2018

以下代码可自动登录12306 - 包括输入用户名密码以及自动识别验证码并点击验证码登陆。该源码需要稍作修改:

把  username.send_keys('xxxxxxx')  中的  xxxxxx 改为 你自己的12306账号。

把  password.send_keys('yyyyyy')     中的 yyyyy 改为自己的 12306 密码。

即可运行。

该源码把自动抢票的核心功能:识别验证码并点击验证码登陆实现了。

把代码稍作加工,即可变为自己的自动抢票代码。

运行环境 - 需要安装python运行环境,selenium,requests,浏览器默认为chrome。

运行时 程序会自动分析并识别验证码并点击验证码,完成登陆过程。。。

详细代码如下:

#12306 自动打开12306网站,并输入用户名、密码和验证码,并登录12306,
#author bigluo
#email: 3490699170@qq.com
#coding=utf-8
from selenium import webdriver
import time
from PIL import Image
from selenium.webdriver.common.action_chains import ActionChains
import os
import requests
import numpy
#指定button id和button文本值,并点击,连续点击5次
#return:
#0 click successfully
#-1 连续5次均failed
#1 txt != dest_text,所以不点击
def click_button(b,id,dest_text,j):  #在当前页面查找并点击指定text,错误返回 -1.连续5次,错误时延时1秒
 txt=''
 for i in range(0,5):
  try:
   txt=b.find_element_by_id(id).text
   if txt == dest_text:
    b.find_element_by_id(id).click()
    return 0 
   else:
    return 1
  except:
   time.sleep(1)
   continue
 return -1       #5次都失败了
#给定button id和text,find a given text
#0 found
#-1 not found
def find_button(b,id,dest_text):
 txt=''
 try:
   txt=b.find_element_by_id(id).text
   if txt == dest_text:
    return 0
 except:  
   #print("find_button Error --page txt is "+txt+" input text is "+dest_text)
   return -1
 return -1
#click refresh pic button
def click_refresh(b):
 try:
  b.find_element_by_xpath("//*[@id='loginForm']/div/ul[2]/li[4]/div/div/div[1]").click()
 except:
  print("click_refresh:exception!!!!")
#初始化浏览器 
def init_browser(b):
 b.maximize_window()
#进入登录页,必须是未登录状态
# 0 : 成功
#-1 : 出错了
def visit_login_page(b):
 url = 'https://kyfw.12306.cn/otn/index/init'
 b.get(url)
 if find_button(b,u"login_user",u"登录") != 0: #没退出
  click_button(b,u"regist_out",u"退出",0)  #点击退出
  time.sleep(5)         #休息5秒再查看是否退出
 if click_button(b,u"login_user",u"登录",0) != 0: #点击登陆按钮
  return -1     #Error happened!!
 time.sleep(10)     #访问login page后休息10秒,等待验证码图片加载完成 
 return 0
#截取一张验证码图片,保存为aa.png
def get_a_verify_pic(b):
 imgelement=b.find_element_by_xpath("//*[@id='loginForm']/div/ul[2]/li[4]/div/div/div[3]")
 location = imgelement.location #获取验证码x,y轴坐标 
 size=imgelement.size #获取验证码的长宽
 rangle=(int(location['x']),int(location['y']),int(location['x']+size['width']),int(location['y']+size['height'])) #写成我们需要截取的位置坐标
 b.save_screenshot('aa.png')
 i=Image.open("aa.png") #打开截图
 pic_name='verify_code'+".jpg" #标准12306验证图片
 frame4=i.crop(rangle) #使用Image的crop函数,从截图中再次截取我们需要的区域
 frame4.save(pic_name)
 return pic_name
#破解图片验证码
def ana_pic(b,pic_name):
 body_list=[]
 url='''http://littlebigluo.qicp.net:47720/'''
 files={'file':(pic_name,open(pic_name,'rb'),'image/png')}
 res=requests.post(url,files=files)    #post pic
 if res.status_code == 200:      #return ok
  try:
   #print(res.text)
   if u"文字应该" in res.text:    #识别验证码成功    
    body_str_1=res.text.split(u'''<B>''')
    body_str=body_str_1[2].split(u'<')[0].split()   
    for index in body_str:
     body_list.append(int(index))
    return 0,numpy.array(body_list)
  except:
   print("ana pic failed!!!!")
   return -1,None
 return -1,None     #验证码解析失败
#按输入的下标,点击一张验证码图片
def click_one_pic(b,i):
 try:
  imgelement=b.find_element_by_xpath("//*[@id='loginForm']/div/ul[2]/li[4]/div/div/div[3]")
  if i<=4:
   ActionChains(b).move_to_element_with_offset(imgelement,40+72*(i-1),73).click().perform()
  else:
   i -= 4
   ActionChains(b).move_to_element_with_offset(imgelement,40+72*(i-1),145).click().perform()
 except:
  print("Wa -- click one pic except!!!")
#按bodylist 指示,点击指定验证图片
def click_pic(b,body_list):
 for i in range(len(body_list)):
  click_one_pic(b,body_list[i])
  time.sleep(1)
#输入用户名密码,并点击验证码登陆
#0:login successfully
#1:verify code failed,
#-1 error happened
def login(b):
 pic_name=None
 try:
  pic_name=get_a_verify_pic(b)   #截取12306验证码图片
  ret_val,body_list=ana_pic(b,pic_name) #破解12306验证码
  username=b.find_element_by_id('username')
  username.clear()
  username.send_keys('xxxxxx')
  password=b.find_element_by_id('password')
  password.clear()
  password.send_keys('yyyyyyy') 
  time.sleep(2) 
  if ret_val != 0:
   #print("login : what??? predict return error!!")
   print("login -- no verified pic!!! !!")
   os.remove(pic_name)    #exception occured
   #click_refresh(b)
   return -1
  if len(body_list) == 0:    #no pic recognized
   click_refresh(b)
   print("login : what??? body list is null!!!")
   os.remove(pic_name)    #exception occured
   return 1      #verified failed
  click_pic(b,body_list)
  time.sleep(1)      #休息1秒再点击登陆按钮
  if click_button(b,u"loginSub",u"登录",0) != 0:
   print("login : what??? click button exception!!!")
   return -1     #Error happened!! 
 except:
  if None != pic_name:
   os.remove(pic_name)    #exception occured
  print("login:exception!!")
  return -1
 time.sleep(5)      #查看验证码是否正确??
 ret_val=find_button(b,u"error_msgmypasscode1",u"请点击正确的验证码")
 if ret_val == 0:     #验证码错误
  print("login--Verified code error!!!")
  return 1
 os.remove(pic_name)
 print("login--successfully!!!")
 return 0
#循环login
#返回
#0:登陆成功-正常返回
#-1:登陆失败或异常返回
#1 :验证码未识别出来
def try_login(b):
 for k in range(0,5):     #连续尝试5次
  rt_val=login(b)
  if rt_val < 0:      #error happened
   print("verify got exception!!")
   time.sleep(10)
   continue
  elif rt_val == 1:     #verified code error
   print("verify - code error!!")
   time.sleep(5)
   continue      #login again
  else:        #login successfully
   print("login successfully!!!")
   return 0    
 return -1     #login failed
if __name__ == "__main__": 
 b = webdriver.Chrome()
 init_browser(b)
 visit_login_page(b)
 ret_val = try_login(b) #尝试登录
 if ret_val<0:  
  print("main -- try_login failed!!!") 
 else:
  print("main -- try_login successfully!!!") 
 print("Good job!bigluo!!")

总结

以上所述是小编给大家介绍的python自动登录12306并自动点击验证码完成登录的实现源代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python ip正则式
May 07 Python
Python中type的构造函数参数含义说明
Jun 21 Python
Flask框架的学习指南之制作简单blog系统
Nov 20 Python
Python 专题一 函数的基础知识
Mar 16 Python
老生常谈python之鸭子类和多态
Jun 13 Python
python嵌套字典比较值与取值的实现示例
Nov 03 Python
python 对多个csv文件分别进行处理的方法
Jan 07 Python
python对列进行平移变换的方法(shift)
Jan 10 Python
Python中捕获键盘的方式详解
Mar 28 Python
python日期相关操作实例小结
Jun 24 Python
浅谈优化Django ORM中的性能问题
Jul 09 Python
python openCV实现摄像头获取人脸图片
Aug 20 Python
PyQt5实现拖放功能
Apr 25 #Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
Apr 25 #Python
wxPython实现窗口用图片做背景
Apr 25 #Python
django 发送手机验证码的示例代码
Apr 25 #Python
python3+PyQt5实现自定义分数滑块部件
Apr 24 #Python
详解tensorflow载入数据的三种方式
Apr 24 #Python
关于Tensorflow中的tf.train.batch函数的使用
Apr 24 #Python
You might like
laravel中短信发送验证码的实现方法
2018/04/25 PHP
PDO::errorCode讲解
2019/01/28 PHP
PHP保留两位小数的几种方法
2019/07/24 PHP
JavaScript 不只是脚本
2007/05/30 Javascript
浅析JavaScript中的事件机制
2015/06/04 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
AngularJS 让人爱不释手的八种功能
2016/03/23 Javascript
使用BootStrap进行轮播图的制作
2017/01/06 Javascript
JavaScript与Java正则表达式写法的区别介绍
2017/08/15 Javascript
微信小程序之蓝牙的链接
2017/09/26 Javascript
AngularJS创建一个上传照片的指令实例代码
2018/02/24 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
2018/11/30 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
详解JavaScript中精度失准问题及解决方法
2020/02/04 Javascript
Python基于递归算法求最小公倍数和最大公约数示例
2018/07/27 Python
Python爬虫将爬取的图片写入world文档的方法
2018/11/07 Python
python三方库之requests的快速上手
2019/03/04 Python
python3实现钉钉消息推送的方法示例
2019/03/14 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
python实现通过队列完成进程间的多任务功能示例
2019/10/28 Python
PyCharm 无法 import pandas 程序卡住的解决方式
2020/03/09 Python
Python 中的函数装饰器和闭包详解
2021/02/06 Python
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
StubHub巴西:购买和出售您的门票
2016/07/22 全球购物
犹他州最古老的体育用品公司:Al’s
2020/12/18 全球购物
顶岗实习计划书
2014/01/10 职场文书
中职毕业生自我鉴定范文(3篇)
2014/09/28 职场文书
公司领导班子群众路线四风问题对照检查材料
2014/10/02 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
护士年终个人总结
2015/02/13 职场文书
国家助学金受助感言
2015/08/01 职场文书
2015年秋学期师德师风建设工作总结
2015/10/23 职场文书
会计工作自我鉴定范文
2019/06/21 职场文书
62句有关感恩节文案(推荐收藏)
2019/11/28 职场文书
tp5使用layui实现多个图片上传(带附件选择)的方法实例
2021/11/17 PHP