python 读取飞书EHR个人信息
关于飞书,不做过多介绍,毕竟现在太火爆了。以至于下班的时候,在地铁以前看到都是用微信沟通,现在在下班的地铁上,随处可见使用飞书的同学。
最近公司也在使用飞书,打算做一个程序,在程序设计之初,要实现飞书免登录,在这个过程中,把走过的一些坑记录下,希望帮助有需要的同学。
应用免登概述
开放平台应用支持小程序、网页和机器人三种能力。小程序和网页可在应用中心打开。另外,网页还可在聊天框内点击链接打开,移动端内会启动 webview 承载应用网页,PC 端内会跳转到系统浏览器。
应用可通过开放平台身份验证能力获取用户身份,完成用户在应用中的登录流程。身份验证时,客户端内免登,浏览器上需要用户完成扫码登录或密码登录。当前,开放平台身份验证存在如下四种场景:
小程序免登
浏览器内网页登录
客户端内网页免登
应用管理后台免登
基于以上,可以实现效果如下:
具体实现过程:
auth.py
import logging
from urllib import parse
from flask import redirect, request
# const
# open api capability
AUTH_URI = "/open-apis/authen/v1/index"
USER_ACCESS_TOKEN_URI = "/open-apis/authen/v1/access_token"
APP_ACCESS_TOKEN_URI = "/open-apis/auth/v3/app_access_token/internal"
USER_INFO_URI = "/open-apis/authen/v1/user_info"
USER_INFO_URL_EXTEND = '/open-apis/contact/v3/users/'
USER_INFO_EHR=''
class Auth(object):
def __init__(self, lark_host, app_id, app_secret):
self.lark_host = lark_host
self.app_id = app_id
self.app_secret = app_secret
self._app_access_token = ""
self._user_access_token = ""
@property
def user_access_token(self):
return self._user_access_token
@property
def app_access_token(self):
return self._app_access_token
def authorize_user_access_token(self):
# get user_access_token, implemented based on Feishu open api capability. doc link: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/authen-v1/authen/access_token
self.authorize_app_access_token()
code = request.args.get("code")
url = self._gen_url(USER_ACCESS_TOKEN_URI)
headers = {
"Content-Type": "application/json",
"Authorization": "Bearer " + self.app_access_token,
}
req_body = {"grant_type": "authorization_code", "code": code}
response = requests.post(url=url, headers=headers, json=req_body)
Auth._check_error_response(response)
self._user_access_token = response.json().get("data").get("access_token")
def redirect(self, redirect_url):
# redirect to return authorization code, implemented based on Feishu open api capability. doc link: https://open.feishu.cn/document/ukTMukTMukTM/ukDNz4SO0MjL5QzM/get-
args = {"app_id": self.app_id, "redirect_uri": redirect_url}
# authorization url
redirect_auth_url = Auth._build_url_with_query_params(
self._gen_url(AUTH_URI), args
)
return redirect(redirect_auth_url)
def get_user_info(self):
# get user info, implemented based on Feishu open api capability. doc link: https://open.feishu.cn/document/uAjLw4CM/ukTMukTMukTM/reference/authen-v1/authen/user_info
url = self._gen_url(USER_INFO_URI)
headers = {
"Authorization": "Bearer " + self.user_access_token,
"Content-Type": "application/json",
}
response = requests.get(url=url, headers=headers)
Auth._check_error_response(response)
return response.json().get("data")
#get user extend info By 用户获取用户更多数据,方便填写信息时候落入本地数据库;
def get_user_info_extend(self,userid):
url = self._gen_url(USER_INFO_URL_EXTEND)
headers = {
"Authorization": "Bearer " + self.user_access_token,
"Content-Type": "application