Python使用Socket(Https)Post登录百度的实现代码


Posted in Python onMay 18, 2012

登录百度,首先当然是先抓百度的登录包 ,由于是网页登录,最方便的自然是httpwatch了,我使用的测试账号是itiandatest1,密码是itianda,抓包结果:

POST /?login HTTP/1.1 
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* 
Referer: https://passport.baidu.com/?login&tpl=mn 
Accept-Language: zh-CN 
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Alexa Toolbar; BOIE9;ZHCN) 
Content-Type: application/x-www-form-urlencoded 
Accept-Encoding: gzip, deflate 
Host: passport.baidu.com 
Content-Length: 243 
Connection: Keep-Alive 
Cache-Control: no-cache

登录包抓到了,下面开始写代码:
import socket 
import ssl 
sock = ssl.wrap_socket(socket.socket())

ssl是专门用来处理https的模块,我们使用该模块的wrap_socket函数生成一个SSLSocket对象。

然后建立连接:

sock.connect(('passport.baidu.com', 443))

这里需要注意的是https使用443端口,不是80。

之后发送数据:

data = '''\ 
POST /?login HTTP/1.1 
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */* 
Referer: https://passport.baidu.com/?login&tpl=mn 
Accept-Language: zh-CN 
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Alexa Toolbar; BOIE9;ZHCN) 
Content-Type: application/x-www-form-urlencoded 
Host: passport.baidu.com 
Content-Length: 243 
Connection: Keep-Alive 
Cache-Control: no-cache 
tpl_ok=&next_target=&tpl=mn&skip_ok=&aid=&need_pay=&need_coin=&pay_method=&u=http%3A%2F%2Fwww.baidu.com%2F&return_method=get&more_param=&return_type=&psp_tt=0&password=itianda&safeflg=0&isphone=tpl&username=itiandatest1&verifycode=&mem_pass=on\ 
''' 
sock.sendall(data)

需要注意的是sendall之后不能调用shutdown方法。

其余部分就和普通的socket处理方式没什么差别了 :

recv_data = sock.recv(8192) 
sock.close() 
print recv_data

由于我们只需要cookie信息,所以只接收少量数据就可以了。

登录成功的标志是服务器返回含有BDUSS的set-cookie:

HTTP/1.1 200 OK 
Set-Cookie: BAIDUID=DB464E1EBA6571FB82D70460D6AAB666:FG=1; max-age=946080000; expires=Wed, 11-Dec-41 17:18:17 GMT; domain=.baidu.com; path=/; version=1 
P3P: CP=" OTI DSP COR IVA OUR IND COM " 
Date: Mon, 19 Dec 2011 17:18:17 GMT 
Server: Apache 
P3P: CP=" OTI DSP COR IVA OUR IND COM " 
P3P: CP=" OTI DSP COR IVA OUR IND COM " 
P3P: CP=" OTI DSP COR IVA OUR IND COM " 
Set-Cookie: BAIDUID=26FD0CB5389BF4699C447982D8080239:FG=1; expires=Wed, 11-Dec-41 17:18:17 GMT; max-age=946080000; path=/; domain=.baidu.com; version=1 
Set-Cookie: BAIDUID=26FD0CB5389BF4698191E4134CACEA29:FG=1; expires=Wed, 11-Dec-41 17:18:17 GMT; max-age=946080000; path=/; domain=.baidu.com; version=1 
Set-Cookie: BDUSS=dTajkzWTFWR3hXT3Jsc09LdkNsZ011YlZka340VWtqNkZzbW0tUTdOUFp-aFpQQVFBQUFBJCQAAAAAAAAAAAouTSCLkioVaXRpYW5kYXRlc3QxAAAAAAAAAAAAAAAAAAAAAAAAAADgmoV5AAAAAOCahXkAAAAAuWZCAAAAAAAxMC42NS40NNlx707Zce9OWT; expires=Tue, 01 Jan 2030 00:00:00 GMT; path=/; domain=.baidu.com 
Set-Cookie: PTOKEN=16ba4a120f070f3cc759a817981c2516; expires=Tue, 01 Jan 2030 00:00:00 GMT; path=/; domain=passport.baidu.com; HttpOnly 
Set-Cookie: STOKEN=fda94395cd4ae4661cefd3a4017a8454; expires=Tue, 01 Jan 2030 00:00:00 GMT; path=/; domain=passport.baidu.com 
Set-Cookie: USERID=626167789a799e630e60fb27466fa80e; expires=Tue, 01 Jan 2030 00:00:00 GMT; path=/; domain=.baidu.com 
Content-Type: text/html;charset=gbk 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Encoding: none 
Content-Length: 850 
Connection: close

OK,登陆成功。
本文来自: itianda's blog
Python 相关文章推荐
python基础教程之循环介绍
Aug 29 Python
Python实现八大排序算法
Aug 13 Python
django轻松使用富文本编辑器CKEditor的方法
Mar 30 Python
分享一下如何编写高效且优雅的 Python 代码
Sep 07 Python
Python使用matplotlib填充图形指定区域代码示例
Jan 16 Python
Django 忘记管理员或忘记管理员密码 重设登录密码的方法
May 30 Python
Python实现微信小程序支付功能
Jul 25 Python
Python startswith()和endswith() 方法原理解析
Apr 28 Python
python实现发送带附件的邮件代码分享
Sep 22 Python
python基于pygame实现飞机大作战小游戏
Nov 19 Python
python图片灰度化处理的几种方法
Jun 23 Python
Python Matplotlib库实现画局部图
Nov 17 Python
写了个监控nginx进程的Python脚本
May 10 #Python
400多行Python代码实现了一个FTP服务器
May 10 #Python
使用PYTHON接收多播数据的代码
Mar 01 #Python
使用PYTHON创建XML文档
Mar 01 #Python
基于python的汉字转GBK码实现代码
Feb 19 #Python
python 装饰器功能以及函数参数使用介绍
Jan 27 #Python
Python常见文件操作的函数示例代码
Nov 15 #Python
You might like
PHP 彩色文字实现代码
2009/06/29 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
2019/07/01 PHP
php源码的使用方法讲解
2019/09/26 PHP
php7连接MySQL实现简易查询程序的方法
2020/10/13 PHP
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
js实现iframe动态调整高度的代码
2008/01/06 Javascript
JS解密入门 最终变量劫持
2008/06/25 Javascript
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
浅析js中取绝对值的2种方法
2013/07/09 Javascript
js截取字符串的两种方法及区别详解
2013/11/05 Javascript
javascript闭包传参和事件的循环绑定示例探讨
2014/04/17 Javascript
js实现上传图片预览的方法
2015/02/09 Javascript
浅谈jQuery的offset()方法及示例分享
2015/07/17 Javascript
javascript的理解及经典案例分析
2016/05/20 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
BootStrap selectpicker后台动态绑定数据的方法
2017/07/28 Javascript
JavaScript 隐性类型转换步骤浅析
2018/03/15 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
echarts设置图例颜色和地图底色的方法实例
2018/08/01 Javascript
Vue实现本地购物车功能
2018/12/05 Javascript
微信小程序template模版的使用方法
2019/04/13 Javascript
vue实现点击按钮下载文件功能
2019/10/11 Javascript
python: 自动安装缺失库文件的方法
2018/10/22 Python
matplotlib实现区域颜色填充
2019/03/18 Python
Python 离线工作环境搭建的方法步骤
2019/07/29 Python
基于Python脚本实现邮件报警功能
2020/05/20 Python
销售行业个人求职自荐信
2013/09/25 职场文书
护士自我评价范文
2014/01/25 职场文书
社区母亲节活动方案
2014/03/05 职场文书
出国留学计划书
2014/04/27 职场文书
优秀团干部个人事迹
2014/05/29 职场文书
党员干部公开承诺书范文
2015/04/27 职场文书
实习单位意见
2015/06/04 职场文书
2015年“我们的节日·中秋节”活动总结
2015/07/30 职场文书
环保建议书范文
2015/09/14 职场文书
python中pandas对多列进行分组统计的实现
2021/06/18 Python