#-*-coding:utf-8 -*-
import urllib2
import urllib
# 验证码登录同步
import cookielib
import damatuWeb
import ssl
from json import loads
from cons import station_name#证书验证
ssl._create_default_https_context = ssl._create_unverified_context
# 请求验证码图片
c=cookielib.LWPCookieJar()#生成一个储存cookie的对象
cookie=urllib2.HTTPCookieProcessor(c)#绑定
opener=urllib2.build_opener(cookie)
urllib2.install_opener(opener)
# opener绑定,用opener.open请求,自带cookie,实现验证码与登陆同步
city={}
for i in station_name.split("@"):if  not i:continuetmp_list=i.split("|")city[tmp_list[1]]=tmp_list[2]# print city["长沙"]
# print city["上海"]from_station=city["长沙"]
to_station=city["上海"]
train_date="2017-11-03"def getCode():req=urllib2.Request("https://kyfw.12306.cn/passport/captcha/""captcha-image?login_site=E&module=""login&rand=sjrand&0.3835166812770916")codeing=opener.open(req).read()#openerfn=open('code/code.png','wb')#保存到本地fn.write(codeing)fn.close()
def code():getCode()req=urllib2.Request('https://kyfw.12306.cn/passport''/captcha/captcha-check')code=damatuWeb.calcCode()# code=raw_input(">>")print codedata={"answer":code,"login_site":"E","rand":"sjrand",}data=urllib.urlencode(data)#把字典类型转变为查询字符串html=opener.open(req,data=data).read()result=loads(html)if result["result_code"]=="4":print"验证码校验成功!"return Trueelse:print "验证码校验失败"code()def login():#登录req=urllib2.Request('https://kyfw.12306.cn/passport''/web/login')data={'username':'abcdert','password':'123456','appid':'otn',}data=urllib.urlencode(data)html=opener.open(req,data=data).read()result=loads(html)if result["result_code"]==0:print"登陆成功"return Trueelse:print"登陆失败"def getTrain():req=urllib2.Request("https://kyfw.12306.cn/otn/leftTicket/query?""leftTicketDTO.train_date=%s&leftTicketDTO"".from_station=%s&leftTicketDTO.to_station=%s&""purpose_codes=ADULT" %(train_date,from_station,to_station))html=opener.open(req).read()result=loads(html)return result['data']['result']# code()
# login()
# print getTrain()
for i in getTrain():tmp_list=i.split("|")# tmp_list[3]="车次"# tmp_list[8]="出发时间"# tmp_list[9]="到达时间"# tmp_list[26]="无座"# tmp_list[29]="硬座"# tmp_list[25]="特等座"# tmp_list[31]="一等座"# tmp_list[30]="二等座"# tmp_list[23]="软卧"# a=0# for n in tmp_list:#     print "[%s]%s"%(a,n)#     a+=1# break
# print tmp_listif tmp_list[30]!=u"无" and tmp_list[30]!="":print "有票","车次:",tmp_list[3]# break# else:#     print "没票"

实例 damatuWeb文件

#-*- coding:utf-8 -*-
#python版本3.4import hashlib
# import http.client
# import urllib.request
import urllib
import urllib2
import json
import base64def md5str(str): #md5加密字符串m=hashlib.md5(str.encode(encoding = "utf-8"))return m.hexdigest()def md5(byte): #md5加密bytereturn hashlib.md5(byte).hexdigest()class DamatuApi():ID = '51510'KEY = '966da54dd89c627c12de3dcd47bc50e1'HOST = 'http://api.dama2.com:7766/app/'def __init__(self,username,password):self.username=usernameself.password=passworddef getSign(self,param=b''):return (md5(bytes(self.KEY) + bytes(self.username) + param))[:8]def getPwd(self):return md5str(self.KEY +md5str(md5str(self.username) + md5str(self.password)))def post(self,path,params={}):data = urllib.urlencode(params).encode('utf-8')url = self.HOST + pathresponse = urllib2.Request(url,data)return urllib2.urlopen(response).read()#查询余额 return 是正数为余额 如果为负数 则为错误码def getBalance(self):data={'appID':self.ID,'user':self.username,'pwd':dmt.getPwd(),'sign':dmt.getSign()}res = self.post('d2Balance',data)res = str(res)jres = json.loads(res)if jres['ret'] == 0:return jres['balance']else:return jres['ret']#上传验证码 参数filePath 验证码图片路径 如d:/1.jpg type是类型,查看http://wiki.dama2.com/index.php?n=ApiDoc.Pricedesc  return 是答案为成功 如果为负数 则为错误码def decode(self,filePath,type):f=open(filePath,'rb')fdata=f.read()filedata=base64.b64encode(fdata)f.close()data={'appID':self.ID,'user':self.username,'pwd':dmt.getPwd(),'type':type,'fileDataBase64':filedata,'sign':dmt.getSign(fdata)}      res = self.post('d2File',data)res = str(res)jres = json.loads(res)if jres['ret'] == 0:#注意这个json里面有ret,id,result,cookie,根据自己的需要获取return(jres['result'])else:return jres['ret']#url地址打码 参数 url地址  type是类型(类型查看http://wiki.dama2.com/index.php?n=ApiDoc.Pricedesc) return 是答案为成功 如果为负数 则为错误码def decodeUrl(self,url,type):data={'appID':self.ID,'user':self.username,'pwd':dmt.getPwd(),'type':type,'url':urllib.quote(url),'sign':dmt.getSign(url.encode(encoding = "utf-8"))}res = self.post('d2Url',data)res = str(res)jres = json.loads(res)if jres['ret'] == 0:#注意这个json里面有ret,id,result,cookie,根据自己的需要获取return(jres['result'])else:return jres['ret']#报错 参数id(string类型)由上传打码函数的结果获得 return 0为成功 其他见错误码def reportError(self,id):#f=open('0349.bmp','rb')#fdata=f.read()#print(md5(fdata))data={'appID':self.ID,'user':self.username,'pwd':dmt.getPwd(),'id':id,'sign':dmt.getSign(id.encode(encoding = "utf-8"))}   res = self.post('d2ReportError',data)res = str(res)jres = json.loads(res)return jres['ret']#调用类型实例:
#1.实例化类型 参数是打码兔用户账号和密码
dmt=DamatuApi("zyc3x7z","zyc2021174")
#2.调用方法:
# print(dmt.getBalance()) #查询余额
# print(dmt.decode('code/code.png',287)) #上传打码,第二个位验证码类型
# code=(dmt.decode('code/code.png',287)) #上传打码,第二个位验证码类型
# print(dmt.decodeUrl('http://captcha.qq.com/getimage?aid=549000912&r=0.7257105156128585&uin=3056517021',200)) #上传打码
#print(dmt.reportError('894657096')) #上报错误def calcCode():code = (dmt.decode('code/code.png', 287))code=code.replace('|',',')code=code.split(',')x_list=code[0::2]y_list=code[1::2]s=""for i in zip(x_list,y_list):y=int(i[1])-30s+='%s,%s,'%(i[0],y)return s[:-1]# code=calcCode()
# # code=raw_input(">>")
# print code

抓包抓取城市名称url 保存到文件命名为csdn

https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9029

显示结果

有票 车次: G1352
有票 车次: G1322
有票 车次: G1362
有票 车次: G1372
有票 车次: G1502
有票 车次: G1374
有票 车次: G1364
有票 车次: G1376
有票 车次: G2366
有票 车次: G1330

学习笔记——12306 检测余票(3)相关推荐

  1. java保存火车票信息_java抓取12306火车余票信息

    最近在弄一个微信的公众帐号,涉及到火车票查询,之前用的网上找到的一个接口,但只能查到火车时刻表,12306又没有提供专门的查票的接口.今天突然想起自己直接去12306上查询,抓取查询返回的数据包,这样 ...

  2. HALCON 21.11:深度学习笔记---对象检测, 实例分割(11)

    HALCON 21.11:深度学习笔记---对象检测, 实例分割(11) HALCON 21.11.0.0中,实现了深度学习方法. 本章介绍了如何使用基于深度学习的对象检测. 通过对象检测,我们希望在 ...

  3. HALCON 21.11:深度学习笔记---异常检测(9)

    HALCON 21.11:深度学习笔记---异常检测(9) HALCON 21.11.0.0中,实现了深度学习方法. 本章介绍了如何使用基于深度学习的异常检测. 通过异常检测,我们想要检测图像是否包含 ...

  4. 12306之余票查询流程解析

    前言 本套教程共分3章: 12306之登录流程解析 12306之余票查询解析 12306之下单流程解析 本套内容主要用于分析12306购票流程,意在编写一套自动购票小程序.12306接口 api 经常 ...

  5. 12月28日 OpenCV 实战基础学习笔记——疲劳检测

    文章目录 前言 一.眨眼疲劳检测 前言 本文为12月28日 OpenCV 实战基础学习笔记--疲劳检测. 一.眨眼疲劳检测 from scipy.spatial import distance as ...

  6. 项目实战一 12306火车票余票查询软件

    1.安装docopt.urllib.requests 2.实现程序基础框架 # -*- coding:utf-8 -*-""" Train tickets query p ...

  7. 12306实时余票查询接口

    12306实时余票查询接口代码文档及返回示例,可查询实时火车票余票,包括车次.车次始发站.车次终点站.出发时间.到达时间.车次类型.总历时时间等等. 接口名称:12306实时余票查询接口 接口平台:聚 ...

  8. Python爬虫----12306火车票余票查询器

    12306火车票余票查询器 文章同步更新:http://www.riba2534.cn/?p=305 今天写了一个12306火车票余票查询器的爬虫,在这里记录一下过程. 首先先看一下最终效果: 比如想 ...

  9. 9月1日目标检测学习笔记——文本检测

    文章目录 前言 一.类型 1.Top-Down 2.Bottom-up 二.基于深度学习的文本检测模型 1.CTPN 2.RRPN 3.FTSN 4.DMPNet 5.EAST 6.SegLink 7 ...

最新文章

  1. Javascript 获取Url值 --转
  2. 杨振宁:宇宙有没有造物者?
  3. [Android]Android端ORM框架——RapidORM(v1.0)
  4. sed和awk的常用实例
  5. 系统调优一之内存子系统
  6. java 热替换_class卸载、热替换和Tomcat的热部署的分析
  7. [导入]Update实现多表更新
  8. BZOJ5089 最大连续子段和(分块)
  9. 走过的弯路,你的套路
  10. 位运算之左移右移运算之详解
  11. sql server表分区_SQL Server中的FORCESCAN和分区表
  12. 手机无线信道测试软件,WiFi不稳定经常断?手机WiFi信道小工具
  13. 有管网气体消防系统小知识来啦
  14. 微信小程序支付功能的实现
  15. python模块专题——1.faker
  16. Netlogon 特权提升漏洞(CVE-2020-1472)原理分析与验证
  17. 让最小化安装的CentOS 6.8能够浏览网页
  18. 浮点数打印其实是个复杂的过程
  19. 在用Delphi 10.2.3 提示connection closed gracefully的处理
  20. CLion编译的exe文件无法运行

热门文章

  1. 七牛云一站式 SSL 证书服务上线,即刻使用最多可省 7 万
  2. 前端工程师需要学习ps 吗_前端开发工程师需要掌握的6大PS技能
  3. mongodb 基本概念
  4. Vim——文件打开、保存、退出命令总结
  5. 老赖和骗子的距离到底有多远?
  6. 【数据治理相关概念】(三)数据溯源综述
  7. 订阅号如何获取用户基本信息
  8. js调用微信利用二维码扫码登录
  9. windows下如何查看端口号是否被占用及被那个应用程序占用
  10. docker 部署maven服务器,并将代码发布到maven服务器,并kie-server关联