专栏首页Tencent Serverless 官方专栏SCF与API网关:告知用户所在地天气信息
原创

SCF与API网关:告知用户所在地天气信息

首先想要说一下,为什么要把SCF与API网关进行结合?

我们通常用SCF写一个函数应用,这个函数应用可能多种多样,例如之前说的就包括OJ系统的判题功能,通过NLP实现文本摘要功能......,但是这些功能是做的,我们怎么把这些功能简单快速的结合到我们的项目中,尤其是Web项目中呢?本文就是通过一个简单的小例子实现SCF与API网关的结合,算作抛砖引玉,希望大家在自己的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.parse

ssl._create_default_https_context = ssl._create_unverified_context

def 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_temp

def 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,就可以完成前端的部署,而后端的服务器配置、面对用户激增的服务器运维等,都交给云函数+相关产品来实现,是不是大大节约资源,降低成本呢?

总结来说,合理利用云函数,节约资源、降低成本、提高效率。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 为Python云函数打包依赖

    在使用无服务器云函数(SCF)的时候通常会遇到导入第三方库的时候,这个时候很多小伙伴就比较头疼:我如何打包进去呢?其实这里有几个方法可以尝试。

    Dfounderliu
  • 【尝鲜】全新SCFCLI帮你快速部署自己的云函数

    SCFCLI想必很多小伙伴都知道了,也都用过了,作为一个可以提高开发者效率的工具,CLI还是很有价值的。本次给大家介绍一下,新版SCFCLI增加的有趣的功能和优...

    Dfounderliu
  • SCF-Python依赖小工具

    Hi,各位小伙伴,近期我也写过一个关于如何打包Python依赖的小文章:https://cloud.tencent.com/developer/article/...

    Dfounderliu
  • Windows 10 设置始终以管理员身份运行

    Mr. Wei
  • NodeJS后台

    1.切换盘符 e: 2.改变目录 cd 目录名 3.执行程序 node xxx.js

    达达前端
  • 【MAC风】kde美化

    huanhao
  • 小蛇学python(18)pandas的数据聚合与分组计算

    对数据集进行分组并对各组应用一个函数,这是数据分析工作的重要环节。在将数据集准备好之后,通常的任务就是计算分组统计或生成透视表。pandas提供了一个高效的gr...

    用户2145057
  • GEO数据库单基因文章套路视频(GEO生存分析)

    ...

    用户6927366
  • 腾讯云大学大咖分享 | 腾讯物联网操作系统TencentOS tiny技术架构及开发案例讲解

    腾讯物联网操作系统(TencentOS tiny)是腾讯面向物联网领域开发的实时操作系统,具有低功耗,低资源占用,模块化,可裁剪等特性。TencentOS ti...

    腾讯云大学
  • 动态规划怎么用?

    动态规划适用于子问题不是独立的情况,即各个子问题之间包含公共的子问题。动态规划对每个子问题只计算一次,保存其计算结果到"一张表",重复利用,从而优化执行。

    爬蜥

扫码关注云+社区

领取腾讯云代金券