我的第一个OctoMation 应用APP开发 - flagify-com/OctoMation GitHub Wiki

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

如果你需要下载,使用或参与贡献社区应用APP,请访问🚀OctoMationApps🚀这个项目。

1. 应用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

2. 应用开发辅助工具

让我们正式开始吧!假设OctoMation的地址是https://192.168.0.1/,在你成功登录后使用浏览器访问:https://192.168.0.1/dev即可进入图形化应用开发工具的界面,这是OctoMation项目团队专门为你准备的辅助工具。

2.1 填写应用基本信息

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

image

2.2 设置应用资源配置参数

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

image

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

image

2.3 设置应用动作及出入参数

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

image

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

image

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

image

3. 生成APP主文件

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

image

4. 编写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 

5. 测试APP

完成代码编写后,点击右侧【测试】按钮,可以快速测试应用是否可以被OctoMation系统正常调用。 image

6. 打包上传应用APP

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

6.1 上传应用APP

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

image

6.2 配置应用APP

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

image

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

image

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

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

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

7.1 作战室中使用应用APP

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

image

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

image

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

image

如果你的APP动作输出还没有经过渲染,那么你看到的很可能是下面的原始数据。别着急,后面会教你怎么渲染。

image

7.2 剧本编排中使用应用APP

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

image

🎉🎉🎉恭喜你!终于完成了自己的第一个OctoMation 应用APP开发!去探索更多的可能吧!


8. 应用APP开发进阶版

8.1 编写应用APP说明文档

好的应用APP必须配备好的说明文档,让他人在使用时了解该应用的开发背景、注意事项、使用方法等。在应用APP顶级目录里,有readme.mdreadme.html。默认为readme.md,您也可以通过config.json文件修订。

image

8.2 渲染应用输出结果

每一个应用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内容为:

<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

8.3 编写单元测试(增强)

在应用APP顶级目录下创建单元测试代码,方便未来测试团队使用自动化测试工具进行回测。

image

⚠️ **GitHub.com Fallback** ⚠️