Skip to content

我的第一个OctoMation 应用APP开发

fukui edited this page Oct 5, 2023 · 11 revisions

完整地介绍一个应用开发的整个过程。打开右侧导航栏,阅读效果更好->_->

应用APP开发思路

在你正式编写一款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地理信息,预期的效果是这样的:

image

应用开发辅助工具

让我们正式开始吧!假设OctoMation的地址是https://192.168.0.1/,在你成功登录后使用浏览器访问:https://192.168.0.1/dev即可直接进入图形化应用开发工具的界面。

填写应用基本信息

首先需要我们填写该应用有关的基本信息、应用版本、主文件(此处自定义为:ipinfo.py)和Logo图片等。

image

设置应用资源配置参数

要使用IPinfo网站查询的API必须提供一个身份认证的Token,所以我们在资源配置处增加一个token字段。 image

请注意,该字段属于敏感信息,我们选择其类型为password,且必须填写

image

设置应用动作及初入参

每一个应用有一个或者多个动作,接下来我们将创建一个查询IP地理信息的动作:ip_geolocationimage

该动作有一个必填的入参:ip和多个出参:ip国家区域城市坐标组织邮编时区等。

image

点击预览配置文件(config.json),可以查看工具自动生成的配置文件。您也可以按需编辑配置文件。

image

生成APP主文件

点击应用APP开发界面右上角的按钮【生成主文件】,开发工具将自动生成主文件ipinfo.py

image

编写APP逻辑

系统初始生成的主文件很简单,需要你根据实际需求,用详细的Python代码实现具体逻辑。

image

此处是根据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 

测试APP

完成代码编写后,点击右侧【测试】按钮,可以快速测试应用是否可以在系统中运行。 image

测试通过后,点击按钮【下载应用】,即可获得应用APP的zip包:shakespeare-action-python-IPinfo.zip

打包上传应用APP

上传应用APP

访问应用APP管理界面https://192.168.0.1/apps,点击【上传应用】按钮,选择文件shakespeare-action-python-IPinfo.zip上传。 image

配置应用APP

在应用列表中找到IPinfo,点击该应用,为其创建一个资源(对应的API Token)。

image

用户也可以根据需要编辑、删除该资源,或配置多个不同的资源。

image

作战室和剧本中使用应用APP

大功告成,现在你可以在作战室或者剧本中使用自己开发的应用了!

因为你,刚刚上传了新的应用APP,浏览器缓存可能没有更新,建议此时刷新一下作战室和剧本编排界面,再开始下面的工作。

作战室中使用应用APP

在作战室输入框左下角,点击【闪电符号】,执行应用动作。搜索IPinfo即可找到。

image

点击应用动作【查询IP地址的地理位置】,输入IP参数,点击【执行】。

image

应用执行完成后,在作战室中可以查看执行的结果。

image

如果你的APP没有经过渲染,那么你看到的很可能是下面的原始数据。

image

剧本编排中使用应用APP

在剧本编排过程中,也可以选择IPinfo应用参与事件响应。

image

🎉🎉🎉恭喜你!终于完成了自己的第一个OctoMation 应用APP开发!


应用APP开发进阶版

编写应用APP说明文档

好的应用APP必须配备好的说明文档,让他人在使用时了解该应用的开发背景、注意事项、使用方法等。在应用APP顶级目录里,有readme.mdreadme.html,推荐编写readme.md

在线测试应用开发结果

渲染应用输出结果

每一个应用APP的动作默认输出结果都是JSON格式的原始数据,如果你想对应用APP动作的输出进行格式化,按照一定的方式进行展示,可以使用模板语言进行渲染。 在应用开发过程中,可以通过APP动作配置界面为动作绑定一个具体的数据结果渲染模板。

image

例如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`内容为:
```html
<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>

经过渲染之后,上述返回值的结果可以通过表格方式展示。 image

编写单元测试(增强)