zoukankan      html  css  js  c++  java
  • Flask 微博三方登录

    1.进入微博开发平台(https://open.weibo.com/),注册账号,填写开发者信息

    2.创建应用。创建应用完成后,可以在“我的应用 - 应用信息”中查看您所创建应用的APPKEY及APPSECRET,请妥善保管您的这些信息,这将 成为您调用微博开放平台各API的身份标志,如下图所

    weibo.py

    #coding:utf-8
    
    # 引导用户授权地址
    authorize_url = 'https://api.weibo.com/oauth2/authorize'
    
    #应用 App Key:
    client_id = 'App Key'
    #应用 App Secret
    client_secret = 'App Secret'
    #App Key  App Secret可在应用的详情信息中找到
    
    #回调地址,线上地址
    redirect_uri= 'http://47.107.66.196/bindemail/'
    #获取用户access_token地址
    access_token_url = 'https://api.weibo.com/oauth2/access_token'
    #获取用户信息的 url
    info_url = 'https://api.weibo.com/2/users/show.json'
    
    

    三方登录

    1.  引导需要授权的用户到如下地址,进行登陆授权:

    <a class="ui circular red big weibo icon button" href="{{ url_for("front.weibo_login") }}">

    视图函数:views.py

    @bp.route('/weibo_login/')
    def weibo_login():
        url = weibo.authorize_url+'?client_id={client_id}&redirect_uri={redirect_uri}'
            .format(client_id=weibo.client_id,redirect_uri=weibo.redirect_uri)
        return redirect(url)

     进入到授权页面:

     授权成功,返回回调的地址:redirect_uri

    返回数据

    返回值字段 字段类型 字段说明
    code string 用于第二步调用oauth2/access_token接口,获取授权后的access token。
    state string 如果传递参数,会回传该参数。

     2. 获取授权过的Access Token

    URL

    https://api.weibo.com/oauth2/access_token

    HTTP请求方式

    POST

    请求参数

      必选 类型及范围 说明
    client_id true string 申请应用时分配的AppKey。
    client_secret true string 申请应用时分配的AppSecret。
    grant_type true string 请求的类型,填写authorization_code

    grant_type为authorization_code时

      必选 类型及范围 说明
    code true string 调用authorize获得的code值。
    redirect_uri true string 回调地址,需需与注册应用里的回调地址一致。

    我的代码:

    @bp.route('/bindemail/',methods=['GET','POST'])
    def bindemail():
        if request.method == 'GET':
            code = request.args.get('code')
            if code:
                url = weibo.access_token_url + '?client_id={client_id}&client_secret={client_secret}&code={code}&redirect_uri' 
                                         '={redirect_uri}'.format(client_id=weibo.client_id, client_secret=weibo.client_secret,
                                                                  redirect_uri=weibo.redirect_uri, code=code)
                page = requests.post(url)
    返回值字段 字段类型 字段说明
    access_token string 用户授权的唯一票据,用于调用微博的开放接口,同时也是第三方应用验证微博用户登录的唯一票据,第三方应用应该用该票据和自己应用内的用户建立唯一影射关系,来识别登录状态,不能使用本返回值里的UID字段来做登录识别。
    expires_in string access_token的生命周期,单位是秒数。
    remind_in string access_token的生命周期(该参数即将废弃,开发者请使用expires_in)。
    uid string 授权用户的UID,本字段只是为了方便开发者,减少一次user/show接口调用而返回的,第三方应用不能用此字段作为用户登录状态的识别,只有access_token才是用户授权的唯一票据。

     3.获取用户信息

    URL

    https://api.weibo.com/2/users/show.json

    支持格式

    JSON

    HTTP请求方式

    GET

    是否需要登录


    关于登录授权,参见 如何登录授权

    访问授权限制

    访问级别:普通接口
    频次限制:是
    关于频次限制,参见 接口访问权限说明

    请求参数

      必选 类型及范围 说明
    access_token true string 采用OAuth授权方式为必填参数,OAuth授权后获得。
    uid false int64 需要查询的用户ID。
    screen_name false string 需要查询的用户昵称。

    注意事项

    • 参数uid与screen_name二者必选其一,且只能选其一;
    • 接口升级后,对未授权本应用的uid,将无法获取其个人简介、认证原因、粉丝数、关注数、微博数及最近一条微博内容

     我的代码:

    info_data = requests.get(weibo.info_url + '?access_token={access_token}&uid={u_id}'.format(
                        u_id=uid, access_token=access_token))
                    infodats = info_data.text
                    info = json.loads(infodats)
                    return render_template('front/bind_email.html', ads=ads,info=info,uid=uid)

    我的项目bindemail  视图函数代码:

    #bindemail  判断用户是否绑定网站邮箱,没有绑定则绑定(相当于第一次登陆,需要绑定邮箱)。绑定了则回到首页
    @bp.route('/bindemail/',methods=['GET','POST'])
    def bindemail():
        if request.method == 'GET':
            ads = AdvertisementModel.query.all()
            code = request.args.get('code')
            if code:
                url = weibo.access_token_url + '?client_id={client_id}&client_secret={client_secret}&code={code}&redirect_uri' 
                                         '={redirect_uri}'.format(client_id=weibo.client_id, client_secret=weibo.client_secret,
                                                                  redirect_uri=weibo.redirect_uri, code=code)
                page = requests.post(url)
                if page.status_code == 400:
                    return render_template('front/index.html')
                data = page.text
                access_token = eval(data)['access_token']
                uid = eval(data)['uid']
                have_u = FrontUserModel.query.filter_by(weibo_id=uid).first()
                session['access_token']=access_token
                session['uid']=uid
                if have_u:
                    session[config.FRONT_USER_ID] = have_u.id
                    return redirect(url_for('front.index'))
                if access_token and uid:
                    info_data = requests.get(weibo.info_url + '?access_token={access_token}&uid={u_id}'.format(
                        u_id=uid, access_token=access_token))
                    infodats = info_data.text
                    info = json.loads(infodats)
                    return render_template('front/bind_email.html', ads=ads,info=info,uid=uid)
            return render_template('front/index.html')
        else:
            form = BindWeiboForm(request.form)
            if form.validate():
                email = form.email.data
                gender = request.form.get('gender')
                uid = request.form.get('uid')
                weibo_desc = request.form.get('weibo_desc')
                avatar = request.form.get('avatar')
                nickname = request.form.get('nickname')
                user = FrontUserModel.query.filter_by(email=email).first()
                if user:
                    return restful.params_error(message='此邮箱已经被绑定,请换个邮箱再试~')
                u = FrontUserModel(email=email,avatar=avatar,password=' ',nickname=nickname,gender=gender,signature=weibo_desc,weibo_id=uid)
                db.session.add(u)
                db.session.commit()
                session[config.FRONT_USER_ID] = u.id
                return restful.success(data=u.id)
            else:
                return restful.params_error(get_error(form))

     三方登录十分简单,调用时注意传入正确参数即可 。QQ登陆,微信登陆的套路都一样。

    官方文档:https://open.weibo.com/wiki/Connect/login

     如果我的文章有帮到你,欢迎给我的这个网站star  https://github.com/1417766861/mycms

  • 相关阅读:
    R-CNN学习笔记
    Numpy和Pandas
    用python解决打标签时将xml文件的标签名打错
    爬虫Ⅱ:scrapy框架
    爬虫Ⅰ:爬虫的基础知识
    Linux学习笔记
    MySql笔记Ⅱ
    MySql笔记Ⅰ
    Qt数据库报错:“Unable to execute statement”
    Qt数据库报错“out of memory Error opening database“
  • 原文地址:https://www.cnblogs.com/donghaoblogs/p/10389693.html
Copyright © 2011-2022 走看看