免费好用的天气服务 - Tuya(结尾附视频)(上)

简介: 免费好用的天气服务 - Tuya(结尾附视频)(上)

一、涂鸦loT

小编近来想着搜罗一些可以为网站添加基础服务的平台,逛着逛着就发现了好东西~

第一次用这个平台,主要是智能设备和硬件的开发,同时也支持普通的云开发,于是乎写了一个小案例尝试了一下,也算是自己做一个记录。

1. 免费额度

0元用户每个月会赠送3万次API调用14万条消息订阅,设备上限是50,自己玩耍是绝对够用了。

2. 注册认证

打开官网:https://www.tuya.com/cn/进行注册,然后进入平台。

然后按照如下步骤完成实名认证就可以开始创建项目了。

二、开发准备

1. 项目创建

在项目管理界面创建一个新的项目,学习测试阶段服务行业可以自定义选择,数据中心也可以选择多个,这代表了项目所支持的权限,可以在创建完成后修改。

2. 项目详情

在项目详情中需要收集两个关键的信息:Client IDSecret

3. 添加服务

点击我的服务按钮来添加服务,比如本案例需要用到天气服务位置服务,都可以免费使用。

第一次使用需要进入到服务详情页进行开通,如下:

在开通后,如果需要在其他项目中使用,可以在已授权项目下进行添加,在进行接口测试前也请先检查对应的服务是否授权给了当前项目。

Tips:开通服务时请注意浏览器是否开启了限制窗口弹出,否则可能看不到开通界面。

4. 接口测试

点击云开发菜单当中的API调试可以进入到在线调试界面,可以按照以下的步骤进行。

Tips:请根据当前网络环境选择对应的数据中心,否则会出现跨域问题。

三、认证工具

1. 签名机制

小编试了一下这个平台的接口,安全性是比较高的,所以先要了解一下签名算法。令牌(token)管理业务管理也有不同的签名算法,但整体过程相似,文档链接:签名机制

不过不用担心,小编在掉了几把头发之后已经帮大家写好了工具代码,大家可以直接使用。

2. Postman调试

除了在线方式调试API以外,大家一般都会选择使用Postman工具来测试,这里大家可以直接下载官方为大家准备的API接口包:Postman调用API

下载文档中的两个文件,根据步骤导入。

  • 设置Postman环境变量
  • url:对应的数据中心地址 - 接入地址列表
  • client_id:项目详情页获取
  • secret:项目详情页获取

  • 本地接口调试

设置好环境变量后,就可以使用官方提供的接口案例进行调试。大家也可以根据案例的格式自己新建请求,需要留意Headers中环境变量的引入方式以及Pre-request Script中的内容。

其中Pre-request Script中实现了签名的计算方法,大家感兴趣可以自己理解一下。

3. js工具

在项目中实现签名算法时,大家可以根据Pre-request Script进行改写,小编已经帮大家进行了整理,可以满足最基本的使用,只需要替换自己的Client IDSecret就可以使用。

// 根据所在地点设置数据中心地址
// 国内使用替换为 -> https://openapi.tuyacn.com
var host = "https://openapi-ueaz.tuyaus.com";
// clientId 和 secret 进入到项目详情页获取,请自行替换
var clientId = "替换为自己的clientId";
var secret = "替换为自己的secret";
// 接口请求类型
var httpMethod = "GET";
// sign加密方式
var sign_method = "HMAC-SHA256";
// 设置ajax为同步(根据需要)
$.ajaxSetup({
  async: false
});
// 将参数键值对解析为json对象
function toJsonObj(params, arr, map) {
  var datas = params.split('&');
  var obj = {};
  for (var item of datas) {
    var data = item.split("=");
    arr.push(data[0]);
    map[data[0]] = data[1];
  }
}
// 获取sign字符串,为最简形式,可根据需要修改
function stringToSign(query, path, method, secret) {
  var sha256 = "";
  var url = "";
  var headersStr = "";
  var map = {};
  var arr = [];
  var bodyStr = "";
  if (query) {
    toJsonObj(query, arr, map);
  }
  sha256 = CryptoJS.SHA256(bodyStr);
  arr = arr.sort();
  arr.forEach(function(item) {
    url += item + "=" + map[item] + "&";
  })
  if (url.length > 0) {
    url = url.substring(0, url.length - 1);
    url = "/" + path + "?" + url;
  } else {
    url = "/" + path;
  }
  var map = {};
  map["signUrl"] = method + "\n" + sha256 + "\n" + headersStr + "\n" + url;
  map["url"] = url;
  return map;
}
// 计算sign:令牌相关操作调用
function calcSignToken(timestamp, signStr, secret) {
  var str = clientId + timestamp + signStr;
  var hash = CryptoJS.HmacSHA256(str, secret);
  var hashInBase64 = hash.toString();
  var signUp = hashInBase64.toUpperCase();
  return signUp;
}
// 计算sign:业务相关操作调用
function calcSignService(accessToken, timestamp, signStr, secret) {
  var str = clientId + accessToken + timestamp + signStr;
  var hash = CryptoJS.HmacSHA256(str, secret);
  var hashInBase64 = hash.toString();
  var signUp = hashInBase64.toUpperCase();
  return signUp;
}
// 获取sign:请求令牌相关接口时调用
function getSignToken(timestamp, query, path) {
  var signMap = stringToSign(query, path, httpMethod, secret);
  var urlStr = signMap["url"];
  var signStr = signMap["signUrl"];
  var sign = calcSignToken(timestamp, signStr, secret);
  return sign;
}
// 获取sign:请求业务相关接口时调用
function getSignService(accessToken, query, path) {
  var signMap = stringToSign(query, path, httpMethod, secret);
  var urlStr = signMap["url"];
  var signStr = signMap["signUrl"];
  var sign = calcSignService(accessToken, timestamp, signStr, secret);
  return sign;
}
// 获取token:简单模式
function getToken() {
  var query = "grant_type=1";
  var path = "v1.0/token";
  var timestamp = new Date().getTime();
  var settings = {
    "url": "https://openapi-ueaz.tuyaus.com/v1.0/token?grant_type=1",
    "method": "GET",
    "timeout": 0,
    "headers": {
      "client_id": clientId,
      "sign": getSignToken(timestamp, query, path),
      "t": timestamp,
      "sign_method": sign_method
    }
  };
  var accessToken = "";
  $.ajax(settings).done(function(response) {
    accessToken = response.result.access_token;
  });
  return accessToken;
}

以上代码可以复制到项目中直接使用,大家可以通过调用getToken()方法来直接获取token,这是请求其他接口所需的参数。调用其他接口时的签名计算方法大家可以直接查看案例,为了使加密方法正常工作需要手动引入CryptoJS的core.jshmac.jssha256.js,大家可以到文章结尾的项目源码中一并下载。

目录
相关文章
|
安全
阿里云短信服务是可以发送包含下载链接的文本内容的,
阿里云短信服务是可以发送包含下载链接的文本内容的,但是需要注意以下几点:
690 1
|
8月前
|
机器学习/深度学习 人工智能 自然语言处理
如何使用ChatGPT制作免费的数字人
如何使用ChatGPT制作免费的数字人
151 0
|
2月前
|
API
天气预报15日-墨迹天气-地址查询版免费API接口教程
该接口提供15日天气预报服务,通过指定地址获取墨迹天气预报。支持POST或GET请求,需提供用户ID、KEY、省份名称及地点等参数。返回数据包括15天内每天的天气详情,如最高最低温度、天气变化及图标等。示例中使用的ID和KEY为公共测试账号,建议使用个人账号以获得更高调用频率。
|
3月前
|
设计模式 安全 Swift
探索iOS开发:打造你的第一个天气应用
【9月更文挑战第36天】在这篇文章中,我们将一起踏上iOS开发的旅程,从零开始构建一个简单的天气应用。文章将通过通俗易懂的语言,引导你理解iOS开发的基本概念,掌握Swift语言的核心语法,并逐步实现一个具有实际功能的天气应用。我们将遵循“学中做,做中学”的原则,让理论知识和实践操作紧密结合,确保学习过程既高效又有趣。无论你是编程新手还是希望拓展技能的开发者,这篇文章都将为你打开一扇通往iOS开发世界的大门。
|
2月前
|
API
查词语字典[38万词库]免费API接口教程
此接口用于查询指定词语的解释信息。支持POST或GET请求,需提供用户ID、用户KEY及待查询词语(URL编码)。返回状态码、信息提示及词语释义。示例中ID与KEY为公共账号,建议使用个人账号以享受更高调用频率。
|
5月前
|
数据采集 Python
[python]爬取手机号码前缀和地区信息
[python]爬取手机号码前缀和地区信息
|
8月前
|
存储 数据处理 数据安全/隐私保护
百度搜索:蓝易云【Python语言中while循环的应用举例】
以上是一些使用while循环的常见应用举例。通过while循环,你可以实现重复执行特定代码块的逻辑,直到满足退出条件。
80 0
|
开发工具
百度搜索:蓝易云【Debian12.0.0更换系统语言中文到英文教程。】
请注意,更改系统语言可能需要一些时间进行重新配置和下载语言相关的文件。在执行这些步骤之前,请确保已备份重要的数据和配置文件,以防万一需要恢复到先前的设置。
182 0
|
数据可视化
免费好用的天气服务 - Tuya(结尾附视频)(下)
免费好用的天气服务 - Tuya(结尾附视频)(下)
110 0
|
存储 Python
如何用str.format()批量生成网址【以豆瓣读书为例】
如何用str.format()批量生成网址【以豆瓣读书为例】
102 0
如何用str.format()批量生成网址【以豆瓣读书为例】