產(chǎn)品介紹
什么是數(shù)環(huán)通
基礎(chǔ)概念講解
應(yīng)用場景
多渠道數(shù)據(jù)融合
業(yè)務(wù)、財務(wù)、辦公自動化
產(chǎn)業(yè)鏈應(yīng)用與數(shù)據(jù)集成
工業(yè)應(yīng)用與設(shè)備互聯(lián)
智慧園區(qū)與未來社區(qū)
快速入門
創(chuàng)建LinkUp
應(yīng)用授權(quán)
判斷用法
監(jiān)控用法
分支用法
列表逐條處理
變量與表達(dá)式
流程管理
項目管理
流程創(chuàng)建
編輯器操作
單步測試與預(yù)覽
試運行
發(fā)布與版本管理
錯誤步驟重試
數(shù)據(jù)同步
JSON Path 使用
輸出處理
數(shù)據(jù)編排
1、功能使用手冊
2、腳本使用手冊
1 、簡單查詢
2、謂詞查詢
3、函數(shù)與表達(dá)式
4、構(gòu)建結(jié)構(gòu)結(jié)果
5、查詢組合
6、排序、分組和聚合
7、處理模型
8、函數(shù)式編程
9、正則表達(dá)式
10、日期、時間處理
11、路徑運算符
12、數(shù)字運算符
13、比較運算符
14、布爾運算符
15、其他運算符
16、字符串函數(shù)
17、數(shù)值函數(shù)
18、 數(shù)字聚合函數(shù)
19、布爾函數(shù)
20、數(shù)組函數(shù)
21、對象函數(shù)
22、日期/時間函數(shù)
23、高階函數(shù)
運行日志
運行記錄
開發(fā)工具
連接器工具
連接器源碼配置
控件類型配置
腳本配置說明
內(nèi)置函數(shù)
應(yīng)用講解
內(nèi)置應(yīng)用
瀏覽器插件
數(shù)據(jù)表
文本字符串
日期
數(shù)據(jù)篩選
數(shù)據(jù)處理
延時處理
數(shù)學(xué)計算器
定時觸發(fā)器
子流程調(diào)用
手動觸發(fā)器
物流地址解析
腳本執(zhí)行器
自定義變量
文件讀取
Webhook
SMTP發(fā)送郵件
文件傳輸
JSON工具
網(wǎng)絡(luò)工具
消息處理
PDF水印工具
文件存儲
API服務(wù)
Http請求
循環(huán)控制
EDI 自定義標(biāo)準(zhǔn)數(shù)據(jù)轉(zhuǎn)換
對象類型判斷
瀏覽器操作
三方應(yīng)用
簡道云
金山數(shù)據(jù)表
抖音
釘釘(自建應(yīng)用)
語雀
金山表單
微信公眾號
企業(yè)微信群機(jī)器人
聚水潭
企業(yè)微信三方授權(quán)
MySQL
SqlServer
ChatGpt
快手
金山輕維表
抖店
維格表
巨量千川
飛書多維表
釘釘機(jī)器人
飛書(自建)
釘釘
百度網(wǎng)盤
QQ郵箱
金山工作表
易知微DTable
MQTT
Doirs
中通快遞
韻達(dá)速遞
企業(yè)微信(代開發(fā))
知乎效果營銷平臺
飛書云文檔
騰訊企業(yè)郵箱
API管理
API管理概述
數(shù)據(jù)概覽
API服務(wù)
訪問憑證
API門戶
API安全密鑰簽名
API監(jiān)控預(yù)警
擴(kuò)展工具
代理網(wǎng)關(guān)
消息處理
管理中心
企業(yè)管理
操作日志
成員管理
開放平臺
開放平臺簡介
接入教程
常見問題
數(shù)環(huán)通ip白名單
最佳實踐
彥祖文化 |通過數(shù)環(huán)通實現(xiàn)全渠道數(shù)據(jù)融合打通
新石器|通過數(shù)環(huán)通實現(xiàn)跨系統(tǒng)、跨部門高效協(xié)同
幫助首頁
開發(fā)工具
腳本配置說明
腳本配置說明
## 一、新增腳本 點擊新增腳本,創(chuàng)建腳本。 ## 二、腳本配置 腳本名稱:可自定義腳本名稱 腳本使用場景碼:請輸入英文 腳本類型:支持 java、JS、python 腳本源代碼:可輸入或直接粘貼代碼 ## 三、腳本示例 ### 1、簽名腳本 如何使用簽名腳本: (1)首先在腳本管理中創(chuàng)建腳本   腳本名稱可以可以自己定義,腳本使用場景編碼使用英文命名,如:sign;腳本類型可以選擇自己使用的開發(fā)語言。 (2)編寫腳本 在應(yīng)用 shuhuan-ipaas-app-libs 的 signer 目錄下開發(fā)簽名類,簽名算法改成通過 java 執(zhí)行=腳本=的方案實現(xiàn)簽名算法,簽名類需要繼承 JavaScriptRunner 類重寫 execute 方法 ``` /** * @author yunmu * @date 2022-03-04 6:44 下午 */ public abstract class JavaScriptRunner { public abstract <T> T execute(Object params); } ``` params 是一個 Map 對象,Map 中會包含以下數(shù)據(jù): * 上下文參數(shù)數(shù)據(jù) * signRequest 待簽名的 http 請求獲取方式: ``` 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; //固定寫法 ,獲取 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 請求的數(shù)據(jù) QueryString queryString = apiRequest.getQueryString(); // ******開始業(yè)務(wù)邏輯,根據(jù)實際的簽名要求編寫 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ù)邏輯 //以下為固定格式,不要動 Map<String, String> resultMap = new HashMap<>(); resultMap.put(SignConfigConstant.SIGNATURE, signature); resultMap.put(SignConfigConstant.STRING_TO_SIGN, stringToSign); return (T) resultMap; } // 代碼一, 簽名排序代碼. // pmap 為所有參數(shù), TreeMap 表示為樹形結(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í)行動作中使用簽名 點擊簽名配置,選擇新增   選擇已經(jīng)創(chuàng)建好的腳本,且可以向腳本中傳遞參數(shù),參數(shù)的 key 可以自己命名,參數(shù)的值可以自己寫成固定的,也可以使用授權(quán)時寫入的變量; 如授權(quán)時的參數(shù):  則可以通過如下形式獲取變量:  在腳本簽名代碼中通過如下方式獲取到數(shù)據(jù): private static final String APP_KEY = "app_key"; private static final String APP_SECRET="app_secret";  ### 2、觸發(fā)器腳本 有些應(yīng)用會推送消息,需要接收消息并處理接收到的數(shù)據(jù),譬如解密數(shù)據(jù)、判斷數(shù)據(jù)是否符合要求,這時需要通過腳本來處理。 (1)定義觸發(fā)器  觸發(fā)器需要輸入動作的名稱和動作 key,動作 key 非常重要,不能重復(fù),必須和代碼中的 eventType 值一樣。 (2)編碼觸發(fā)消息處理腳本 編寫事件回調(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": "會議簽到" }, "fields": { "姓名": "草料", "手機(jī)": "18888648888", "微信名": "CHEN", "身份證號": "330200000000000000", "工號": "FBI100", "單選項": "是" } } } } @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": "會議簽到" }, "fields": { "姓名": "草料", "手機(jī)": "18888648888", "微信名": "CHEN", "身份證號": "330200000000000000", "工號": "FBI100", "單選項": "是" } } } }] } */ public static JSONObject buildPushEventOutput(Object params) { JSONObject output = new JSONObject(); if (!(params instanceof Map)) { log.error("當(dāng)前腳本入?yún)㈩愋湾e誤!期望是 Map,但是實際為{},具體值為{}", params.getClass().getName(), JSON.toJSONString(params)); return output; } JSONObject input = (JSONObject) params; /** * 這里的事件內(nèi)容的數(shù)據(jù)類型,有可能是數(shù)組,也可能是對象,具體按照推送方格式為準(zhǔn),作匹配的處理: * 1.解密(不是所有的消息都需要做) * 2.獲取事件的標(biāo)識 * 3.將事件標(biāo)識轉(zhuǎn)換為觸發(fā)器的 key * 4.構(gòu)造接口返回,務(wù)必與推送方要求保持一致 */ /* 1. 解密 該參數(shù)包含秘鑰等信息,如果推送數(shù)據(jù)是密文,可以用該參數(shù)里的秘鑰進(jìn)行解密,例如: 首先獲取授權(quán)時填寫的信息 JSONObject asset = input.getJSONObject(ASSET); String encrypt = input.getJSONObject(BODY).getString("encrypt"); 獲取授權(quán)時填寫的解密秘鑰 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. 獲取對應(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. 對應(yīng)事件的輸出內(nèi)容,這里的內(nèi)容是外部應(yīng)用推送過來的原始數(shù)據(jù),與觸發(fā)器的輸出字段保持一致 item.put(EVENT_CONTENT, JSON.parseObject(data.getString("data"))); eventContents.add(item); output.put(EVENT_CONTENTS, eventContents); //推送事件后的響應(yīng)結(jié)果,必須和推送方要求的返回結(jié)果一致,固定寫法 Map<String, Object> result = new HashMap<>(16); result.put("code", 0); result.put("message", "success"); output.put(RESULT, result); return output; } } 腳本返回數(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": "會議簽到" }, "fields": { "姓名": "草料", "手機(jī)": "18888648888", "微信名": "CHEN", "身份證號": "330200000000000000", "工號": "FBI100", "單選項": "是" } } } }] } ``` ## 四、腳本 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)行編寫腳本,SDK Demo 中所引用的依賴均可以在數(shù)環(huán)通腳本中使用。*
上一篇
控件類型配置
下一篇
內(nèi)置函數(shù)
手機(jī)掃碼
復(fù)制鏈接
手機(jī)掃一掃轉(zhuǎn)發(fā)分享
復(fù)制鏈接
Markdown文件
分享
鏈接
類型
密碼
更新密碼
澳门久久_av毛片在线免费观看_亚洲色欲色欲www_久久成人免费_久久精品小短片_aaa在线
999国内精品视频在线
|
91入口在线观看
|
久久黄色网页
|
一区二区三区欧美在线
|
黄色欧美成人
|
国产精品jizz在线观看美国
|
国产精品.com
|
久久国产高清
|
久久国产精品久久久久久电车
|
国产日韩欧美一区二区
|
日韩精品久久久
|
欧美高清视频一区
|
欧美日韩天堂
|
一区二区三区四区五区精品视频
|
国产精品亚洲综合
|
岛国视频一区免费观看
|
看高清中日韩色视频
|
日韩欧美国产二区
|
激情一区二区三区
|
91久久极品少妇xxxxⅹ软件
|
精品成人久久
|
国产伦精品一区二区三区视频孕妇
|
欧美18视频
|
亚州欧美一区三区三区在线
|
影音先锋在线一区
|
99超碰麻豆
|
亚洲一区二区三区加勒比
|
国产欧美丝祙
|
韩国一区二区三区美女美女秀
|
黄色一区二区三区四区
|
91观看网站
|
国产综合欧美在线看
|
136国产福利精品导航网址
|
亚洲精品乱码久久久久久蜜桃麻豆
|
裸模一区二区三区免费
|
国产日韩欧美精品
|
精品一区二区不卡
|
欧美精品亚洲精品
|
亚洲精品成人自拍
|
亚洲欧洲久久
|
91精品国产高清久久久久久91裸体
|
国产精品视频一区二区三区经
|
99国产视频在线
|
国产一区二区高清视频
|
国产精品日本一区二区
|
视频在线99
|
亚洲国产高清视频
|
成人在线看片
|
亚洲欧洲另类精品久久综合
|
亚洲人体一区
|
国产自产精品
|
伊人久久婷婷
|
精品国产一区二区三区日日嗨
|
亚洲一区二区三区午夜
|
母乳一区在线观看
|
亚洲国产精品视频一区
|
国产日韩视频
|
亚洲va韩国va欧美va精四季
|
亚洲精品乱码
|
日本视频一区二区在线观看
|
99精品福利视频
|
日本一区二区三区视频在线观看
|
黑丝一区二区
|
国产精品一区在线播放
|
欧美日一区二区在线观看
|
久久亚洲国产精品一区二区
|
性欧美videosex高清少妇
|
国产精品美女诱惑
|
日本一区二区三区免费观看
|
亚洲一区二区三区免费在线观看
|
日韩在线导航
|
97伦理在线四区
|
国内精品**久久毛片app
|
国产精选一区二区
|
亚洲久色影视
|
亚洲啪啪av
|
成人av网站观看
|
韩国欧美一区
|
日本高清一区
|
999日本视频
|
韩日欧美一区
|
亚洲国产欧美一区二区三区不卡
|
久久这里只有
|
红桃视频欧美
|
亚洲一二三区精品
|
国产午夜精品一区
|
亚洲欧美视频一区二区三区
|
欧美二区视频
|
欧美裸体网站
|
不卡视频一区二区
|
一区二区毛片
|
欧美精品播放
|
日本高清一区
|
国产一区二区不卡视频
|
亚洲一区3d动漫同人无遮挡
|
午夜精彩国产免费不卡不顿大片
|
精品不卡一区二区三区
|
2019国产精品视频
|
国产精品毛片在线
|
亚洲视频高清
|
欧美日韩无遮挡
|
日韩亚洲视频
|
精品久久久久久一区二区里番
|
亚洲女同在线
|
国产视频亚洲
|
欧美日韩亚洲一区二区三区在线
|
免费在线一区二区
|
日韩亚洲国产欧美
|
伊人成人网在线看
|
国模精品娜娜一二三区
|
亚洲7777
|
亚洲啪啪av
|
一区二区三区欧美成人
|
日本精品一区二区三区高清 久久
|
国产精品推荐精品
|
国产成人一区二区三区免费看
|
性色一区二区三区
|
国产精品久久777777毛茸茸
|
亚洲国产专区校园欧美
|
国内精品久久久久久久97牛牛
|
宅男噜噜99国产精品观看免费
|
日韩精品一区二区三区外面
|
欧美三级电影在线播放
|
欧美日韩最好看的视频
|
欧美亚洲精品日韩
|
日韩精品一区二区三区丰满
|
亚州欧美一区三区三区在线
|
亚洲国产高清国产精品
|
在线播放豆国产99亚洲
|
伊人天天久久大香线蕉av色
|
欧美在线精品一区
|
欧美日韩网站
|
亚洲国产午夜
|
午夜在线精品
|
99爱精品视频
|
精品国产一区二区三区麻豆小说
|
久久久综合亚洲91久久98
|
欧美最大成人综合网
|
亚洲欧洲日韩综合二区
|
欧美成熟视频
|
一本色道88久久加勒比精品
|
美女国产一区
|
国产精品免费看一区二区三区
|
精品国产乱码久久久久久88av
|
欧美日韩免费精品
|
一区二区三区四区视频在线
|
黄色成人精品网站
|
新狼窝色av性久久久久久
|
国产福利不卡
|
日本精品一区二区
|
国产精品v欧美精品v日韩
|
久热国产精品
|
精品国产综合久久
|
亚洲高清乱码
|
99日韩精品
|
91九色偷拍
|
色噜噜狠狠一区二区三区
|
国产精品分类
|
美女久久一区
|
蜜桃视频在线观看成人
|
亚洲欧美亚洲
|
久久午夜影视
|
青青草原成人
|
在线成人亚洲
|
7777精品伊久久久大香线蕉语言
|
18成人在线
|
亚洲精品成人三区
|
中文亚洲欧美
|
国模精品一区二区三区
|
午夜精品一区二区三区在线观看
|
欧美日韩在线播放一区二区
|
午夜免费电影一区在线观看
|
亚洲女人av
|
婷婷四房综合激情五月
|
国产精品美女xx
|
欧美高清视频一区
|
亚洲啪啪91
|
欧美日韩国产综合视频在线
|
黄色精品一区
|
国产伦精品一区二区三区
|
欧美黄色aaaa
|
国产精品乱码
|
欧美亚州在线观看
|
成人免费看片网址
|
欧美日韩国产欧
|
国产午夜精品在线
|
亚洲一级网站
|
久久国产精品一区二区三区
|
国产精品啊啊啊
|
九色综合日本
|
国产欧美日韩综合精品二区
|
日韩av图片
|
久久激情婷婷
|
欧美激情亚洲
|
激情五月综合色婷婷一区二区
|
无遮挡亚洲一区
|
91手机在线视频
|
国内精品一区二区
|
久久精品成人一区二区三区蜜臀
|
尹人成人综合网
|