首页
学习
活动
专区
圈层
工具
发布

Google App脚本中的Nexmo API调用

Google Apps Script 中调用 Nexmo API 的完整指南

基础概念

Nexmo API(现为Vonage API的一部分)是一组通信API,允许开发者通过短信、语音、验证等功能集成通信能力到应用中。Google Apps Script (GAS)是Google提供的基于JavaScript的云脚本语言,用于扩展Google Workspace应用功能。

相关优势

  1. 无需服务器:直接在Google云端运行脚本
  2. 快速集成:与Google Sheets、Docs等无缝集成
  3. 自动化工作流:可定时触发或基于事件触发
  4. 免费配额:Google Apps Script有免费执行配额

调用Nexmo API的类型

  1. 短信API
  2. 语音API
  3. 验证API
  4. 号码洞察API

应用场景

  • 通过Google表单提交自动发送短信确认
  • 从Google Sheets批量发送短信通知
  • 基于Google日历事件触发语音提醒
  • 两步验证集成到Google Workspace应用

实现代码示例

1. 发送短信示例

代码语言:txt
复制
function sendSMS() {
  var apiKey = 'YOUR_NEXMO_API_KEY';
  var apiSecret = 'YOUR_NEXMO_API_SECRET';
  var fromNumber = 'NEXMO_VIRTUAL_NUMBER';
  var toNumber = 'RECIPIENT_NUMBER';
  var messageText = 'Hello from Google Apps Script!';
  
  var url = 'https://rest.nexmo.com/sms/json?' +
    'api_key=' + encodeURIComponent(apiKey) +
    '&api_secret=' + encodeURIComponent(apiSecret) +
    '&from=' + encodeURIComponent(fromNumber) +
    '&to=' + encodeURIComponent(toNumber) +
    '&text=' + encodeURIComponent(messageText);
  
  var response = UrlFetchApp.fetch(url, {
    method: 'GET',
    muteHttpExceptions: true
  });
  
  var result = JSON.parse(response.getContentText());
  Logger.log(result);
  
  if (result.messages[0].status === '0') {
    Logger.log('Message sent successfully');
  } else {
    Logger.log('Message failed with error: ' + result.messages[0]['error-text']);
  }
}

2. 验证API示例

代码语言:txt
复制
function startVerification() {
  var apiKey = 'YOUR_NEXMO_API_KEY';
  var apiSecret = 'YOUR_NEXMO_API_SECRET';
  var phoneNumber = 'USER_PHONE_NUMBER';
  var brandName = 'YOUR_APP_NAME';
  
  var url = 'https://api.nexmo.com/verify/json?' +
    'api_key=' + encodeURIComponent(apiKey) +
    '&api_secret=' + encodeURIComponent(apiSecret) +
    '&number=' + encodeURIComponent(phoneNumber) +
    '&brand=' + encodeURIComponent(brandName);
  
  var response = UrlFetchApp.fetch(url, {
    method: 'GET',
    muteHttpExceptions: true
  });
  
  var result = JSON.parse(response.getContentText());
  
  if (result.status === '0') {
    Logger.log('Verification request sent, request_id: ' + result.request_id);
    return result.request_id;
  } else {
    Logger.log('Error: ' + result.error_text);
    return null;
  }
}

function checkVerification(requestId, code) {
  var apiKey = 'YOUR_NEXMO_API_KEY';
  var apiSecret = 'YOUR_NEXMO_API_SECRET';
  
  var url = 'https://api.nexmo.com/verify/check/json?' +
    'api_key=' + encodeURIComponent(apiKey) +
    '&api_secret=' + encodeURIComponent(apiSecret) +
    '&request_id=' + encodeURIComponent(requestId) +
    '&code=' + encodeURIComponent(code);
  
  var response = UrlFetchApp.fetch(url, {
    method: 'GET',
    muteHttpExceptions: true
  });
  
  var result = JSON.parse(response.getContentText());
  
  if (result.status === '0') {
    Logger.log('Verification successful');
    return true;
  } else {
    Logger.log('Verification failed: ' + result.error_text);
    return false;
  }
}

常见问题及解决方案

1. 请求失败

原因

  • API密钥或密钥不正确
  • 配额用尽
  • 电话号码格式错误

解决

  • 检查API凭证
  • 验证电话号码格式(包括国家代码)
  • 检查Nexmo账户余额或配额

2. 响应解析错误

原因

  • API返回非JSON格式
  • 网络问题导致响应不完整

解决

  • 添加错误处理
  • 检查muteHttpExceptions设置
  • 实现重试机制
代码语言:txt
复制
try {
  var response = UrlFetchApp.fetch(url, {
    method: 'GET',
    muteHttpExceptions: true
  });
  var result = JSON.parse(response.getContentText());
} catch (e) {
  Logger.log('Error parsing response: ' + e);
}

3. 执行时间过长

原因

  • 网络延迟
  • Google Apps Script执行时间限制(6分钟)

解决

  • 优化代码,减少不必要的操作
  • 考虑将长时间运行的任务分解为多个触发器

4. 权限问题

原因

  • 脚本没有访问外部URL的权限

解决

  • 确保脚本已授权访问外部服务
  • 在脚本编辑器中:资源 > 云平台项目 > 启用高级Google服务

最佳实践

  1. 安全存储凭证:使用Google Apps Script的PropertiesService存储敏感信息
  2. 安全存储凭证:使用Google Apps Script的PropertiesService存储敏感信息
  3. 错误处理:实现全面的错误处理和日志记录
  4. 速率限制:遵守Nexmo API的速率限制,必要时添加延迟
  5. 测试:在发送大量消息前先进行小规模测试
  6. 国际化:处理不同国家的电话号码格式和编码

通过以上方法和示例,您可以在Google Apps Script中有效地集成Nexmo API,实现各种通信功能。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

怎样用Google APIs和Google的应用系统进行集成(3)—-调用Google 发现(Discovery)API的RESTful服务

说了这么多,那么首先同意我以Google Discovery RESTful服务为例,给大家演示怎样用最普通的Java代码调用Google Discovery RESTful服务。...引言: 在“怎样用Google APIs和Google的应用系统进行集成(2)”的以下,我列出了当前Google APIs支持的全部的Google APIs。...事实上这个表格是我用代码调用Google Discovery RESTFul服务自己主动生成的。...: http://code.google.com/p/google-gson/ GSon是谷歌官方提供的解析JSON数据: 1.谷歌GSON这个Java类库能够把Java对象转换成JSON...: “ 怎样用Google APIs和Google的应用系统进行集成(2)”一文中看到的表格的html源码。

1.1K30
  • uni-app 提交 app应用 到 Google Play 提示 API 级别过低的解决办法

    发现问题 近日准备发布新版本上架到 Google Play 上时,突然出现了 Change your app's target API level to at least 31 的提示。...自 2023 年 1 月起,应用更新必须以 Android 12 或更高版本为目标平台,并针对 Android 12 中的行为变更进行调整;Wear OS 应用除外,此类应用必须以 Android 11...详情请看: 符合 Google Play 的目标 API 级别要求 。...解决问题 此时只需要将应用配置文件 manifest.json 中的 App常用其他设置 的 targetSdkVersion 设置成 31 ,然后重新提交到云打包,将打包好的 aab 再次去提交到 Google...填好 App 必要信息,提交去审核,大概两个工作日左右就可以上架到 Google Play 了(前提是你的 App 不违规喔~)。

    2.3K10

    【Groovy】Groovy 脚本调用 ( Groovy 脚本中的作用域 | 本地作用域 | 绑定作用域 )

    文章目录 一、Groovy 脚本中的作用域 ( 本地作用域 | 绑定作用域 ) 二、Groovy 脚本中的作用域代码示例 一、Groovy 脚本中的作用域 ( 本地作用域 | 绑定作用域 ) ----...在 Groovy 脚本中 , 定义两个变量 , 一个使用 def 声明 , 一个直接声明变量 ; def age = "18" age2 = "16" println "$age , $age2" 上面的...2 个变量都可以打印 , 都是合法的变量 ; 但是有如下区别 ; age 变量的作用域是 本地作用域 , 相当于 private 私有变量 ; age2 变量的作用域是 绑定作用域 , 相当于 public...错误 ; 二、Groovy 脚本中的作用域代码示例 ---- 代码示例 : 注意 , 此时代码中有错误 , println "$age" 代码 , 中的 age 是本地作用域变量 , 在函数中无法访问到..., 会报错 ; 函数中只能访问 绑定作用域的变量 ; /* 下面的 age 和 age2 都是变量定义 age 变量的作用域是 本地作用域 age2 变量的作用域是 绑定作用域

    1.7K20

    API调用中的身份验证与授权实践

    身份验证和授权作为API安全的核心要素,对于保护API接口免受未授权访问和潜在攻击至关重要。本文将以Java为例,深入探讨API调用中的身份验证与授权实践,帮助开发者构建更加安全的API应用。...身份验证与授权的基本概念身份验证(Authentication)身份验证是指确认用户或系统身份的过程。在API调用中,身份验证确保只有合法的用户或系统能够访问特定的资源。...基于属性的访问控制(ABAC):根据用户属性、资源属性和环境条件动态决定权限,灵活性较高。Java中的安全实践Java作为一种广泛使用的编程语言,提供了丰富的库和框架来支持API的安全实现。...API接口调用:在应用程序中使用获取到的Token进行API接口调用。技术选型OAuth2.0OAuth2.0是一种开放标准的授权协议,适用于多种应用场景。...结论API调用中的身份验证与授权是保障API安全的关键环节。通过合理的认证方式和授权策略,可以有效防止未授权访问和潜在攻击。

    91210

    LoRaServer 笔记 2.6 WebUI 中 Rest API 的调用逻辑分析

    前言 应用如何根据 LoRa App Server 提供的北向 API 进行开发呢? 那么多的 API 都是怎么使用,这篇笔记梳理了主要API的调用逻辑。...小能手最近在学习 LoRa Server 项目,应该是最有影响力的 LoRaWAN 服务器开源项目。它组件丰富,代码可读性强,是个很好的学习资料。更多学习笔记,可点此查看。...参数说明 serviceProfile 将应用的通用参数做了抽象提出,这里必须填入,以前倒是没有。...deviceProfileID 及 applicationID,以及web输入的DevEUI 回复 200 OK API 示例 2 POST /api/devices/{device_keys.dev_eui...", "devEUI":"0000000000000002" } } 参数说明 这里感觉有问题,WebUI 上填的是 appKey,API 传递进来却变成了 nwkKey。

    1.7K20

    实战教程:如何在API监控中实现高效报警和通知

    实现 为了实现报警和通知机制,可以考虑以下几种方法: 电子邮件通知: 可以使用 Python 中的邮件库(如 smtplib)来编写脚本,以便在出现重大问题时发送电子邮件通知给团队成员。...这需要配置一个发送电子邮件的邮箱帐户。 短信通知: 如果希望通过短信发送通知,可以使用短信通知服务提供商的 API,如 Twilio 或 Nexmo。这些服务允许通过 API 发送短信通知。...为了确保帐户安全,请使用“使用 Google 登录”将应用程序连接到 Google 帐户。 可以使用"app passwords"解决上述用户名密码问题,用户名不变,改用app密码即可。...生成"app passwords"的步骤也很简单: 第一步:开启Gmail两步验证: 2-step Verification(google) 在这里插入图片描述 第二步:创建一个APP,并生成 APP...password(要记住的,不行就截一张图) : Generate App-password 在这里插入图片描述 第三步:用生成的密码替换上述代码中的 your_password即可 注意: 其他的

    1.4K60

    【Groovy】闭包 Closure ( 闭包中调用 Groovy 脚本中的方法 | owner 与 delegate 区别 | 闭包中调用对象中的方法 )

    文章目录 一、闭包中调用 Groovy 脚本中的方法 二、owner 与 delegate 区别 三、闭包中调用 Groovy 对象中的方法 一、闭包中调用 Groovy 脚本中的方法 ---- 在 Groovy...脚本中 , 在 Closure 闭包中 , 可以直接调用 Groovy 脚本中定义的方法 ; def fun() { println "fun" } def closure = {..., 这是无法改变的 ; 但是 Closure 闭包对象的 delegate 成员是可以修改的 ; 三、闭包中调用 Groovy 对象中的方法 ---- 在闭包中 , 可以直接调用 Groovy 脚本中定义的方法...; 但是如果想要在闭包中 , 调用实例对象的方法 , 就必须设置闭包的 delegate 成员 ; 如下代码中 , 想要在闭包中 , 调用 Test 对象的 fun 方法 , 在执行闭包之前 , 必须将...} } // 闭包中不能直接调用 Test 对象中的方法 // 此时可以通过改变闭包代理进行调用 def closure = { fun() } closure.delegate = new

    3.5K20

    在 Shell 脚本中调用另一个 Shell 脚本的三种方式

    被调用的脚本与父脚本在同一个 Shell 内执行。但是使用 exec 调用一个新脚本以后, 父脚本中 exec 行之后的内容就不会再执行了。...这是 exec 和 source 的区别. source 与 fork 的区别是不新开一个子 Shell 来执行被调用的脚本,而是在同一个 Shell 中执行....所以被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用。 其实从命名上可以感知到其中的细微区别,下面通过两个脚本来体会三种调用方式的不同: 第一个脚本,我们命名为 1.sh: #!...exec 在同一个 Shell 内执行,但是父脚本中 exec 行之后的内容就不会再执行了 source 在同一个 Shell 中执行,在被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用...参考: 在shell脚本中调用另一个脚本的三种不同方法(fork, exec, source)

    4.9K20

    在产品开发中调用Kubernetes API接口遇到的几个问题

    URL切换,产品提供一个功能就是透传Kuernetes API接口调用,就是要把对https://xx.xx.xx.xx:xx/api/v1/xx/xx/yy/...../zz接口的调用变成对https://:6443/yy/../zz接口(Kubernetes原生接口的调用),开发过程中遇到了一些问题,记录一下。...step2中遇到了问题2: 调用Kuernetes API需要携带token,但是调用产品的接口想把token拿掉 解决问题2采用方案8:拦截器修改header,添加token字段。...可以采用命令行的curl命令加上-k参数避开,java代码中调用客户端库加入下面的内容 https://github.com/fabric8io/kubernetes-client/blob/master...certificate-authority-data: xxxxxx为 insecure-skip-tls-verify: true 参考kubectl的解决办法,也可以用另一种方法修改java代码中调用客户端库

    1.2K10

    Uber服务端响应中的API调用缺陷导致的账户劫持

    Uber的Web应用服务体系是基于很多微服务架构部署的,由于微服务中会涉及到大量的REST模式,因此,在与各种Uber应用的交互过程中,Uber服务端难免会调用到一些REST API接口。...所以,矛盾点来了,如果这类API调用都是以预定的path/variables/host方式进行的,而且,这些调用是用户无法控制的,那么,Web应用后端(Backend)设置的身份验证措施又有何用呢?...第二,在查询请求request中缺乏验证调用者身份的 X-Auth-Token 头,但是,在服务端响应消息中竟然还返回了用户的访问token!...- 4cb88fb1-d3fa-3a10-e3b5-ceef8ca71faa,是用来在API GET请求调用中传递给path和query参数的,所以,我对原始的前端请求路径(Endpoint)做了如下修改...预想一下,我们希望在服务端响应中能返回的API GET请求调用如下: http://127.0.0.1:123/v1/partners/victim_uuid/statements/current?

    1.6K10

    AI Agent 中自然语言模型与代码模型在 API 调用中的深度协作

    这两个模型不仅各自承担独特的任务,而且在实际执行过程中紧密配合,为完成 API 调用任务发挥关键作用。...面向自然语言的模型:意图理解与参数提取 面向自然语言的模型在 AI Agent 处理 API 调用的流程中,承担着理解用户意图、提取关键信息的重任。...同时,代码模型生成的内容也支持自助运行编译。这意味着在一些自动化场景中,无需人工干预,系统可以直接根据代码模型生成的代码进行编译和执行 API 调用。...面向自然语言的模型:意图理解与参数提取 面向自然语言的模型在 AI Agent 处理 API 调用的流程中,承担着理解用户意图、提取关键信息的重任。...同时,代码模型生成的内容也支持自助运行编译。这意味着在一些自动化场景中,无需人工干预,系统可以直接根据代码模型生成的代码进行编译和执行 API 调用。

    48410

    Android经典实战之Kotlin Multiplatform 中,如何处理不同平台的 API 调用

    KMP使用expect 和 actual 关键字 在 Kotlin Multiplatform 项目中,expect 和 actual 关键字被用于处理不同平台的 API 调用。...这些预期声明不包含实现代码,而是作为平台无关的 API 供共通代码使用。...这允许在共通代码中声明枚举,而在平台特定代码中扩展它。 6、 类型别名: 如果需要使用特定平台的现有类型实现预期声明,可以使用类型别名(typealias)来连接预期声明和平台特定的类型。...代码示例 以下是一个使用 expect 和 actual 关键字在 Kotlin Multiplatform 项目中处理不同平台 API 调用的代码示例: 共通代码 (commonMain): // 预期声明...这样,当您在共通代码中调用 getPlatformName() 或创建 PlatformSpecificClass 的实例时,Kotlin 编译器会自动选择并使用适当平台的实际实现。

    58110

    安装DingoApi「建议收藏」

    [39m Discovered Package: [32mfideloper/proxy[39m Discovered Package: [32mlaravel/nexmo-notification-channel...env 中修改的,下面我们主要讲解一下我们需要用到的配置 详解: API_STANDARDS_TREE 和 API_SUBTYPE API_STANDARDS_TREE 有是三个值可选: x 本地开发的或私有环境的...prs 未对外发布的,提供给公司 app,单页应用,桌面应用等 vnd 对外发布的,开放给所有用户 API_SUBTYPE 一般情况下是我们项目的简称,我们的项目叫 api API_VERSION...默认的 API 版本,当我们没有传 Accept 头的时候,默认访问该版本的 API。...API_STRICT 是否开启严格模式,如果开启,则必须使用 Accept 头才可以访问 API,也就是说直接通过浏览器,访问某个 GET 调用的接口,将会报错。

    59310

    Go或者C中调用Lua业务脚本,实现终端应用的热更新机制

    业务在后台实现,终端仅成为操作实体的媒介,这样维护量将大大降低,业务都在后台,更利于升级迭代和维护。 二是脱机类,空闲联机的业务,终端可实现轻量化,热更新应用。把业务模块化,组件化,脚本化。...每次升级不用整个都升级,可能仅需要写好业务脚本把轻量的几K的脚本下发下去实现应用的热更新,用户无感知。 借用docker的图标来说下,它的图标很形象,一个大船拖动了很多的集装箱。...前期的基础和轮子打造需要下点功夫,而后续的业务实现可能很简单,就是在大的容器环境下写业务脚本,类似搭积木的方式灵活的实现业务和快速更新迭代。...以下是Go应用中调用Lua业务脚本的一个尝试:(注,同时在电脑上和ARM板子上已验证都是可行的) 以下是我的一个验证: package main import ( "fmt" "github.com...DATA ret,rcv = TxData(TX) --调用接口TxData(str),实际会以二进制的字节流发送报文 --print(rcv) --黑名单下载 MTI = 'B004'

    86020

    史上最全最详细的多语言调用 ChatGPT 3.5 Turbo 的 API 教程(持续更新中!!!)

    ChatGPT-3.5 Turbo 模型是 ChatGPT 所使用的模型,现 OpenAI 已正式开放 ChatGPT 的 API 能力供广大开发者使用,它可以提供超高准确性、可靠性和可扩展性,让机器学习和自然语言处理的开发者以极低的成本获取精准的结果...那么我们如何通过API 的方式调用 GPT 3.5 呢?下面给大家整理多种语言的调用方式以及接入示例代码,有需要赶紧收藏起来。...国内不需要魔法就能用渠道 --- APISpaceAPISpace的使用步骤:图片登录成功后,可以进入顶部菜单的 我的 API ,选择侧边栏的 访问控制 入口,获取到上述示例代码中的 APIKey。...图片如何在线测试 ChatGPT 3.5 Turbo 的 API注册登录 APISpace进入聊天机器人 3.5 - Turbo 详情页 ,点击【免费试用】按钮即可领取免费次数图片2.进入测试页面输入请求参数值...,点击【发送】按钮图片APISpace 简单介绍APISpace 是 一个专注生产和提供 API 的平台,API 接口类型丰富,比如说天气类、短信类、OCR类、以及物流等等,基本满足多个行业的数据需要,

    4.1K30

    【Unity3D】Android Studio 工程中使用 Java 代码调用 Unity 的 C# 脚本 ( Java 中调用 UnityPlayer#UnitySendMessage 方法 )

    方法简介 三、 准备 C# 脚本 四、 Java 示例 一、 Java 调用 C# 依赖库准备 ---- 1、依赖库位置 在 Android 中调用 Unity 的 C# 脚本 , 需要借助 Unity...类中 , 调用 UnitySendMessage 方法 , 可以调用 C# 脚本中的方法 ; 第一个参数 String var0 : 是 C# 脚本附着的游戏物体 GameObject 名称 ; 第二个参数...---- 在 C# 脚本中 , 定义 Test 方法 , 之后在 Java 中调用该脚本的 Test 方法 ; void Test() { Debug.Log("Java 调用...C# 测试方法"); } 该脚本附着到 名称为 Cube 的立方体上 , 之后在 Java 中调用 C# 脚本方法 , 需要根据 游戏物体 GameObject 查找 C# 脚本 ; 完整代码...C# 测试方法"); } } 四、 Java 示例 ---- 在 Java 代码中 , 调用 // 调用 C# 脚本中的方法 UnityPlayer.UnitySendMessage

    2.6K20

    python中的twilio入门

    Python中的Twilio入门Twilio是一个提供通信API服务的平台,可以让开发者通过代码实现短信、电话和视频等功能。...在Python中,Twilio提供了一个方便易用的库,使得使用Twilio API变得简单,本文将介绍如何在Python中入门使用Twilio。...这个示例代码可以方便地应用于各种需要发送短信验证码的实际场景,例如用户注册、密码重置等。开发者只需要在应用中调用相应的函数,将生成的验证码发送给用户即可。...类似的平台:Nexmo:Nexmo是另一个流行的通信API平台,提供类似的短信、语音和电话功能。它在全球范围内提供支持,并具有相对较低的价格。...Plivo:Plivo是一家提供全球短信、语音和电话API服务的公司。它提供灵活的定价和全球化的覆盖。

    1.9K10
    领券