Python模拟百度登录实例代码

本来写这个玩意儿是想用来自动登录百度,然后根据贴吧内的的排名抓取会员头像的,比如生成一个贴吧千人头像图或万人头像图。也算是练练手。
完成后才发现抓那个贴吧排名完全不需要登录…也好,以后用来做自动一键签到(经常忘打卡),抢二楼什么的,也不错~~
如今在博客上发个文章用不了多长时间就被抄走了,感觉自己能做的也只有在此鄙视一下它们。
废话太多,容易招人恨,以下是代码:

#-*- coding:gbk -*-
#
# 模拟百度登录 for Python2.7
# 其中显示验证码部分 需要使用PIL库
# 需要验证码时,会创建一个Tkinter窗口,用于显示和输入验证码,回车后窗口关闭。

#
import urllib, urllib2, cookielib, re, time
username   = 'yourusernamehere' #用户名
password   = 'yourpasswordhere' #密码
cookiefile = '--login-baidu--'  #cookie文件
#模拟header信息
headers = {
        "Host":"passport.baidu.com",
        "Referer":"http://www.baidu.com/cache/user/html/login-1.2.html",
        "User-Agent":"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.124 Safari/537.36",
        "Origin":"http://www.baidu.com",
        """yufang xiao tou.  this code by zhengxiao(www.zh30.om)"""
        "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
        "Cache-Control":"max-age=0",
        "Connection":"keep-alive"   
        }
cookie = cookielib.MozillaCookieJar(cookiefile)
#尝试加载cookie文件并验证有效性
try:
    cookie.load(ignore_discard=True, ignore_expires=True)
    print '读取登录状态的cookie成功'
    #do something...
    
except Exception:
    #cookie不存在或无效时 开始进行模拟登录并重新生成cookie文件
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
    loginUrl = 'http://www.baidu.com/cache/user/html/login-1.2.html'
    getTokenUrl = 'https://passport.baidu.com/v2/api/?getapi&class=login&tpl=mn&tangram=true' """www . zh30 . com """
    getCodeStringUrl = 'https://passport.baidu.com/v2/api/?logincheck&callback=bdPass.api.login._needCodestringCheckCallback&tpl=mn&charset=UTF-8&index=0&username=' + username + '&isphone=false&time=1436429688644'
    loginPostUrl = 'https://passport.baidu.com/v2/api/?login'
    #获取BAIDUID、token
    request = urllib2.Request(loginUrl, headers=headers)
    response = opener.open(request)
    request = urllib2.Request(getTokenUrl, headers=headers)
    response = opener.open(request)
    hasToken = response.read()
    token = re.search(r'login_token\s*=\s*\'(.+?)\'',hasToken).group(1)
    
    #检查username是否需要验证码
    request = urllib2.Request(getCodeStringUrl, headers=headers)
    response = opener.open(request)
    getCodeString = response.read()
    codestring = re.search(r'"codestring":"?([^"]+)"?,', getCodeString).group(1)
    if codestring == 'null' :
        codestring = ''
        verifycode = ''
    else:
        #需要验证码 创建一个tk显示验证码 并提示用户输入
        genimageUrl = 'https://passport.baidu.com/cgi-bin/genimage?' + codestring + '&v=' + str(long(time.time()*1000))
        import io, Tkinter as tk
        from PIL import Image, ImageTk
        request = urllib2.Request(genimageUrl, headers=headers)
        image_bytes = opener.open(request).read()
        pil_image = Image.open(io.BytesIO(image_bytes))
        def presskey(event):
            global verifycode
            if event.keycode == 13:
                    verifycode = entry.get()
                    tk_root.destroy()
        tk_root = tk.Tk()
        tk_image = ImageTk.PhotoImage(pil_image)
        label1 = tk.Label(tk_root, text='您的帐号异常,需要输入验证码')
        label1.pack()
        label2 = tk.Label(tk_root, image=tk_image)
        label2.pack()
        label3 = tk.Label(tk_root, text='输入验证码并按回车确认')
        label3.pack()
        entry = tk.Entry(tk_root)
        entry.bind('<Key>', presskey)
        entry.pack()
        tk_root.mainloop()
    #构造登录表单
    data = {
            "ppui_logintime":"134198",
            "charset":"utf-8",
            "codestring":"",
            "isPhone":"false",
            "index":"0",
            "u":"",
            "safeflg":"0",
            "staticpage":"http://www.baidu.com/",
            "loginType":"1",
            "tpl":"mn",
            """yufang xiao tou.  this code by zhengxiao"""
            "callback":"parent.bdPass.api.login._postCallback",
            "mem_pass":"on"
    }
    data['token'] = token
    data['username'] = username
    data['password'] = password
    data['codestring'] = codestring
    data['verifycode'] = verifycode
    #开始登录
    req = urllib2.Request(loginPostUrl, urllib.urlencode(data), headers)
    result = opener.open(req).read()
    #验证登录结果
    
    errno = re.search(r'&error=(\d+)', result).group(1)
    if errno == '0':
        print '登录成功'
        cookie.save(ignore_discard=True,ignore_expires=True)
    elif errno == '4':
        print '登录失败:密码错误'
    elif errno == '257':
        print '登录失败:验证码错误'
    else:
        print '登录失败'
        print result #失败后 打印返回字符 by zh30.com

百度登录时,主要有四个步骤。
第一步:访问任意百度页面,得到名为BAIDUID的cookie
第二步:根据cookie去请求得到token(登录时要提交这个值)。
第三步:验证username是否需要验证码。返回值中如果存在codestring,说明需要验证码,然后根据这个codestring请求得到验证码。
第四步:提交登录表单,检查登录状态,记录cookie。判断登录是否成功,可以检查是否生成名为BDUSS的cookie,郑晓在这里判断的是返回字符串中的跳转链接,成功时error参数为0。
have fun!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索文件
python爬虫实例代码、appium实例代码python、python3爬虫实例代码、python 代码实例、python 3.4实例代码,以便于您获取更多的相关知识。

时间: 2024-09-10 20:39:18

Python模拟百度登录实例代码的相关文章

Python模拟新浪微博登录

看到一篇Python模拟新浪微博登录的文章,想熟悉一下其中实现方式,并且顺便掌握python相关知识点. 代码 下面的代码是来自上面这篇文章,并稍作修改添加了一些注释. # -*- coding: utf-8 -* import urllib2 import urllib import cookielib import lxml.html as HTML class Fetcher(object): def __init__(self, username=None, pwd=None, cook

Java Web用户登录实例代码_java

实现功能: 1.用户登陆.注销 2.利用session记录用户登陆信息 3.在JSP中展示已登陆用户信息 实现原理: 登陆后通过判断用户名和密码是否和存储的一致,如果一致,就把用户信息放到session中储存:如果不一致就提示信息,并且返回登陆页面. 显示信息页面上固定从session中找用户登陆信息,找到就显示用户信息,没找到就显示登陆框. 注销很简单,就是清空session信息. 主要文件: 1.LoginAction:struts2的Action类,用于处理JAVA端的主要登陆和登出逻辑.

PHP socket 模拟POST 请求实例代码_php技巧

我们用到最多的模拟POST请求几乎都是使用php curl来实现了,没考虑到PHP socket也可以实现,今天看到朋友写了一文章,下面我来给大家分享一下PHP socket模拟POST请求实例. 以前模拟post请求俺都用PHP curl扩展实现来着,没想过PHP socket也可以实现.最近翻了下相关资料才发现原来没有那么高深,只是以前一直没有完全理解post的原理和本质而已,其实就是发送给目的程序一个标志为post的协议串如下: POST /目的程序url HTTP/1.1 Accept:

PHP实现QQ登录实例代码_php实例

分享一段利用PHP实现QQ登陆的代码,原理是用curl模拟发送post登录,cookie保存本地,实现真正的3GQQ登陆.这里代码理论可以支持永久单挂QQ-真正做到免费挂qq哦. <?php function qqlogin(){ $qqno='这里填写QQ账号'; $qqpw='这里填写QQ密码'; $cookie = dirname(__FILE__).'/cookie.txt'; $post = array( 'login_url' => 'http://pt.3g.qq.com/s?s

Python实现端口复用实例代码_python

本文介绍Python实现端口复用实例如下所示: #coding=utf-8 import socket import sys import select import threading host='192.168.99.100' port=80 class Thread(threading.Thread): def __init__(self,buf,sockfd): threading.Thread.__init__(self) self.buf=buf self.sockfd=sockfd

Python操作Mysql数据库实例代码教程

实例1.取得MYSQL的版本 # -*- coding: UTF-8 -*-   #安装MYSQL DB for python import MySQLdb as mdb   con = None   try:     #连接mysql的方法:connect('ip','user','password','dbname')     con = mdb.connect('localhost', 'root', 'root', 'test');       #所有的查询,都在连接con的一个模块cu

php jquery ajax用户登录实例代码

php Jquery 无刷新登录,自己写的一个很简单的 加了一个判断就是如果是已经登录的,刷新后还是显示的登录状态 登录页面文件 html页面  代码如下 复制代码 <script type="text/javascript" src="jquery-1.4.3.js" mce_src="jquery-1.4.3.js"></script> <script type="text/javascript&quo

python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)_python

baiduclient.py 复制代码 代码如下: import urllib.parseimport gzipimport jsonimport refrom http.client import HTTPConnectionfrom htmlutils import TieBaParserimport httputils as utils # 请求头headers = dict()headers["Connection"] = "keep-alive"heade

php登录与退出登录实例代码

login.htm  代码如下 复制代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http