用node.js實現在企業微信設定成員個性化歡迎語

Roy155發表於2020-09-04

目標:

在企業微信上只能設定統一的新客戶歡迎語,因此我們透過API來實現為對每個成員設定個性化歡迎語。

實現環境:

白碼低程式碼平臺 (該平臺提供企業微信API,可直接呼叫,減少前期配置除錯工作)

平臺語言:

使用 node.js開發

準備工作:

  1. 準備一個 企業微信管理員賬號

  2. 獲取成員資訊(主要是 userid,可參考我以往文章:Node.JS呼叫企業微信API:成員的增刪查改)


請結合以下內容閱讀:

  1. 企業微信上傳臨時素材API:https://work.weixin.qq.com/api/doc/90000/90135/90253

  2. 企業微信傳送新客戶歡迎語API:https://work.weixin.qq.com/api/doc/90000/90135/92137

  3. 企業微信新增客戶回撥事件:https://work.weixin.qq.com/api/doc/90000/90135/92130

  4. 白碼使用的企業微信API庫:

實現步驟:

1、建立“新客戶歡迎語”資料表以儲存成員的歡迎語資料。

2、建立上傳臨時素材的雲函式。

配置API引數:

程式碼:

async function run($input, $output, $modules = modules) {
 
    let image_url = $input.image_url;
let mediaName = new Date().getTime() + ".png";
 
    //上傳臨時素材
let media = await modules.wxworkApi.uploadMediaByUrl(image_url, "image", mediaName);
 
    //輸出
    $output.media_id = media.media_id;
$output.created_at = media.created_at;
 
}


3、建立新建歡迎語功能(根據需求自行構建),並呼叫“上傳臨時素材”雲函式:

4、建立傳送新客戶歡迎語云函式,並建立一個功能呼叫它。

配置:

程式碼:

async function run($input, $output, $modules = modules) {
 
    let commonWelcomeQuery = await modules.data.queryData("5f4647d829fa640a919d57ff", { "5f464815e233c00a9094345e": "通用" });
    if (commonWelcomeQuery.length > 0) {
        //初始化為通用歡迎語
        let welcome = commonWelcomeQuery[0];
        //根據userid查詢成員的歡迎語
        let welcomeQuery = await modules.data.queryData("5f4647d829fa640a919d57ff", { "5f46482d29fa640a919d5801": $input.userid });
        welcome = welcomeQuery.length > 0 ? welcomeQuery[0] : welcome;
 
        let nowTime = new Date().getTime();
        //歡迎語初始化為傳送文字內容
        let msgData = {
            welcome_code: $input.welcomeCode,
            text: {
                content: welcome["5f46483929fa640a919d5802"]
            }
        };
        let create_at = "";
        let isExpired = false;
        let media_id = "";
        switch (welcome["5f464af329fa640a919d5809"]) {//歡迎語型別
            case "圖片":
                create_at = new Number(welcome["5f464de7e233c00a9094346e"] + "000");
                isExpired = (nowTime - create_at) > 3 * 24 * 60 * 60 * 1000;//素材超過3天失效
                media_id = welcome["5f464dc0e233c00a9094346d"];
                if (isExpired) {
                    //重新上傳圖片
                    let mediaName = new Date().getTime() + ".png";
                    let getMediaId = await modules.wxworkApi.uploadMediaByUrl(welcome["5f464dc0e233c00a9094346d"], "image", mediaName);
                    media_id = getMediaId.media_id;
                    //更新圖片素材
                    let form = {
                        "5f464dc0e233c00a9094346d": getMediaId.media_id,
                        "5f464de7e233c00a9094346e": getMediaId.created_at
                    }
                    modules.data.updateData("5f4647d829fa640a919d57ff", welcome._id, form);
                }
                //文字+圖片
                msgData = {
                    welcome_code: $input.welcomeCode,
                    text: {
                        content: welcome["5f46483929fa640a919d5802"]
                    },
                    image: {
                        media_id: media_id
                    }
                };
                break;
            case "圖文":
                //文字+圖文
                msgData = {
                    welcome_code: $input.welcomeCode,
                    text: {
                        content: welcome["5f46483929fa640a919d5802"]
                    },
                    link: {
                        title: welcome["5f46486329fa640a919d5804"],
                        picurl: welcome["5f46487029fa640a919d5805"],
                        desc: welcome["5f464878e233c00a90943460"],
                        url: welcome["5f464881e233c00a90943461"]
                    }
                };
                break;
            case "小程式":
                create_at = new Number(welcome["5f464e10e233c00a90943472"] + "000");
                isExpired = (nowTime - create_at) > 3 * 24 * 60 * 60 * 1000;//臨時素材超過3天失效
                media_id = welcome["5f464e06e233c00a90943471"];
                if (isExpired) {
                    //重新上傳封面
                    let mediaName = new Date().getTime() + ".png";
                    let getMediaId = await modules.wxworkApi.uploadMediaByUrl(welcome["5f4722b4e233c00a90943587"], "image", mediaName);
                    media_id = getMediaId.media_id;
                    //更新小程式封面素材
                    let form = {
                        "5f464e06e233c00a90943471": getMediaId.media_id,
                        "5f464e10e233c00a90943472": getMediaId.created_at
                    }
                    modules.data.updateData("5f4647d829fa640a919d57ff", welcome._id, form)
                }
                //文字+小程式
                msgData = {
                    welcome_code: $input.welcomeCode,
                    text: {
                        content: welcome["5f46483929fa640a919d5802"]
                    },
                    miniprogram: {
                        title: welcome["5f464891e233c00a90943462"],
                        pic_media_id: media_id,
                        appid: welcome["5f4648a4e233c00a90943463"],
                        page: welcome["5f4648afe233c00a90943464"]
                    }
                };
                break;
        }
        //傳送歡迎語
        modules.wxworkApi.request(
            {
                method: 'post',
                url: 'externalcontact/send_welcome_msg',
                data: msgData
            }
        )
    }
}


功能:

5、設定回撥事件,在成員新增外部聯絡人時傳送歡迎語(回撥事件的具體實現過程可參考:Node.JS呼叫企業微信API:自建應用的回撥事件)

程式碼:

async function hook($req, $resp, $modules = modules) {
 
    //get 請求用於驗證有效性
    if ($req.method == "GET") {
        /**
         * 企業收到訊息後,需要作如下處理:
         * 1、對msg_signature進行校驗
         * 2、解密Encrypt,得到明文的訊息結構體(訊息結構體後面章節會詳說)
         * 3、如果需要被動回覆訊息,構造被動響應包
         * 4、正確響應本次請求
         * 以上1~2步驟可以直接使用解密函式一步到位。
         * 3步驟其實包含加密被動回覆訊息、生成新簽名、構造被動響應包三個步驟,可以直接使用加密函式一步到位。
         */
        $resp.body = await modules.wxworkApi.getVerifyMsg($req);//處理已封裝,可直接呼叫
    } else if ($req.method == "POST") {
        //無法保證在五秒內處理完成,先回復(企業微信伺服器在五秒內收不到響應會斷掉連線)
        $resp.body = "success";
        //處理
        let handle = async () => {
            //將資料轉換成json
            let data = await modules.wxworkApi.getMsgData($req);
            if (data.Event == "change_external_contact" && data.ChangeType == "add_external_contact") {/**新增客戶事件*/
                //呼叫功能,傳送歡迎語
                modules.program.exec(
                    "5f4735ef00d5f969b43ef012",//功能follow
                    {
                        "5f47360000d5f969b43ef014": {//輸入引數步驟
                            "field_1598502473677": data.Userid,//userid
                            "field_1598502477417": data.WelcomeCode//welcome_code
                        }
                    }
                );
                handle()
            }
        }
    }
}


至此已實現成員個性化歡迎語的功能。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69981626/viewspace-2717178/,如需轉載,請註明出處,否則將追究法律責任。

相關文章