博客园 OpenAPI文档:https://api.cnblogs.com/help
我们在调用博客园相关api时,一般先要获取到token
关于token的获取,官方提供了2种方式:Client_Credentials授权 和 Authorization_Code授权
Client_Credentials授权比较简单,只需要根据申请到的client_id
和client_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了~