腾讯云API:无服务器函数

无服务器函数是一个很好玩的东西,可以通过这个程序跑一些脚本,在一定程度上,是很方便的。但是作为新鲜事物,一般很难被大家接受,所以,我今天在这里,就做一个小例子,来激发一下大家的Idea,创造力。

首先,在腾讯云无服务器函数上面新建:

新建脚本

创建好一个脚本之后,我们写入代码:

# -*- coding: utf8 -*-
import urllib.request
import socket
socket.setdefaulttimeout(3)
def main_handler(event, context):
    try:
        res = urllib.request.urlopen("http://www.liuyu.ac.cn").read().decode("utf-8")
        return True
    except:
        return False
写入代码

然后可以点击测试,看一下是否可以跑起来:

代码测试

通过代码打来使用无服务器云函数:

# -*- coding: utf-8 -*-
 
# 作者:Dfounderliu(刘宇)
# 程序功能:腾讯云API DEMO
# Python版本:Python 3.0
 
import binascii
import hashlib
import hmac
import sys
import urllib.parse
import urllib.request
import time
import random
 
def sign(secretKey, signStr, signMethod):
    '''
    该方法主要是实现腾讯云的签名功能
    :param secretKey: 用户的secretKey
    :param signStr: 传递进来字符串,加密时需要使用
    :param signMethod: 加密方法
    :return:
    '''
    if sys.version_info[0] > 2:
        signStr = signStr.encode("utf-8")
        secretKey = secretKey.encode("utf-8")
 
    # 根据参数中的signMethod来选择加密方式
    if signMethod == 'HmacSHA256':
        digestmod = hashlib.sha256
    elif signMethod == 'HmacSHA1':
        digestmod = hashlib.sha1
 
    # 完成加密,生成加密后的数据
    hashed = hmac.new(secretKey, signStr, digestmod)
    base64 = binascii.b2a_base64(hashed.digest())[:-1]
 
    if sys.version_info[0] > 2:
        base64 = base64.decode()
 
    return base64
 
def dictToStr(dictData):
    '''
    本方法主要是将Dict转为List并且拼接成字符串
    :param dictData:
    :return: 拼接好的字符串
    '''
    tempList = []
    for eveKey, eveValue in dictData.items():
        tempList.append(str(eveKey) + "=" + str(eveValue))
    return "&".join(tempList)
 
 
def signStrFun(dictData):
    '''
    本方法用来进行字典排序
    :param dictData:
    :return:
    '''
    tempList = []
    resultList = []
    tempDict = {}
    for eveKey,eveValue in dictData.items():
        tempLowerData = eveKey.lower()
        tempList.append(tempLowerData)
        tempDict[tempLowerData] = eveKey
    tempList.sort()
    for eveData in tempList:
        keyTempData = str(tempDict[eveData]).replace("_",".")
        tempStr = str(tempDict[eveData]) + "=" + str(dictData[tempDict[eveData]])
        resultList.append(tempStr)
    return "&".join(resultList)
 
 
# 用户必须准备好的secretId和secretKey
# 可以在 https://console.cloud.tencent.com/capi 获取
secretId = ""
secretKey = ""
 
# 在此处定义一些必须的内容
# 时间戳
timeData = str(int(time.time()))
# Nonce,官网给的信息:随机正整数,与 Timestamp 联合起来, 用于防止重放攻击
nonceData = int(random.random()*10000)
# uri,请参考官网
uriData = "scf.tencentcloudapi.com"
# 加密方法
signMethod="HmacSHA256"
# 请求方法,在签名时会遇到,如果签名时使用的是GET,那么在请求时也请使用GET
requestMethod = "GET"
 
# 签名时需要的字典
# 首先对所有请求参数按参数名做字典序升序排列,所谓字典序升序排列,
# 直观上就如同在字典中排列单词一样排序,按照字母表或数字表里递增
# 顺序的排列次序,即先考虑第一个“字母”,在相同的情况下考虑第二
# 个“字母”,依此类推。
# 此处可以考虑对key进行lower,然后sort,当然,本程序生成的是排序好的参数
signDictData = {"Action":"Invoke","FunctionName":"dfounderliu","Nonce":nonceData,"Region":"ap-guangzhou","SecretId":"AKID993qRrf91jKl9MeKJBxgJpDQRKApeFF5","SignatureMethod":signMethod,"Timestamp":int(timeData),"Version":"2018-04-16",}
 
# 获得拼接的字符串,用于签名
# 此步骤生成请求字符串。 将把上一步排序好的请求参数格式化成“参数名称”=“参数值”的形式,如对Action参数,
# 其参数名称为"Action",参数值为"DescribeInstances",因此格式化后就为Action=DescribeInstances。
# 注意:“参数值”为原始值而非url编码后的值。
# 然后将格式化后的各个参数用"&"拼接在一起,最终生成请求字符串。
# 此步骤生成签名原文字符串。 签名原文字符串由以下几个参数构成:
# 1) 请求方法: 支持 POST 和 GET 方式,这里使用 GET 请求,注意方法为全大写。
# 2) 请求主机:查看实例列表(DescribeInstances)的请求域名为:cvm.tencentcloudapi.com。实际的请求域名根据接口所属模块的不同而不同,详见各接口说明。
# 3) 请求路径: 当前版本云API的请求路径固定为 / 。 4) 请求字符串: 即上一步生成的请求字符串。
# 签名原文串的拼接规则为:
#   请求方法 + 请求主机 +请求路径 + ? + 请求字符串
requestStr = "%s%s%s%s%s"%(requestMethod,uriData,"/","?",signStrFun(signDictData))
 
# 调用签名方法,同时将结果进行url编码,官方文档描述如下:
# 生成的签名串并不能直接作为请求参数,需要对其进行 URL 编码。 注意:如果用户的请求方法是GET,则对所有请求参
# 数值均需要做URL编码。 如上一步生成的签名串为 EliP9YW3pW28FpsEdkXt/+WcGeI= ,最终得到的签名串请求参数(Signature)
# 为: EliP9YW3pW28FpsEdkXt%2f%2bWcGeI%3d ,它将用于生成最终的请求URL。
signData = urllib.parse.quote(sign(secretKey,requestStr,signMethod))
 
# 上述操作是实现签名,下面即进行请求
# 先建立请求参数, 此处参数只在签名时多了一个Signature
actionArgs = signDictData
actionArgs["Signature"] = signData
 
# 根据uri构建请求的url
requestUrl = "https://%s/?"%(uriData)
# 将请求的url和参数进行拼接
requestUrlWithArgs = requestUrl + dictToStr(actionArgs)
 
# 获得response
responseData = urllib.request.urlopen(requestUrlWithArgs).read().decode("utf-8")
 
print(responseData)

可以看到,通过API调用可以直接激活函数。

我这个程序有什么意义的?

其实我这个程序主要就是一个监控工具,可能我现在做的一个网址监控,有人觉得意义不大,你既然都跑了API证明你有网络,为啥不自己打开一下网页呢?但是想一下,我如果监控了10个网页,20个网页,30个网页呢?

有人可能还会说,你这样一个小的python程序,你用电脑直接跑啊,为啥还有放在无服务器云函数上面,为什么还要在本地再写一个脚本呢?

当然也是有原因的:

1:无服务器函数可以设置一个间隔时间进行触发,不用电脑一直在线,除此之外他也有多种触发模式

2:我现在这个程序是小程序,可能本地跑,无服务器云函数跑都一样,但是如果我这是一个很大,很复杂的程序呢?是不是我本地就可以不考虑硬件,而通过云服务器函数来跑数据了?

当然,其他的原因也有很多。使用无服务器云函数也会有很多好处的,毕竟目前这样的产品也是刚出没多久,更多的,还要大家,小伙伴们自己去探索其中的妙用。

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

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯云API

腾讯云API:用Python使用腾讯云API(机器翻译实例)

腾讯云API地址:https://cloud.tencent.com/document/api

5242
来自专栏java一日一条

怎样编写高质量的Java代码

怎样辨别一个项目代码写得好还是坏?优秀的代码和腐化的代码区别在哪里?怎么让自己写的代码既漂亮又有生命力?接下来将对代码质量的问题进行一些粗略的介绍。也请有过代码...

471
来自专栏腾讯云API

腾讯云API:用Python使用腾讯云API(cvm实例)

腾讯云API地址:https://cloud.tencent.com/document/api

5083
来自专栏CRPER折腾记

NG2.4.10升级NG4正式版[正式项目]:修正AOT打包报错的一些问题

上周五,ng4正式发布了。。很多小伙伴迫不及待的把项目升级了。。。 然后到群里各种吼,无损升级,没有什么奇葩问题,大家放心升级。。 我信了。。。把公司的项目给升...

611
来自专栏编舟记

Clojure集合管道函数练习

TDD讨论组里的申导最近在B站直播了Martin Fowler的经典文章Refactoring with Loops and Collection Pipeli...

902
来自专栏IMWeb前端团队

用原生js写一个"多动症"的简历

用原生js写一个"多动症"的简历 预览地址 源码地址 最近在知乎上看到@方应杭用vue写了一个会动的简历,觉得挺好玩的,研究一下其实现思路,决定试试用原生js...

2457
来自专栏吴裕超

Protocol Buffers 在前端项目中的使用

公司后端使用的是go语言,想尝试用pb和前端进行交互,于是便有了这一次尝试,共计花了一星期时间,网上能查到的文档几乎都看了一遍,但大多都是教在node环境下如何...

1554
来自专栏谦谦君子修罗刀

程序员面试闪充--iOS密码学

但凡一个有点追求的iOS开发,总得会点加密技术,要不然用户信息就有可能被其他人获取用来做一些对我们不利的事情。 视频地址: 密码学 一、base64 base6...

29910
来自专栏腾讯云API

【非官方教程】【视频】云API实践教程(上)

云API存在的目的是什么?有控制台给我们提供给中便利,我们为什么要用API来做一些操作?

2109
来自专栏嵌入式程序猿

SAE J1939 协议简介(二)

在简单介绍完J1939协议后,今天我们来讲讲J1939的数据链路层,熟悉数据链路层是开发任何一种协议软件的基础,数据链路层中的协议数据单元(PDU)格式...

3899

扫码关注云+社区