decode函数_「实践」云函数 + API,你也可以做个天气信息系统
为什么要把云函数 SCF 与 API 网关进行结合?本文告诉你答案!
通常,我们用云函数 SCF 写一个函数应用,这个应用可能多种多样。例如之前介绍过的 OJ 系统判题功能,通过 NLP 实现文本摘要功能......,那么,怎么把这些功能简单快速地结合到我们的项目中,尤其是 Web 项目中呢?
本文通过一个简单小例子实现云函数 SCF 与 API 网关的结合,希望能给到大家一个参考。
▎任务说明
通过云函数 SCF 编写两个爬虫程序,分别是通过 IP 地址获得 IP 归属地信息、通过地址获得天气预报信息等。通过 API 网关作为触发器,实现一个简单的对外接口。
该功能主要作用是作为网站的一个接口,保证用户访问网站时,可以在适当的位置看到今天本地区的天气信息。
▎任务流程
▎爬虫实现
爬虫 1 实现:获得 IP 地址
搜索 IP 地址,可以看到这样一个小工具:
输入 IP 地址,点击查询可以获得到地址信息。通过抓包可以获得 API:
https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=113.57.215.184&co=&resource_id=6006&t=1559922221313&ie=utf8&oe=gbk&cb=op_aladdin_callback&format=json&tn=baidu&cb=jQuery110205516131051897397_1559921486295&_=1559921486372
结果如下:
对地址进行简化:
https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=113.57.215.184&resource_id=6006&format=json
简化后结果成为 Json 形式:
编写 Python 代码实现:
import urllib.request
import ssl
import json
ssl._create_default_https_context = ssl._create_unverified_context
location_temp = json.loads(urllib.request.urlopen("https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=113.57.215.184&resource_id=6006&format=json").read().decode("gbk"))["data"][0]["location"]
location = location_temp.split(" ")[0] if " " in location_temp else location_temp
print(location)
运行结果:
爬虫 2 实现:获取天气
搜索天气,可以得到:
对页面分析,我们可以看到天气信息在网页源码中可以提现:
也就是说,我们可以通过简单的页面分析,就能获得到天气数据:
import urllib.request
import urllib.parse
url = "http://www.baidu.com/s?wd=" + urllib.parse.quote("湖北省武汉市天气")
page_source = urllib.request.urlopen(url).read().decode("utf-8").replace("n", "").replace("r", "")
weather = page_source.split('<p class="op_weather4_twoicon_weath"')[1].split('title="">')[1].split('</p>')[0].strip()
temp = page_source.split('<p class="op_weather4_twoicon_temp">')[1].split('</p>')[0].strip()
print(weather,temp)
运行结果:
▎云函数 API 网关触发器
新建云函数:
保存之后,在测试的时候,选择 API 网关作为触发器,进行测试:
测试之后,可以看到结果,便于我们进行基本分析:
经过分析可以看到 Event 中有:
所以,我们可以获得这个 IP 地址:
# -*- coding: utf8 -*-
import json
def main_handler(event, context):print(event["requestContext"]["sourceIp"])
运行结果:
▎代码整合
# -*- coding: utf8 -*-
import json, ssl
import urllib.request
import urllib.parsessl._create_default_https_context = ssl._create_unverified_contextdef get_loaction(ip):location_temp = json.loads(urllib.request.urlopen("https://sp0.baidu.com/8aQDcjqpAAV3otqbppnN2DJv/api.php?query=" + ip + "&resource_id=6006&format=json").read().decode("gbk"))["data"][0]["location"]return location_temp.split(" ")[0] if " " in location_temp else location_tempdef get_weather(address):url = "http://www.baidu.com/s?wd=" + urllib.parse.quote(address + "天气")page_source = urllib.request.urlopen(url).read().decode("utf-8").replace("n", "").replace("r", "")weather = page_source.split('<p class="op_weather4_twoicon_weath"')[1].split('title="">')[1].split('</p>')[0].strip()temp = page_source.split('<p class="op_weather4_twoicon_temp">')[1].split('</p>')[0].strip()return {"weather": weather, "temp": temp}def main_handler(event, context):return get_weather(get_loaction(event["requestContext"]["sourceIp"]))
测试结果:
▎结合 API 网关
选择 API 网关:
在与云函数相同区域,建立:
保存之后会提示我们进行 API 配置:
点击新建:
因为本文仅是做一个简单的 Demo。所以此处我们只进行简单配置,例如鉴权等都选择了免鉴权,但是在实际中还是推荐大家,进行鉴权,这样更安全,也避免资源被盗用等,除此之外,其他各个参数都需要根据自己需求而定:
配置完成之后,发布测试环境进行测试:
测试发布完成之后,我们通过浏览器进行一下简单测试:
复制地址,并添加我们之前的路径:
至此,我们就完成了一个 API 网关与 SCF 结合的小例子。
▎额外想说
云函数是一个函数级别的应用,我们可以将它应用在很多领域,例如 Web 开发、Iot 等。但是云函数本身自己很难完成一个功能,它需要和周边的产品配合,例如和 COS 配合实现图像压缩/加水印,本文则是说与 API 网关结合做一个获取天气的 HTTP 接口。其实大家还可以想一下,我们是不是可以通过 SCF 与 API 网关结合,实现一个 Web 后端呢?
以一个博客系统为例:
前端使用 Vue.js 等框架进行开发,所有的后端逻辑,包括数据库的增删改查、某些小功能点的实现,全部用云函数来实现?这样,我们只需要找一个虚拟空间或者腾讯云的 COS,就可以完成前端的部署,而后端的服务器配置、面对用户激增的服务器运维等,都交给云函数+相关产品来实现,是不是大大节约资源,降低成本呢?
总的来说,合理利用云函数,能够节约资源、降低成本、提高效率。
作者介绍:腾讯云高级研发工程师刘宇
推荐阅读:
Serverless 基本概念入门zhuanlan.zhihu.com
Serverless 的运行原理与组件架构zhuanlan.zhihu.com
Serverless 的开发者工具建设zhuanlan.zhihu.com
GitHub:
TencentCloud/serverlessgithub.com
欢迎关注:腾讯云 Serverless 团队
我们专注于 Serverless 架构的最佳实践!
decode函数_「实践」云函数 + API,你也可以做个天气信息系统相关推荐
- mysql时间戳diff函数_「timestampdiff」MySQL函数---TIMESTAMPDIFF - seo实验室
timestampdiff TIMESTAMPDIFF(Interval,datetime_expr1,datetime_expr2) 返回日期或日期时间表达式datetime_expr2- date ...
- python数学函数_「分享」关于Python整理的常用数学函数整理
原标题:「分享」关于Python整理的常用数学函数整理 1.函数说明 abs(number)返回数字的绝对值,如abs(-10)返回10 pow(x,y[,z]) 返回x的y次幂(所得结果对z取模), ...
- c++虚函数_「C++」对象模型和虚函数
普通成员函数跟着类 ,虚函数跟着对象 ①作为普通成员函数 class A{public:void print(){cout << " class A " << ...
- 微信小程序销毁某一注册函数_微信小程序云开发API 删除一条记录
Document.remove 删除一条记录 函数签名如下:function remove(options: object): Promise 参数说明 options 为必填参数,是一个如下格式的对 ...
- 身份验证错误错误指定的句柄无效_基于 Web 端的人脸识别身份验证「实践」
作者:沫沫 政采云前端团队 转发链接:https://mp.weixin.qq.com/s/fRDpXixnLIy9c0Uh2tMezQ 前言 近些年来,随着生物识别技术的逐渐成熟,基于深度学习的人脸 ...
- 不挂载 组件渲染_让你的 React 组件性能跑得再快一点「实践」
作者:天泽 转发链接:https://www.zoo.team/article/react-render 性能和渲染(Render)正相关 React 基于虚拟 DOM 和高效 Diff 算法的完美配 ...
- css grid随页面大小_前端开发中各种设置CSS间距的优点缺点及实例「实践」
前言 如果两个或多个元素很接近,那么用户就会认为它们以某种方式属于彼此.当对多个设计元素进行分组时,用户可以根据它们之间的空间大小来决定它们之间的关系.没有间距,用户将很难浏览页面并知道哪些内容相关而 ...
- php 动态彩码辨色 接口的调用_好用的云函数!后端低代码接口开发,零基础编写API接口...
前言 在开发项目过程中,经常需要用到API接口,实现对数据库的CURD等操作. 不管你是专业的PHP开发工程师,还是客户端开发工程师,或者是不懂编程但懂得数据库SQL查询,又或者是完全不太懂技术的人, ...
- .net vue漂亮登录界面_基于 electron-vue 开发的音乐播放器「实践」
作者:XiaoTuGou 转发链接:https://github.com/SmallRuralDog 前言 基于 electron-vue 开发的音乐播放器,界面模仿QQ音乐. 技术栈electron ...
最新文章
- access port 与portfast之间的关系
- SAP UI5 initialization error
- hash地址_redis中的hash扩容、渐进式rehash过程
- 逗比学树莓派之GPIO
- 【转】xp修复win7启动项方法
- 小程序之旅——第四站(模板框架)
- Java jar 如何防止被反编译
- 学生a3制图标题栏尺寸手绘_AutoCAD教程之绘制图框和标题栏
- 软激活WIN7 Activation
- 泛微oa系统什么框架_泛微OA办公系统是什么,怎么使用_使用方法_使用平台_企业服务汇...
- Unspeakable joy : rejoicing in early modern England【翻译】
- MATLAB 2018b 安装教程(图解)Mac Win Linux下均可安装
- rog主板php,强劲的扩展能力 - 华硕ROG Zenith Extreme主板评测:地表最强X399 - 超能网...
- 线扫描枪条码测试机程序,完整倍福PLC程序完整beckhoff倍福PLC ST 语言
- Unity Google Android登录接入
- RISC-V SiFiveU64内核——L2 Prefetcher预期器
- 【unity shader】基于UGUI字体的outline优化
- 关于BPSK的调制解调——matlab实现
- 搭建gataway所遇问题及解决
- 大学c语言毕业设计题目,关于毕业季的作文题目