目标
使用接口实现自动登陆滴滴打码。
分析
1 打开滴滴打码登陆网站:http://www.ddocr.com/user/login.html 。
2 查看接口
1)发现有一个get型接口:login.html 如下图所示。这个接口用于我们请求登陆界面。
2)还发现了一个get型接口:code.html 如下图所示。这个接口用来请求登陆界面显示的验证码。
3 输入账号、密码和验证码后点击登陆,进入网站首页。
1)进入网站首页后,我们发现用于获取登陆界面的get型接口变为post型:login.jsonp 如下图所示。
这个post接口还有 Form Data 这一表单数据,包括我们登陆的账号、密码和验证码。因此这个变化后的接口是用来请求登陆滴滴打码的。
2)进入网站首页后,我们发现还多出了一个接口:index.html ,多出的这个接口用来请求首页。如果没有这个请求,我们就看不到首页。
思路
1 发送一个get请求,用于获取登陆界面。url为登陆界面的url:http://www.ddocr.com/user/login.html
2 发送一个get请求,用于获取第1步登陆界面的验证码,把登陆界面的验证码下载到本地,然后用超级鹰对下载的图片进行识别。
3 发送一个post请求,用于登陆滴滴打码网,请求应该包括:账号、密码以及超级鹰识别验证码的结果。
4 发送一个get请求,用来请求滴滴打码网的首页。
注意:
1)前三个步骤的验证码是同一个验证码。为了保证它们三步的验证码相同,我们应该使用requests库的Session方法,这样每次发送请求的cookie就都相同了。第4步请求首页的cookie也应该和前三次相同。
1 request = requests.Session() 2 # 第一次请求 3 request1 = request.get() 4 # 第二次请求 5 request2 = request.get() 6 # 第三次请求 7 request3 = request.post() 8 # 第四次请求 9 request4 = request.get() 10 11 # 以上四次请求的cookie都相同。
2)每次发送请求时,都应该加上请求头,以免请求失败。
3)当我们运行后,得到的代码与滴滴打码首页的源代码是一样的,那么就证明我们登陆成功了。
1 '''2020-7-1 by 微风''' 2 3 import requests 4 from hashlib import md5 5 6 s = requests.Session() 7 #第一次请求,用于请求登陆界面。 8 s.get('http://www.ddocr.com/user/login.html') 9 10 headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'} 11 12 #获取验证码 13 yanzhengma_url = 'http://www.ddocr.com/validate/code.html?c=0.26932298512812447?c=0.5569207243804184' 14 #第二次请求,用于请求登陆界面的验证码。 15 yanzhengma = s.get(yanzhengma_url,headers=headers) 16 17 #将验证码保存到本地 18 with open('yanzhengma.jpg','wb') as file: 19 file.write(yanzhengma.content) 20 21 #使用超级鹰识别下载到本地的验证码 22 class Chaojiying_Client(object): 23 24 def __init__(self, username, password, soft_id): 25 self.username = username 26 self.password = md5(password.encode('utf8')).hexdigest() 27 self.soft_id = soft_id 28 self.base_params = { 29 'user': self.username, 30 'pass2': self.password, 31 'softid': self.soft_id, 32 } 33 self.headers = { 34 'Connection': 'Keep-Alive', 35 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)', 36 } 37 38 def PostPic(self, im, codetype): 39 """ 40 im: 图片字节 41 codetype: 题目类型 参考 http://www.chaojiying.com/price.html 42 """ 43 params = { 44 'codetype': codetype, 45 } 46 params.update(self.base_params) 47 files = {'userfile': ('ccc.jpg', im)} 48 r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers) 49 return r.json() 50 51 def ReportError(self, im_id): 52 """ 53 im_id:报错题目的图片ID 54 """ 55 params = { 56 'id': im_id, 57 } 58 params.update(self.base_params) 59 r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers) 60 return r.json() 61 chaojiying = Chaojiying_Client('超级鹰账号', '超级鹰密码', '超级鹰软件ID') 62 im = open('yanzhengma.jpg', 'rb').read() 63 64 65 #第三次请求,用于请求登陆,登陆时需要携带登陆信息。chaojiying.PostPic(im, 1004)['pic_str']是超级鹰识别下载到本地的验证码的结果。 66 Form_Data = {'account': '754944838@qq.com','password': '346980801','verity':chaojiying.PostPic(im, 1004)['pic_str']} 67 login = s.post('http://www.ddocr.com/user/login.html',data=Form_Data,headers=headers) 68 69 #第四次请求,用于请求首页 70 index = s.get('http://www.ddocr.com/user/index.html',headers=headers) 71 print(index.text)