Python3 实现HTTP基本认证的方法

基础版:

#! /usr/bin/env python
# -*-coding:utf-8-*-

import re
import sys
import base64
import urllib2

class BasicAuth:
    def __init__(self, username, password, realm=''):
        base_str = "%s:%s" % (username,password)
        base_str = "Basic " + base64.encodestring(base_str)[:-1]
        self.authline = base_str    
        self.realm = realm
        #print self.authline

    def visit(self, the_url):
        req = urllib2.Request(the_url)
        try:
            content = urllib2.urlopen(req)
        except IOError,e:
            #here we *want* fail
            pass
        else:
            print "This page isn't protected by authentication."
            sys.exit(1)

        if not hasattr(e, 'code') or e.code != 401:
            #we got an error - but not a 401 error
            print "This page isn't protected by authentication."
            print 'But we fail for another reason'
            sys.exit(1)

        authline = e.headers['www-authenticate']
        print authline
     #print e.headers
        authobj = re.compile( r'''(?:\s*www-authenticate\s*:)?\s*(\w*)\s+realm=['"]([^'"]+)['"]''',re.IGNORECASE)
        matchobj = authobj.match(authline)
        if not matchobj:
            print 'The authentication header is badly formed.'
            print authline
            sys.exit(1)
        scheme = matchobj.group(1)
        realm = matchobj.group(2)
        if scheme.lower() != 'basic':
            print 'This example only work with BASIC authentication.'
            sys.exit(1)

        req.add_header("Authorization", self.authline)
        try:
            handle = urllib2.urlopen(req)
        except IOError,e:
            print "It looks like the username or password is wrong."
            sys.exit(1)
        thepage = handle.read()
        return thepage

if __name__ == "__main__":
    ba = BasicAuth('admin', 'admin')
    content = ba.visit("http://192.168.1.1/images/logo.jpg")    #路由器管理页面通常采用基本认证法进行身份认证
    with open('logo.jpg', 'w') as f:
        f.write(content)

升级版:

#! /usr/bin/env python
# -*-coding:utf-8 -*-

import urllib2

theurl = 'http://192.168.1.1'
username = 'admin'
password = 'admin'

passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, theurl, username, password)
authhandler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(authhandler)
urllib2.install_opener(opener)

pagehandle = urllib2.urlopen('http://192.168.1.1/images/logo.jpg')
#with open('tplogo.jpg', 'w') as f:
    #f.write(pagehandle.read())

终极版:

import requests

r = requests.get('http://192.168.0.1/',auth=('admin','admin'))

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值