我的第一个OctoMation 应用APP开发 - flagify-com/OctoMation GitHub Wiki
完整地介绍一个应用开发的整个过程。展开右侧导航栏,阅读体验更好->_->
如果你需要下载,使用或参与贡献社区应用APP,请访问🚀OctoMationApps🚀这个项目。
在你正式编写一款OctoMation应用APP之前,请思考以下几个问题:
- 我的应用对接的是何种产品?
- 应用具备哪些动作?
- 应用动作有没有查询、写入和通知的特征?
- 应用是否需要API KEY、密码等信息?
- 应用输出的格式是什么?
- 下游产品会用到本应用的哪些输出结果?
- 应用会不会出错,如何告诉系统?
- ……
接下来,我们以编写一款IPinfo.io的IP地址地理信息(Geolocation)查询应用为例,介绍如何快速完成你的第一个OctoMation应用APP开发。
IPinfo——值得信赖的 IP 地址数据源。 IPinfo 于 2013 年由前 Facebook 工程师本-道林(Ben Dowling)创立,它以成为目前最可靠、最准确、最深入的 IP 地址数据源而自豪。IPinfo处理数 TB 的数据,生成定制的 IP 地理定位、公司、运营商和 IP 类型数据集。
我们将编写一款应用APP,支持在OctoMation中编排该应用以实现查询IP地理信息,预期的效果是这样的:
让我们正式开始吧!假设OctoMation的地址是https://192.168.0.1/
,在你成功登录后使用浏览器访问:https://192.168.0.1/dev
即可进入图形化应用开发工具的界面,这是OctoMation项目团队专门为你准备的辅助工具。
首先需要我们填写该应用有关的基本信息:名称、描述、应用版本、主文件(此处自定义为:ipinfo.py
)和Logo图片等。
要使用IPinfo网站查询API,您必须拥有一个身份认证的Token,所以我们在资源配置处增加一个token字段。
请注意,该字段属于敏感信息,我们指定其类型为password
,且必须填写
。
每个应用都有一个或者多个动作,接下来我们将创建一个查询IP地理信息的动作:ip_geolocation
。
该动作有一个必填的入参:ip
和多个出参:ip
、国家
、区域
、城市
、坐标
、组织
、邮编
、时区
等。
点击预览配置文件(config.json
),可以查看工具自动生成的配置文件。您也可以按需编辑配置文件。
点击应用APP开发界面右上角的按钮【生成主文件】,开发工具将自动生成主文件ipinfo.py
系统初始生成的主文件很简单,需要你根据实际需求,用详细的Python代码实现具体逻辑。
此处是根据IPinfo官方网站API接口编写的应用查询动作逻辑,代码如下:
# -*- coding: utf-8 -*-
import requests
import json
def get_ip_geolocation(params, assets, context_info):
"""查询IP地址的地理位置"""
# API Token
token = assets["token"]
# IP地址(支持IPv4、IPv6)
ip = "8.8.8.8" if "ip" not in params.keys() or params["ip"] == "" else params["ip"]
# 返回值
json_ret = {"code": 200, "msg": "","data": {"ip": "", "city": "", "region": "", "country": "", "loc": "", "org": "", "timezone": "", "postal": ""}}
'''添加函数实现
'''
url = f"https://ipinfo.io/{ip}?dataset=geolocation&token={token}"
try:
response = requests.get(url)
if response.status_code == 200:
json_info = response.json()
if 'ip' in json_info.keys():
json_ret['data']['ip'] = json_info['ip']
if 'city' in json_info.keys():
json_ret['data']['city'] = json_info['city']
if 'region' in json_info.keys():
json_ret['data']['region'] = json_info['region']
if 'country' in json_info.keys():
json_ret['data']['country'] = json_info['country']
if 'loc' in json_info.keys():
json_ret['data']['loc'] = json_info['loc']
if 'org' in json_info.keys():
json_ret['data']['org'] = json_info['org']
if 'postal' in json_info.keys():
json_ret['data']['postal'] = json_info['postal']
if 'timezone' in json_info.keys():
json_ret['data']['postal'] = json_info['timezone']
except Exception as e:
json_ret['msg'] = str(e)
return json_ret
完成代码编写后,点击右侧【测试】按钮,可以快速测试应用是否可以被OctoMation系统正常调用。
测试通过后,点击按钮【下载应用】,即可获得应用APP的zip包:shakespeare-action-python-IPinfo.zip
。
访问应用APP管理界面https://192.168.0.1/apps
,点击【上传应用】按钮,选择文件shakespeare-action-python-IPinfo.zip
进行上传。
在应用列表中找到IPinfo,点击该应用,为其创建一个资源(对应的API Token)。
用户也可以根据需要编辑、删除该资源,或配置多个不同的资源。
大功告成,现在你可以在作战室或者剧本中使用自己开发的应用了!
因为你,刚刚上传了新的应用APP,浏览器缓存可能没有更新,建议此时刷新一下作战室和剧本编排界面,再开始下面的工作。
在作战室输入框左下角,点击【闪电符号⚡️】,执行应用动作。搜索IPinfo即可找到。
点击应用动作【查询IP地址的地理位置】,输入IP参数,点击【执行】。
应用执行完成后,在作战室中可以查看执行的结果。
如果你的APP动作输出还没有经过渲染,那么你看到的很可能是下面的原始数据。别着急,后面会教你怎么渲染。
在剧本编排过程中,也可以选择IPinfo应用参与事件响应过程的编排调度。
🎉🎉🎉恭喜你!终于完成了自己的第一个OctoMation 应用APP开发!去探索更多的可能吧!
好的应用APP必须配备好的说明文档,让他人在使用时了解该应用的开发背景、注意事项、使用方法等。在应用APP顶级目录里,有readme.md
和readme.html
。默认为readme.md
,您也可以通过config.json
文件修订。
每一个应用APP的动作默认输出结果都是JSON格式的原始数据,如果你想对应用APP动作的输出进行格式化,按照一定的方式进行展示,可以使用模板语言进行渲染。 在应用开发过程中,可以通过APP动作配置界面为动作绑定一个具体的数据结果渲染模板。
例如get_ip_geolocation
输出内容为如下JOSN:
{
"code": 200,
"msg": "",
"data": {
"ip": "8.8.8.8",
"city": "Mountain View",
"region": "California",
"country": "US",
"loc": "37.4056,-122.0775",
"org": "AS15169 Google LLC",
"timezone": "",
"postal": "America/Los_Angeles"
}
}
应用动作get_ip_geolocation对应的渲染模板文件ip_geolocation.art
内容为:
<div class="ant-table ant-table-default ant-table-bordered">
<div class="ant-table-content">
<div class="ant-table-body">
<table>
<thead class="ant-table-thead">
<tr>
<th>
<span class="ant-table-header-column">
<div>
<span class="ant-table-column-title">描述</span>
<span class="ant-table-column-sorter"></span>
</div>
</span>
</th>
<th>
<span class="ant-table-header-column">
<div>
<span class="ant-table-column-title">值</span>
<span class="ant-table-column-sorter"></span>
</div>
</span>
</th>
</tr>
</thead>
<tbody class="ant-table-tbody">
{{each action_results action_result}}
<tr class="ant-table-row">
<td>IP</td>
<td>{{ action_result.data.ip }}</td>
</tr>
<tr class="ant-table-row">
<td>位置</td>
<td>{{action_result.data.country }}/{{action_result.data.region }}/{{action_result.data.city }}</td>
</tr>
<tr class="ant-table-row">
<td>经纬度</td>
<td>{{action_result.data.loc}}</td>
</tr>
<tr class="ant-table-row">
<td>时区</td>
<td>{{action_result.data.timezone}}</td>
</tr>
<tr class="ant-table-row">
<td>邮编</td>
<td>{{action_result.data.postal}}</td>
</tr>
{{/each}}
</tbody>
</table>
</div>
</div>
</div>
经过渲染之后,上述返回值的结果可以通过表格方式展示。
在应用APP顶级目录下创建单元测试代码,方便未来测试团队使用自动化测试工具进行回测。