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 相关文章推荐
Tensorflow环境搭建的方法步骤
Feb 07 Python
python解决js文件utf-8编码乱码问题(推荐)
May 02 Python
利用python和ffmpeg 批量将其他图片转换为.yuv格式的方法
Jan 08 Python
Python何时应该使用Lambda函数
Jul 02 Python
Flask-WTF表单的使用方法
Jul 12 Python
python中struct模块之字节型数据的处理方法
Aug 27 Python
python3实现单目标粒子群算法
Nov 14 Python
tensorflow 自定义损失函数示例代码
Feb 05 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
Mar 02 Python
使用Python爬取弹出窗口信息的实例
Mar 14 Python
Python 列表反转显示的四种方法
Nov 16 Python
Python实现自动整理文件的脚本
Dec 17 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
php数字转汉字代码(算法)
2011/10/08 PHP
PHP使用DES进行加密与解密的方法详解
2013/06/06 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
2014/06/21 PHP
php数组转成json格式的方法
2015/03/09 PHP
在 PHP 和 Laravel 中使用 Traits的方法
2019/11/13 PHP
Javascript技巧之不要用for in语句对数组进行遍历
2010/10/20 Javascript
基于jQuery的可用于选项卡及幻灯的切换插件
2011/03/28 Javascript
jquery 页眉单行信息滚动显示实现思路及代码
2014/06/26 Javascript
JavaScript中的方法重载实例
2015/03/16 Javascript
JavaScript获取URL汇总
2015/06/08 Javascript
静态页面html中跳转传值的JS处理技巧
2016/06/22 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
2016/09/09 Javascript
yii form 表单提交之前JS在提交按钮的验证方法
2017/03/15 Javascript
Javarscript中模块(module)、加载(load)与捆绑(bundle)详解
2017/05/28 Javascript
基于JavaScript实现评论框展开和隐藏功能
2017/08/25 Javascript
使用nvm管理不同版本的node与npm的方法
2017/10/31 Javascript
vue2.0 实现导航守卫(路由守卫)
2018/05/21 Javascript
压缩Vue.js打包后的体积方法总结(Vue.js打包后体积过大问题)
2020/02/03 Javascript
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
Vue 按照创建时间和当前时间显示操作(刚刚,几小时前,几天前)
2020/09/10 Javascript
在python中的socket模块使用代理实例
2014/05/29 Python
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
2015/12/25 Python
django中静态文件配置static的方法
2018/05/20 Python
Python快速查找list中相同部分的方法
2018/06/27 Python
基于Python执行dos命令并获取输出的结果
2019/12/30 Python
使用CSS3来实现滚动视差效果的教程
2015/08/24 HTML / CSS
会计专业应届生自荐信
2014/02/07 职场文书
户外活动策划方案
2014/03/12 职场文书
2014两会学习心得:榜样精神伴我行
2014/03/17 职场文书
学校师德师风整改方案
2014/10/28 职场文书
2014年办公室个人工作总结
2014/11/12 职场文书
校运会新闻稿
2015/07/17 职场文书
一波干货,会议主持词开场白范文
2019/05/06 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python
HTML+CSS制作心跳特效的实现
2021/05/26 HTML / CSS