主流云服务提供商、互联网技术公司都拥有自建的开放API平台。通过这些API平台,开发者可以以编程的形式对该公司提供的各项服务进行操作。
在 家庭网络对外网网络服务搭建指南 中,我们提到如果加进行PPPoE重拨时对外的公网IP将会发生变化,而我们在进行DNS直接解析到家庭公网IP或者利用CDN消除端口并加速网站中都需要对IP进行设置。对于DDNS解析来说,中高端路由器或开源路由器操作系统中应存在以插件形式提供对应DNS解析服务商的DDNS服务插件。但对于CDN来说,一般情况下都没有对CDN服务记录进行修改的插件。因此,最通用的办法还是通过对应服务供应商开放平台中提供的API进行操作。本文则以阿里云为例,通过阿里云OpenAPI实现以上两种不同操作。
一、编程前准备
在阿里云平台,如果你想远程调用OpenAPI你需要通过该账户主账户或某一拥有该权限的RAM账户授权获得AccessKey及对应Secret,而后通过AccessKey作为参数对API进行操作。本节将获取AccessKey的流程展示出来。
预期目标:定时启动脚本=>脚本执行DDNS及CDN回源地址更新操作=>发送结果邮件至邮箱
以上操作需要:
- 预先查询对应API
- 自己的公网IP
- 提供邮箱SMTP服务授权码
(一)、创建RAM账户
为保证主账户安全,一般仅在RAM账户(即仅拥有某一产品、资源组管理、查询权限的子账户)获取AccessKey,因此第一步为创建RAM账户
1、RAM控制台
(1)、登录并进入阿里云控制台
(2)、进入用户菜单访问控制页
(3)、进入用户菜单页
2、创建用户
创建用户页拥有大量选项,根据自己使用需求开放对应控制权
(1)、创建基础账户
本文因需要使用AccessKey,因此勾选 编程访问,如有需要则勾选控制台访问。在这一步将需要对阿里云绑定的号码进行短信验证。
这一步创建好的账户没有任何权限,需要下一步添加权限。同时需要保存好AccessKey及AccessKey Secret,该页面关闭后如需再次查询需要进行短信验证。推荐保存到本地。
3、添加权限
(1)、权限选择及查询
阿里云RAM访问控制可以通过系统策略及自定义策略对RAM账户进行细粒度的权限授权及管控,需要通过使用拥有一套完整体系的 权限策略语法 对不同层级、功能、资源进行自定义策略创建。而本文为简单方便仅使用阿里云预定义的 系统策略。
可以直接在创建用户页面下方 添加权限 按钮打开选中账户添加权限抽屉页,或者将该用户移动到某一具有权限分配的用户组中,此处直接使用前者方法。
添加权限页面中主要包含三个部分,授权应用范围(一般个人用户不会划分资源组,选择整个云账户即可),被授权主体,权限选择栏。我们此处需要选择 AliyunDNSFullAccess AliyunCDNFullAccess 两种权限。如需自定义策略添加权限,请阅读 阿里云访问控制文档 权限策略语法及结构
此时,你已经创建并授权RAM账户,下一步即可开始查询API编程啦。
(二)、查询API
阿里云原本的OpenAPI Explorer已更新为 OpenAPI 开发者门户,在该页面可以对阿里云所有云服务产品提供的OpenAPI进行查询。
1、查询CDN及DNS 记录修改API
在搜索栏中填入需要查询的产品类型就会出现简单易懂的搜索提示,选择对应产品进入即可。
经过搜索,我们最终确定需要的API有 ModifyCdnDomain、UpdateDomainRecord 两个API。它们分别Required参数为 DomainName、RecordId,记录下来后,我们就可以在API 调试 Tab里查看具体实例了。
2、通过OpenAPI 开发者门户调试API
请注意SDK版本选择,推荐使用升级版SDK,同时下方代码框内有多种语言可供选择。在左侧表单中填写对应参数即可点击 发起调用 查看结果。注意:该调用将会对账户上对应产品调用生效,请小心使用。
(三)、邮箱SMTP授权码获取
SMTP协议是一种可靠有效的电子邮件传输协议,主流邮箱在设置后均支持SMTP服务。下面将以QQ邮箱为例获取SMTP授权码(推荐新建一个账户专门用于自动化系统发邮件)。
1、获取SMTP授权码流程
(1)、进入邮箱设置页面
(2)、进入账户Tab选项卡
(3)、开启SMTP服务并获取授权码
我因为图方便除了CardDAV和CalDAV(群辉可以做CardDAV、CalDAV服务器)就直接都开了。
进行密保手机验证
授权码可以同时在多个地方使用,在忘记授权码时可以在此处重新生成授权码,旧授权码仍然有效。保存授权码到本地。
此时你就可以开始编程了。
二、API调用脚本编写
编程阶段实际上是最快的阶段,因为只需要将对应的API调用并返回结果就行。但这样对结果的查询有些麻烦,因此我们加入了将刷新结果通过SMTP服务发送给目标邮箱的过程。本文使用Nodejs+Gulp+TypeScript+VSCode进行代码编写。
(一)、搭建项目
由于项目搭建过程需要花费较多精力进行tsconfig等配置,因此此处省略,以后将会对如何搭建上述项目template开文描述。(我的项目模板上传在Oyxf’sGitlab上,关于jest和commitzen还有点bug。gitlab暂时只public了几个项目,有兴趣的可以看一看)
项目结构概览结果:
需要安装的npm包(推荐换国内源或自建NexusRepository)有用于网络请求的Axios、阿里云OpenAPI SDK for TypeScript、emailjs(用于邮件发送)。
npm install @alicloud/alidns20150109 @alicloud/cdn20180510 @alicloud/openapi-client @types/axios emailjs --save
(二)、获取公网IP模块
通过互联网开放API我们可以快速的获取自己的公网IP,ipify 提供的api使用Axios获取公网IP:
(三)、调用阿里云API模块
然后可以先把阿里云代码实例抄过来(为了方便我们就不把模块独立成文件了):
然后可以填下参数测试一下:
如果你输出的结果仅包含一个RequestId在Body里面,说明调用成功,此时你可以前往阿里云控制台查看修改记录结果。如果出现调用错误如下,则请查找对应API错误代码:
如果你是使用CDN方法解析域名,那么你到这一步就完成了对OpenAPI所需要的编写的代码,可以跳过下一小节关于DNS解析记录修改的叙述到
,后面的操作就很简单了,同样的调用查询,但DNS记录修改中有一个RecordId需要通过获取DNS列表获取
利用 DescribeDomainRecords API 查询DNS RecordId信息。该API需要DomainName(域名名称比如baidu.com)及RRKeyword(域名前缀比如 www)两个参数即可。
然后就可以使用recordId进行DNS记录更新了,简单把以上三个步骤和更新DNS解析改写串联成Promise:为了(由于WordPress暂时没有装比较好的CodeHighlighter就暂时用图片代替)
调用结果
(四)、使用SMTP协议发送结果
使用emailjs的SMTPClient发送邮件
由于我的DNS记录已经是当前公网IP了,因此刷新失败,其实可以将dns_refresh_result填写为该ErrorMessage。在发送的邮件中显示更加清晰。
总体来说,代码是比较简单的,只是进行几个API的调用和Promise的衔接。但这个流程拥有巨大的扩展性。而后定时刷新则需要使用一些定时任务库比如(node-schedule)或者使用系统定时任务,定时执行一次ts-node命令。而我是在群辉在使用Cronjob执行。
(五)、代码展示
以上代码仅仅是最基础的代码,应该将错误处理完善,同时记录日志,在发送内部错误是将日志持久化存储或发送到log server中。我写这篇博客之前就已经完成了该代码相对完善的编写,可以作为一个小Promise事件框架使用。下面简单截下图
三、总结
总的来说,各大服务商开放平台可以给我开发学习提供巨大便利。同时他们的API格式和SDK设计都可以为我们开发提供参考。
(一)、各大开放平台
下面罗列一下部分开放平台(随机顺序,想到哪写到哪)
- 阿里云OpenAPI开发者门户
- 华为开发者平台
- 华为IoT开放平台
- 小米开放平台
- 小米IoT开发者平台
- 小米小爱开放平台
- 百度AI开放平台
- 百度数据开放平台
- 百度地图开放平台
- 讯飞开放平台
- 腾讯开放平台
- 支付宝开放平台
- 知乎:公共API那些比较实用
版本记录:
- v0.1w 2021/3/21 21:00
- 0.3ep 2021/3/22 11:20
- v1.0aep 2021/3/22 19:30 基本内容完成