OneNet_token.py 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import base64
  2. import hmac
  3. import time
  4. from urllib.parse import quote
  5. # base64 无法导入microPython,因为文件过大(5M),esp8266只有8Mflash空间
  6. # 因此要计算好之后再加入到嵌入式设备
  7. def cal_token(id, access_key): # 官方文档给出的核心秘钥计算算法
  8. version = '2018-10-31'
  9. res = 'products/%s' % id # 通过产品ID访问产品API
  10. # 用户自定义token过期时间:一年后过期
  11. et = str(int(time.time()) + 31536000)
  12. # 签名方法,支持md5、sha1、sha256
  13. method = 'sha1'
  14. # 对access_key进行decode
  15. key = base64.b64decode(access_key)
  16. # 计算sign
  17. org = et + '\n' + method + '\n' + res + '\n' + version
  18. sign_b = hmac.new(key=key, msg=org.encode(), digestmod=method)
  19. sign = base64.b64encode(sign_b.digest()).decode()
  20. # value 部分进行url编码,method/res/version值较为简单无需编码
  21. sign = quote(sign, safe='')
  22. res = quote(res, safe='')
  23. # token参数拼接
  24. token = 'version=%s&res=%s&et=%s&method=%s&sign=%s' % (
  25. version, res, et, method, sign)
  26. return token
  27. if __name__ == '__main__':
  28. PRO_ID = "522417" #产品ID
  29. accesskey = "dgEP7iOL2/1kVNc1ykDvIhXSVqhb0tLnKinjU2RYpDs=" # 设备秘钥
  30. password = cal_token(PRO_ID, accesskey)
  31. print(password)