產(chǎn)品介紹
什么是數(shù)環(huán)通
基礎(chǔ)概念講解
應(yīng)用場(chǎng)景
多渠道數(shù)據(jù)融合
業(yè)務(wù)、財(cái)務(wù)、辦公自動(dòng)化
產(chǎn)業(yè)鏈應(yīng)用與數(shù)據(jù)集成
工業(yè)應(yīng)用與設(shè)備互聯(lián)
智慧園區(qū)與未來(lái)社區(qū)
快速入門(mén)
創(chuàng)建LinkUp
應(yīng)用授權(quán)
判斷用法
監(jiān)控用法
分支用法
列表逐條處理
變量與表達(dá)式
流程管理
項(xiàng)目管理
流程創(chuàng)建
編輯器操作
單步測(cè)試與預(yù)覽
試運(yùn)行
發(fā)布與版本管理
錯(cuò)誤步驟重試
數(shù)據(jù)同步
JSON Path 使用
輸出處理
數(shù)據(jù)編排
1、功能使用手冊(cè)
2、腳本使用手冊(cè)
1 、簡(jiǎn)單查詢(xún)
2、謂詞查詢(xún)
3、函數(shù)與表達(dá)式
4、構(gòu)建結(jié)構(gòu)結(jié)果
5、查詢(xún)組合
6、排序、分組和聚合
7、處理模型
8、函數(shù)式編程
9、正則表達(dá)式
10、日期、時(shí)間處理
11、路徑運(yùn)算符
12、數(shù)字運(yùn)算符
13、比較運(yùn)算符
14、布爾運(yùn)算符
15、其他運(yùn)算符
16、字符串函數(shù)
17、數(shù)值函數(shù)
18、 數(shù)字聚合函數(shù)
19、布爾函數(shù)
20、數(shù)組函數(shù)
21、對(duì)象函數(shù)
22、日期/時(shí)間函數(shù)
23、高階函數(shù)
運(yùn)行日志
運(yùn)行記錄
開(kāi)發(fā)工具
連接器工具
連接器源碼配置
控件類(lèi)型配置
腳本配置說(shuō)明
內(nèi)置函數(shù)
應(yīng)用講解
內(nèi)置應(yīng)用
瀏覽器插件
數(shù)據(jù)表
文本字符串
日期
數(shù)據(jù)篩選
數(shù)據(jù)處理
延時(shí)處理
數(shù)學(xué)計(jì)算器
定時(shí)觸發(fā)器
子流程調(diào)用
手動(dòng)觸發(fā)器
物流地址解析
腳本執(zhí)行器
自定義變量
文件讀取
Webhook
SMTP發(fā)送郵件
文件傳輸
JSON工具
網(wǎng)絡(luò)工具
消息處理
PDF水印工具
文件存儲(chǔ)
API服務(wù)
Http請(qǐng)求
循環(huán)控制
EDI 自定義標(biāo)準(zhǔn)數(shù)據(jù)轉(zhuǎn)換
對(duì)象類(lèi)型判斷
瀏覽器操作
三方應(yīng)用
簡(jiǎn)道云
金山數(shù)據(jù)表
抖音
釘釘(自建應(yīng)用)
語(yǔ)雀
金山表單
微信公眾號(hào)
企業(yè)微信群機(jī)器人
聚水潭
企業(yè)微信三方授權(quán)
MySQL
SqlServer
ChatGpt
快手
金山輕維表
抖店
維格表
巨量千川
飛書(shū)多維表
釘釘機(jī)器人
飛書(shū)(自建)
釘釘
百度網(wǎng)盤(pán)
QQ郵箱
金山工作表
易知微DTable
MQTT
Doirs
中通快遞
韻達(dá)速遞
企業(yè)微信(代開(kāi)發(fā))
知乎效果營(yíng)銷(xiāo)平臺(tái)
飛書(shū)云文檔
騰訊企業(yè)郵箱
API管理
API管理概述
數(shù)據(jù)概覽
API服務(wù)
訪問(wèn)憑證
API門(mén)戶(hù)
API安全密鑰簽名
API監(jiān)控預(yù)警
擴(kuò)展工具
代理網(wǎng)關(guān)
消息處理
管理中心
企業(yè)管理
操作日志
成員管理
開(kāi)放平臺(tái)
開(kāi)放平臺(tái)簡(jiǎn)介
接入教程
常見(jiàn)問(wèn)題
數(shù)環(huán)通ip白名單
最佳實(shí)踐
彥祖文化 |通過(guò)數(shù)環(huán)通實(shí)現(xiàn)全渠道數(shù)據(jù)融合打通
新石器|通過(guò)數(shù)環(huán)通實(shí)現(xiàn)跨系統(tǒng)、跨部門(mén)高效協(xié)同
幫助首頁(yè)
開(kāi)發(fā)工具
腳本配置說(shuō)明
腳本配置說(shuō)明
## 一、新增腳本 點(diǎn)擊新增腳本,創(chuàng)建腳本。 ## 二、腳本配置 腳本名稱(chēng):可自定義腳本名稱(chēng) 腳本使用場(chǎng)景碼:請(qǐng)輸入英文 腳本類(lèi)型:支持 java、JS、python 腳本源代碼:可輸入或直接粘貼代碼 ## 三、腳本示例 ### 1、簽名腳本 如何使用簽名腳本: (1)首先在腳本管理中創(chuàng)建腳本   腳本名稱(chēng)可以可以自己定義,腳本使用場(chǎng)景編碼使用英文命名,如:sign;腳本類(lèi)型可以選擇自己使用的開(kāi)發(fā)語(yǔ)言。 (2)編寫(xiě)腳本 在應(yīng)用 shuhuan-ipaas-app-libs 的 signer 目錄下開(kāi)發(fā)簽名類(lèi),簽名算法改成通過(guò) java 執(zhí)行=腳本=的方案實(shí)現(xiàn)簽名算法,簽名類(lèi)需要繼承 JavaScriptRunner 類(lèi)重寫(xiě) execute 方法 ``` /** * @author yunmu * @date 2022-03-04 6:44 下午 */ public abstract class JavaScriptRunner { public abstract <T> T execute(Object params); } ``` params 是一個(gè) Map 對(duì)象,Map 中會(huì)包含以下數(shù)據(jù): * 上下文參數(shù)數(shù)據(jù) * signRequest 待簽名的 http 請(qǐng)求獲取方式: ``` HttpApiRequest apiRequest = (HttpApiRequest) paramsMap.get(SignConfigConstant.SIGN_REQUEST); ``` * 簽名配置中的 signInField 中的信息 * signOutField 簽名的輸出字段 簽名=腳本=示例: ``` package com.shuhuan.ipaas.applibs.signer; import com.aliyun.unicorn.http.MultipartFormData; import com.aliyun.unicorn.http.MultipartFormValue; import com.aliyun.unicorn.http.QueryString; import com.aliyun.unicorn.sdk.HttpApiRequest; import com.aliyun.unicorn.type.Consumer; import com.aliyun.unicorn.type.Parameter; import com.shuhuan.ipaas.common.ResultCode; import com.shuhuan.ipaas.core.encryption.Md5Util; import com.shuhuan.ipaas.exception.IpaasException; import com.shuhuan.ipaas.meta.constants.SignConfigConstant; import com.shuhuan.ipaas.script.java.JavaScriptRunner; import org.apache.commons.lang3.StringUtils; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.TreeMap; /** * @author yunmu * @date 2022-03-05 4:22 下午 */ public class BanniuScriptSigner extends JavaScriptRunner { private static final String METHOD = "method"; private static final String ACCESS_TOKEN = "access_token"; public static final String TIMESTAMP = "timestamp"; private static final String SIGN = "sign"; private static final String APP_KEY = "app_key"; private static final String APP_SECRET=app_secret @Override public <T> T execute(Object params) { if (!(params instanceof Map)){ throw new IpaasException(ResultCode.PARAM_ERROR, "params is not map"); } Map<String,Object> paramsMap = (Map<String, Object>) params; //固定寫(xiě)法 ,獲取 rquest HttpApiRequest apiRequest = (HttpApiRequest) paramsMap.get(SignConfigConstant.SIGN_REQUEST); // 獲取參數(shù) String appKey = (String) paramsMap.get(APP_KEY); String appSecret = (String) paramsMap.get(APP_SECRET); //獲取 http 請(qǐng)求的數(shù)據(jù) QueryString queryString = apiRequest.getQueryString(); // ******開(kāi)始業(yè)務(wù)邏輯,根據(jù)實(shí)際的簽名要求編寫(xiě) TreeMap<String, String> pmap = new TreeMap<>(); queryString.foreachValues((paramKey, value) -> { pmap.put(paramKey, value); }); MultipartFormData formData = apiRequest.getForm(); if (formData != null && !formData.isMultipart()) { apiRequest.getForm().foreach(new Consumer<Parameter<MultipartFormValue>>() { @Override public void accept(Parameter<MultipartFormValue> a) { String v = a.getFirstValue() != null ? a.getFirstValue().getValue() : null; if (METHOD.equals(a.getName())) { pmap.put(METHOD, v); } if (ACCESS_TOKEN.equals(a.getName())) { pmap.put(ACCESS_TOKEN, v); } if (TIMESTAMP.equals(a.getName())) { pmap.put(METHOD, v); } if (ACCESS_TOKEN.equals(a.getName())) { pmap.put(ACCESS_TOKEN, v); } } }); } String stringToSign = sign(pmap, appSecret); String signature = Md5Util.md5(stringToSign, "utf-8").toUpperCase(); //把簽名放入 http 參數(shù) queryString.add(SIGN, signature); // ****結(jié)束業(yè)務(wù)邏輯 //以下為固定格式,不要?jiǎng)? Map<String, String> resultMap = new HashMap<>(); resultMap.put(SignConfigConstant.SIGNATURE, signature); resultMap.put(SignConfigConstant.STRING_TO_SIGN, stringToSign); return (T) resultMap; } // 代碼一, 簽名排序代碼. // pmap 為所有參數(shù), TreeMap 表示為樹(shù)形結(jié)構(gòu)的哈希容器 // appSecret 班牛分配給您的密鑰 private String sign(TreeMap<String, String> pmap, String appSecret) { StringBuilder sb = new StringBuilder(appSecret); Iterator i$ = pmap.entrySet().iterator(); while (i$.hasNext()) { Map.Entry<String, String> entry = (Map.Entry) i$.next(); String name = entry.getKey(); String value = entry.getValue(); if (StringUtils.isNoneEmpty(new String[]{name, value})) { sb.append(name).append(value); } } sb.append(appSecret); return sb.toString(); } } ``` (3)在執(zhí)行動(dòng)作中使用簽名 點(diǎn)擊簽名配置,選擇新增   選擇已經(jīng)創(chuàng)建好的腳本,且可以向腳本中傳遞參數(shù),參數(shù)的 key 可以自己命名,參數(shù)的值可以自己寫(xiě)成固定的,也可以使用授權(quán)時(shí)寫(xiě)入的變量; 如授權(quán)時(shí)的參數(shù):  則可以通過(guò)如下形式獲取變量:  在腳本簽名代碼中通過(guò)如下方式獲取到數(shù)據(jù): private static final String APP_KEY = "app_key"; private static final String APP_SECRET="app_secret";  ### 2、觸發(fā)器腳本 有些應(yīng)用會(huì)推送消息,需要接收消息并處理接收到的數(shù)據(jù),譬如解密數(shù)據(jù)、判斷數(shù)據(jù)是否符合要求,這時(shí)需要通過(guò)腳本來(lái)處理。 (1)定義觸發(fā)器  觸發(fā)器需要輸入動(dòng)作的名稱(chēng)和動(dòng)作 key,動(dòng)作 key 非常重要,不能重復(fù),必須和代碼中的 eventType 值一樣。 (2)編碼觸發(fā)消息處理腳本 編寫(xiě)事件回調(diào)數(shù)據(jù)處理 =腳本= 。 例如 java 腳本,必須繼承 JavaScriptRunner, ``` package com.shuhuan.ipaas.applibs.dealPushEventContent.caoliao; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.google.common.collect.Lists; import com.shuhuan.ipaas.script.java.JavaScriptRunner; import lombok.extern.slf4j.Slf4j; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 推送事件 數(shù)據(jù)處理 * 文檔地址: https://cli.im/help/65847 */ @Slf4j public class caoliaoDemo extends JavaScriptRunner { //以下定義的變量是固定的,不要改 private static final String EVENT_TYPE = "eventType"; private static final String BODY = "body"; private static final String EVENT_CONTENTS = "eventContents"; private static final String EVENT_CONTENT = "eventContent"; private static final String ASSET = "asset"; private static final String RESULT = "result"; //結(jié)束固定變量定義 @Override public <T> T execute(Object params) { return (T) buildPushEventOutput(params); } /* { "asset": {}, "body": { "time": "2022-06-30 17:06:39", "event": "FORM_DATA_SUBMIT", "data": { "ref_data": { "created_at": "2022-06-30 17:06:39", "serial_number": "L1000001", "form": { "number": "D20", "name": "會(huì)議簽到" }, "fields": { "姓名": "草料", "手機(jī)": "18888648888", "微信名": "CHEN", "身份證號(hào)": "330200000000000000", "工號(hào)": "FBI100", "單選項(xiàng)": "是" } } } } @return { "result": { "code": 200, "message": "success" }, "eventContents": [{ "eventType": "FORM_DATA_SUBMIT", "eventContent": { "ref_data": { "created_at": "2022-06-30 17:06:39", "serial_number": "L1000001", "form": { "number": "D20", "name": "會(huì)議簽到" }, "fields": { "姓名": "草料", "手機(jī)": "18888648888", "微信名": "CHEN", "身份證號(hào)": "330200000000000000", "工號(hào)": "FBI100", "單選項(xiàng)": "是" } } } }] } */ public static JSONObject buildPushEventOutput(Object params) { JSONObject output = new JSONObject(); if (!(params instanceof Map)) { log.error("當(dāng)前腳本入?yún)㈩?lèi)型錯(cuò)誤!期望是 Map,但是實(shí)際為{},具體值為{}", params.getClass().getName(), JSON.toJSONString(params)); return output; } JSONObject input = (JSONObject) params; /** * 這里的事件內(nèi)容的數(shù)據(jù)類(lèi)型,有可能是數(shù)組,也可能是對(duì)象,具體按照推送方格式為準(zhǔn),作匹配的處理: * 1.解密(不是所有的消息都需要做) * 2.獲取事件的標(biāo)識(shí) * 3.將事件標(biāo)識(shí)轉(zhuǎn)換為觸發(fā)器的 key * 4.構(gòu)造接口返回,務(wù)必與推送方要求保持一致 */ /* 1. 解密 該參數(shù)包含秘鑰等信息,如果推送數(shù)據(jù)是密文,可以用該參數(shù)里的秘鑰進(jìn)行解密,例如: 首先獲取授權(quán)時(shí)填寫(xiě)的信息 JSONObject asset = input.getJSONObject(ASSET); String encrypt = input.getJSONObject(BODY).getString("encrypt"); 獲取授權(quán)時(shí)填寫(xiě)的解密秘鑰 String encoding_aes_key = asset.getString("encoding_aes_key"); //按照文檔給的算法進(jìn)行解密 String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"; String KEY_ALGORITHM = "AES"; String CHARSET = "UTF-8"; Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); byte[] key = Base64.decodeBase64(encoding_aes_key); SecretKeySpec keySpec = new SecretKeySpec(key, KEY_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(new byte[16])); String body = new String(cipher.doFinal(Base64.decodeBase64(encrypt)), CHARSET); */ List<JSONObject> eventContents = Lists.newArrayList(); JSONObject data = (JSONObject) input.get(BODY); JSONObject item = new JSONObject(); //2. 獲取對(duì)應(yīng)事件的 key。 String event = (String) data.get("event"); //3. 做觸發(fā)器的 key 與事件的 key 映射 if ("FORM_DATA_SUBMIT".equals(event)) { item.put(EVENT_TYPE, "FORM_DATA_SUBMIT"); } else if ("FORM_DATA_EDITED".equals(event)) { item.put(EVENT_TYPE, "FORM_DATA_EDITED"); } else if ("FORM_DATA_REVIEW".equals(event)) { item.put(EVENT_TYPE, "FORM_DATA_REVIEW"); } //4. 對(duì)應(yīng)事件的輸出內(nèi)容,這里的內(nèi)容是外部應(yīng)用推送過(guò)來(lái)的原始數(shù)據(jù),與觸發(fā)器的輸出字段保持一致 item.put(EVENT_CONTENT, JSON.parseObject(data.getString("data"))); eventContents.add(item); output.put(EVENT_CONTENTS, eventContents); //推送事件后的響應(yīng)結(jié)果,必須和推送方要求的返回結(jié)果一致,固定寫(xiě)法 Map<String, Object> result = new HashMap<>(16); result.put("code", 0); result.put("message", "success"); output.put(RESULT, result); return output; } } 腳本返回?cái)?shù)據(jù)格式必須是 { "result": { "code": 200, "message": "success" }, "eventContents": [{ "eventType": "FORM_DATA_SUBMIT", "eventContent": { //外部推送的數(shù)據(jù) } }] } 如: { "result": { "code": 200, "message": "success" }, "eventContents": [{ "eventType": "FORM_DATA_SUBMIT", "eventContent": { //外部推送的數(shù)據(jù) "ref_data": { "created_at": "2022-06-30 17:06:39", "serial_number": "L1000001", "form": { "number": "D20", "name": "會(huì)議簽到" }, "fields": { "姓名": "草料", "手機(jī)": "18888648888", "微信名": "CHEN", "身份證號(hào)": "330200000000000000", "工號(hào)": "FBI100", "單選項(xiàng)": "是" } } } }] } ``` ## 四、腳本 SDK 下載 Java 腳本 SDK:[shuhuan-ipaas-script-demo.zip](https://sh-assets.oss-cn-hangzhou.aliyuncs.com/sdk/shuhuan-ipaas-script-demo.zip) *注:可在下載 SDK Demo 中進(jìn)行編寫(xiě)腳本,SDK Demo 中所引用的依賴(lài)均可以在數(shù)環(huán)通腳本中使用。*
上一篇
控件類(lèi)型配置
下一篇
內(nèi)置函數(shù)
手機(jī)掃碼
復(fù)制鏈接
手機(jī)掃一掃轉(zhuǎn)發(fā)分享
復(fù)制鏈接
Markdown文件
分享
鏈接
類(lèi)型
密碼
更新密碼
主站蜘蛛池模板:
国产成人综合视频
|
www.国产精品
|
黄色成人一级片
|
亚洲va中文字幕
|
成人国产精品久久久
|
久久久.com
|
国产精品成人国产乱一区
|
免费观看av电影
|
亚洲天天在线观看
|
欧美成人h版在线观看
|
美日韩精品视频
|
国产精品久久久久久婷婷天堂
|
国产精品久久久久久婷婷天堂
|
中文字幕一区三级久久日本
|
中文在线资源
|
国产精品成人观看视频国产奇米
|
久久久久黑人
|
欧美日韩精品
|
午夜av影视
|
99精品国产高清在线观看
|
在线免费观看av的网站
|
中文字幕高清
|
欧美精品在线观看
|
日韩欧美精品
|
亚洲男女在线
|
日本福利视频网
|
国产精品久久久久久久久久
|
毛片网
|
青青草成人在线
|
国产精品久久久av
|
精品久久久久久国产
|
久久精品视频网站
|
日韩欧美的一区二区
|
91精品视频免费在线观看
|
精品中文字幕一区二区三区av
|
艹久久
|
亚洲男女视频在线观看
|
看亚洲a级一级毛片
|
亚洲综合自拍
|
亚洲夜幕久久日韩精品一区
|
日本中文字幕一区二区
|