插件开发

原理

hook

  • osroom系统提供部分功能的hook, 供插件开发使用.
  1. 比如osroom文件上传功能的hookname"file_storage".
  2. 当程序执行文件上传时,会检查是否存在hookname"file_storage", 并且已经激活的插件.
  3. 如果存在, 且已激活, 则调用此插件完成文件上传, 插件需要按规定返回规定格式的结果.

目录结构

  1. - plugin_test # 为你的插件名称, 可自定义
  2. | - main.py # 调用主程序
  3. | - config.py # 插件配置
  4. | - conf.yaml # 插件安装配置,比如名称之类的
  5. | - README.md # 说明

conf.yaml

conf.yaml示范

  1. # 插件名称必须和主目录名称一致
  2. alias_name: plugin_test
  3. author: Allen Woo
  4. author_uri: www.xxx.com/plugin
  5. plugin_uri: www.xxx.com/plugin
  6. introduce: 这里是简单介绍.
  7. version: v0.1
  8. license: BSD-3
  9. hook_name: file_storage
  10. startup_file_name: main.py
  11. execution_func_name: main

config.py

config.py示范

  1. # 插件名称
  2. PLUGIN_NAME = "plugin_test"
  3. # 插件配置格式
  4. CONFIG = {
  5. "TEST1":{
  6. "info":"我是示范配置",
  7. "value_type":"string",
  8. "value":"test",
  9. "reactivate":True
  10. },
  11. "TEST2":{
  12. "info":"我是示范配置2",
  13. "value_type":"password",
  14. "value":"123456",
  15. "reactivate":True
  16. },
  17. "TEST3":{
  18. "info":"我是示范配置3",
  19. "value_type":"int",
  20. "value":123,
  21. "reactivate":False
  22. },

mian.py

main.py示范, 包括import_plugin_config, get_plugin_config的使用

  1. # -*-coding:utf-8-*-
  2. # 导入插件里的其他程序方法
  3. from apps.core.plug_in.config_process import import_plugin_config, get_plugin_config
  4. from apps.plugins.plugin_test.upfile_cloud import fun_test
  5. from apps.plugins.plugin_test.config import CONFIG, PLUGIN_NAME
  6. '''
  7. osroom提供了插件设置导入函数
  8. import_plugin_config(<plugin name>, <config:dict>)
  9. 可以用于把插件的一些设置导入到osroom系统保存, 方便调用.
  10. 比如密码之类数据.
  11. 之后可以调用get_plugin_config(<plugin name>, <str>)获取导入的dict数据中
  12. '''
  13. # 导入插件的设置
  14. import_plugin_config(PLUGIN_NAME, CONFIG)
  15. # 调用插件插件的设置
  16. get_plugin_config(PLUGIN_NAME, "TEST1")
  17. def main(**kwargs):
  18. '''
  19. 主函数
  20. :param kwargs:
  21. :return:
  22. '''
  23. # 这里可以调用其他程序方法来完成工作...
  24. ...
  25. # 最后返回结果
  26. return data

实例参考

https://github.com/osroom-pluginshttps://github.com/osroom-plugins/aliyun_oss_plugin

hook

目前osroom提供以下hook

file_storage文件存储

主要用于接入第三方图床/文集储存, 如aliyun oss, 七牛云存储. 解决集群部署图片等文件保存问题.

  1. hookname: file_storage
  2. 1.上传
  3. 插件接受参数:
  4. action"upload"
  5. localfile_path:<str> 服务器本地文件路径
  6. filename <str>,要保存的文件名
  7. prefix:<str>,要保存的文件名前缀
  8. 返回结果格式:
  9. {type:"<你的储存平台名>", ...其他任意需要保存的信息}
  10. 如{"type":"aliyun_oss", "bucket_name":"demo_osr"}
  11. 2. 复制文件
  12. 插件接受参数:
  13. action"copy_file"
  14. file_url_obj:<dict> 在使用插件上传时, 插件返回的结果dict
  15. new_filename:<str>, 新文件名
  16. 返回结果格式:
  17. 复制的副本文件的{type:"<你的储存平台名>", ...其他需要保存的信息}
  18. 3.删除文件
  19. 插件接收参数:
  20. action"delete"
  21. file_url_obj:<dict> 在使用插件上传或复制时, 插件返回的结果dict
  22. 返回的结果格式:
  23. bool值, 删除成功:True 删除失败False
  24. 4.重命名
  25. 插件接收参数:
  26. action"rename"
  27. file_url_obj:<dict> 在使用插件上传或复制时, 插件返回的结果dict
  28. new_filename:<str>, 新名称
  29. 返回的结果格式:
  30. bool值, 删除成功:True 删除失败False
  31. 5. 获取文件url
  32. 插件接收参数:
  33. action"get_file_url"
  34. file_url_obj:<dict> 在使用插件上传或复制时, 插件返回的结果dict
  35. 返回的结果格式:
  36. 成功:return url
  37. 失败:return None

短信发送send_msg

发送短信

  1. hookname: send_msg
  2. 1.短信发送
  3. 插件接受参数:
  4. to_numbers:<list> 发送到哪些号码,这是一个list
  5. content:<str>,发送的内容
  6. 需要返回的结果格式:
  7. bool值, 成功:True 失败False

邮件send_email

邮件发送

  1. hooknamesend_email
  2. 1.邮件发送
  3. 插件接受参数:
  4. recipients:<list>收件人, 数组类型如:["xxxxx.xx@osroom.com"]
  5. send_independently:<bool> 如果为Ture,给每个收件人独立发送, 不一次性发送给多个,导致收件人邮件中可以看到此邮件发送给了多少人,
  6. subject:<str> 邮件标题
  7. html:<str> html格式邮件
  8. text:<str> text格式邮件
  9. attach : <str> 附件文件路径
  10. 需要返回的结果格式:
  11. bool值, 成功:True 失败False

内容安全检测

用于检测内容安全, 比如鉴定文本, 图片等文件敏感信息.

  1. 1. 文本安全鉴定
  2. hookname: content_inspection_text
  3. 插件接受参数:
  4. content:<str>, 需要检查的文本
  5. 需要返回的结果格式:
  6. dict: {"lable":"<鉴定结果的类型>", "score":<int or float>}
  7. score范围是1100分,违规越可疑,分值越高. 如果无法判断是否正常或违规,那就返回
  8. {"suggestion”:"review", "lable":"<鉴定结果的类型>", score":0}
  9. 2. 图片安全鉴定
  10. hookname: content_inspection_image
  11. 插件接受参数:
  12. url:<str>, 可获取的图片url
  13. 需要返回的结果格式:
  14. dict: {"lable":"<鉴定结果的类型>", "score":<int or float>}
  15. score范围是1100分,违规越可疑,分值越高. 如果无法判断是否正常或违规,那就返回
  16. {"suggestion”:"review", "lable":"<鉴定结果的类型>", score":0}
  17. 2. 视频安全鉴定
  18. hookname: content_inspection_video
  19. 插件接受参数:
  20. url:<str>, 可获取的视频url
  21. 需要返回的结果格式:
  22. dict: {"lable":"<鉴定结果的类型>", "score":<int or float>}
  23. score范围是1100分,违规越可疑,分值越高. 如果无法判断是否正常或违规,那就返回
  24. {"suggestion”:"review", "lable":"<鉴定结果的类型>", score":0}
  25. 2. 音频安全鉴定
  26. hookname: content_inspection_audio
  27. 插件接受参数:
  28. url:<str>, 可获取的音频url
  29. 需要返回的结果格式:
  30. dict: {"lable":"<鉴定结果的类型>", "score":<int or float>}
  31. score范围是1100分,违规越可疑,分值越高. 如果无法判断是否正常或违规,那就返回
  32. {"suggestion”:"review", "lable":"<鉴定结果的类型>", score":0}

ip geo

根据IP获取geo(地理位置), osroom中用于鉴定用户登录地区, 识别用户登录是否异常等功能中

  1. hookname: ip_geo
  2. 插件接受参数:
  3. ip: ip地址
  4. 需要返回的结果格式:
  5. dict
  6. {
  7. "continent":{
  8. "code":"<code>",
  9. "name":"<名称>",
  10. "names":"<其他语言名称>"
  11. },
  12. "country":{
  13. "iso_code":"<iso code>",
  14. "name":"<名称>",
  15. "names":"<其他语言名称>"
  16. },
  17. "subdivisions":{
  18. "iso_code":"<iso code>",
  19. "name":"<名称>",
  20. "names":"<其他语言名称>"
  21. },
  22. "coordinates":{
  23. "lat":"<location latitude>",
  24. "lon":"<location longitude>",
  25. "accuracy_radius":"<accuracy radius>",
  26. "time_zone":"<time zone>"
  27. },
  28. "post":{
  29. "code":"< code>"
  30. }
  31. }

第三方登录

通过第三方平台验证登录, 如wechat,qq

  1. hookname: wechat_login
  2. hookname: qq_login
  3. hookname: github_login
  4. hookname: sina_weibo_login
  5. hookname: alipay_login
  6. hookname: facebook_login
  7. hookname: twitter_login
  8. 插件接受参数:
  9. request_argget_all:<obj>, 一个获取第三方平台登录验证后,回调osroom系统url时传过来的数据.
  10. 登录回调地址:
  11. http://youdomain/open-api/sign-in/third-party/<platform>/callback
  12. 比如:微信登录可以这样回调:/open-api/sign-in/third-party/wechat/callback
  13. 第三方平台回调地址后, 系统会根据地址执行相关的登录插件
  14. 如:/open-api/sign-in/third-party/wechat/callback 则执行wechat登录插件
  15. request_argget_all使用:
  16. 在插件中可以使用osroom传入的request_argget_all对象获取登录回调地址参数
  17. 使用方式: request_argget.all("unionid"), 获取用户唯一标识
  18. 插件需要返回结果格式:
  19. {
  20. "unionid":<用户唯一标示> # 必须返回
  21. "nickname": <用户昵称>,
  22. "gender" :<性别>, # 只能是 "secret", "m", "f"中的一个,分别代表保密, 男, 女
  23. "email" :<email>,
  24. "avatar_url":<头像地址>,
  25. "province" :<地址区>,
  26. "city": <地址城市>,
  27. "country":<地址国家>
  28. }