• 博客园api调用实例:获取授权码


    博客园 OpenAPI文档https://api.cnblogs.com/help

    我们在调用博客园相关api时,一般先要获取到token

    关于token的获取,官方提供了2种方式:Client_Credentials授权Authorization_Code授权

    Client_Credentials授权比较简单,只需要根据申请到的client_idclient_secret就可以拿到 access_token

    但是使用这种方式拿到的access_token调用个别接口时却无法调通(例如:获取当前登录用户信息),此时需要使用Authorization_Code授权拿到的access_token才行

    所以我需要通过Authorization_Code授权获取token,它的接口文档如下

    该接口有一个code参数,它是博客园的授权码,需要通过另一个接口获取:获取授权码

    下面讲一下如何获取授权码

    获取授权码

    接口文档如下

    刚开始我用requests在后台请求了这个接口,发现无法得到code

    详细说明中有写到:在浏览器中请求这个接口地址,会自动定向到博客园登陆页,登陆后会进入默认回调页

    所以在浏览器中输入这个接口地址,并拼接上参数,如下

    https://oauth.cnblogs.com/connect/authorize?client_id=5xxxxx3&scope=openid profile CnBlogsApi offline_access&response_type=code id_token&redirect_uri=https://oauth.cnblogs.com/auth/callback&state=abc&nonce=xyz

    登陆后就可以获得授权码了

     

    很明显这个结果我们无法通过接口拿到,它是在重定向到回调页面时,自动带上的code参数,应该从前端页面获取

    例行网上冲浪一番后,发现可以通过selenium来实现,用selenium来模拟前端登录然后拿到code

    传送门:https://q.cnblogs.com/q/133334/

    具体实现过程如下

    # coding: utf-8
    """
    author: hmk
    detail: 
    create_time: 
    """
    from selenium import webdriver
    from urlobject import URLObject
    from utils.read_conf import ConfigIni
    
    
    conf = ConfigIni()
    # print(conf["cn_blogs"]["client_id"])
    
    
    def get_code():
    
        driver = webdriver.Chrome()
    
        url = URLObject("https://oauth.cnblogs.com/connect/authorize").add_query_params(
            client_id=conf["cn_blogs"]["client_id"],
            scope="openid profile CnBlogsApi offline_access",
            response_type="code id_token",
            redirect_uri="https://oauth.cnblogs.com/auth/callback",
            state="abc",
            nonce="xyz"
        )
    
        # print(url)
    
        driver.get(url)
    
        driver.implicitly_wait(30)
    
        code = driver.find_element_by_id('code').text
        print(code)
        # print("当前获取到的博客园授权码code={}".format(code))
        return code
    
    
    if __name__ == '__main__':
        get_code()

    运行这个文件后,会自动打开chrome浏览器,然后跳到登录页面,你手动输入博客园账号密码登陆后,后端就会把code打印出来了

    因为每次调用get_code()函数时,selenium都会打开一个新的浏览器,然后需要你手动输入验证码,这样太不人性化了

    我们需要设置selenium不要每次都打开新的浏览器,直接调用已经打开的浏览器,这样手动登陆一次后就可以重复使用了

    关于如何设置这一块请参考如下博客:

    mac:https://blog.csdn.net/weixin_35757704/article/details/109274655

    windows:https://blog.csdn.net/weixin_41858542/article/details/84974356

    拿到code后,就可以获取博客园的token了~

  • 相关阅读:
    zoomer.for.jquery 图片效果(缩小、放大)
    简体、繁体字转换 Microsoft AppLocale 实用程序
    jquery图片效果(缩小放大)
    JQuery自动为表格增加一列
    HTTP 错误 403.9 禁止访问:连接的用户过多怎么办?
    控件数组
    apache服务无法启动
    枚举记录不同斜率值 set容器——pku3668
    分数最佳接近——pku3039
    01背包——[Usaco2008 Dec]Hay For Sale
  • 原文地址:https://www.cnblogs.com/hanmk/p/16771117.html
Copyright © 2020-2023  润新知