import base64
import hmac
import time
import requests
from hashlib import sha256
# 钉钉扫码登入
class DingScanningCodeLogin(object):
# 钉钉后台里的AppKey和AppSecret
def __init__(self, app_key, app_secret):
self.app_key = app_key
self.app_secret = app_secret
self.timestamp = str(int(round(time.time()))) + '000'
self.url_1 = "https://oapi.dingtalk.com/sns/getuserinfo_bycode"
self.url_2 = "https://oapi.dingtalk.com/gettoken"
self.url_3 = 'https://oapi.dingtalk.com/topapi/user/getbyunionid'
# tmp_auth_code是前端请求钉钉后回调在url上拼接的code
def get_user_according_to_sns_info(self, tmp_auth_code, url=None):
if not url:
url = self.url_1
signature = base64.b64encode(
hmac.new(self.app_secret.encode(encoding="utf-8"),
self.timestamp.encode(encoding="utf-8"),
digestmod=sha256).digest()).decode(encoding='utf-8')
params = {'accessKey': self.app_key, 'timestamp': self.timestamp, 'signature': signature}
d_data = requests.post(url=url, params=params, json={'tmp_auth_code': tmp_auth_code})
print(d_data)
if not int(d_data.json().get('errcode')) == 0:
raise Exception(d_data.json().get("errmsg"))
return d_data.json().get("user_info")
# 这里可以加一层redis缓存access_token
def get_access_token(self, url=None):
if not url:
url = self.url_2
params = {"appkey": self.app_key, "appsecret": self.app_secret}
d_data = requests.get(url=url, params=params)
if not int(d_data.json().get("errcode")) == 0:
raise Exception(d_data.json().get("errmsg"))
return {"access_token": d_data.json().get("access_token"), "expires_in": d_data.json().get("expires_in")}
def get_user_id(self, token, union_id, url=None):
if not url:
url = self.url_3
d_data = requests.post(url=url, params={'access_token': token}, json={'unionid': union_id})
if not int(d_data.json().get("errcode")) == 0:
raise Exception(d_data.json().get("errmsg"))
return d_data.json().get("result")
因为钉钉sdk调用一直无法请求,报校验失败换多次方法没解决,赶时间就没继续研究sdk源码。