回覆關鍵詞的無限擴展機制

来源:https://www.cnblogs.com/timeddd/archive/2019/08/07/11312670.html
-Advertisement-
Play Games

引言 在微信公眾號的開發中,自動回覆關鍵詞主要可回覆的內容為文本消息、圖文消息(目前僅支持一個鏈接)。為了讓關鍵詞支持“ 帶參數 ” 和 無限擴展 ,本文引入一個對接關鍵詞的介面規範,使得關鍵詞可以攜參數一起交由第三方處理,並返回用戶文本消息或圖文消息。 基本原理:為關鍵詞配置回調地址,關鍵詞與參數 ...


引言

在微信公眾號的開發中,自動回覆關鍵詞主要可回覆的內容為文本消息、圖文消息(目前僅支持一個鏈接)。為了讓關鍵詞支持“帶參數” 和 無限擴展,本文引入一個對接關鍵詞的介面規範,使得關鍵詞可以攜參數一起交由第三方處理,並返回用戶文本消息或圖文消息。

基本原理:為關鍵詞配置回調地址,關鍵詞與參數使用空格分隔,第一個空格後邊的均為參數,公眾號在接收到用戶文本消息後,解析關鍵詞與參數,並根據配置將其發送請求給回調地址,獲取返回的處理結果。

本文主要介紹介面的定義,並提供一個具體的介面實現。

1 介面約定

1.1 傳入參數

作為 Request.Body 請求體 POST 給回調地址。

{
    "keyword" : "Keyword",
    "parameter" : "Parameters string",
    "user" : "useropenid"
}

1.2 返回格式

返回結果為 JSON 形式,要求必須有 err_code 與 err_msg 屬性,其中 err_code 為狀態碼,狀態碼為 200 時,表示成功,其它表示失敗。err_msg 表示消息描述。如:

{
    "err_code" : 101,
    "err_msg" : "操作失敗!"
}

當成功時,支持返回“文字”與“鏈接”兩種類型的消息。
使用 key_type 屬性表示,可取值“文字”或"鏈接"。
當 key_type 為“文字”的時候,data 為相應的文本內容。
當 key_type 為“鏈接”的時候,data 為鏈接信息的數組,只是目前只支持一個鏈接。
鏈接的屬性包括:
title : 標題
icon : 圖標
note_desc : 描述
url : 鏈接地址

1.3 文字類型示例

{
    "err_code" : 101,
    "err_msg" : "操作失敗!",
    "key_type" : "文字",
    "data" : "回覆的內容"
}

1.4 鏈接類型示例

{
    "err_code" : 101,
    "err_msg" : "操作失敗!",
    "key_type" : "鏈接",
    "data" : [
        {
            "title" : "一個數學公式",
            "icon" : "http://****/formula.png",
            "note_desc" : "一個神寄的數學公式",
            "url" : "http://****"
        }
    ]
}

2 關鍵詞介面示例

以下為一個完整的介面實現示例。

2.1 功能需求描述

關鍵詞:提取
參數:一段文本或僅是一個 url
功能描述:從文本中提取出郵箱、手機號、身份證號、IPv4 地址(可進一步補充與完善)。如果參數僅是一個 url,則進行提取的文本為請求該 url 所得的內容。

2.2 實現過程

流程:是否僅為url -> 是則請求url 得到內容 -> 根據正則表達式提取匹配數據 -> 根據長度返迴文本消息 或是 返回一個可操作界面的鏈接。

2.2.1 準備好匹配的正則表達式
private static Dictionary<string, string> _RegexDict;
public static Dictionary<string, string> RegexDict
{
    get
    {
        if (_RegexDict == null)
        {
            _RegexDict = new Dictionary<string, string>();
            // _RegexDict.Add("鏈接", @"((ht)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?"); 
            _RegexDict.Add("郵箱", @"[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+");
            _RegexDict.Add("手機號", @"(((13[0-9]{1})|(14[0-9]{1})|(15[0-9]{1})|(17[0-9]{1})|(18[0-9]{1})|(19[0-9]{1}))+\d{8})");
            _RegexDict.Add("身份證號", @"[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]");
            _RegexDict.Add("IPv4地址", @"(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])");
        }
        return _RegexDict;
    }
}
2.2.2 處理過程

一個工具方法,請求 url 獲取內容。

public static string GetUrlContent(string url)
{
    System.Net.WebClient webClientObj = new System.Net.WebClient();
    webClientObj.Encoding = Encoding.UTF8;
    string respInfo = webClientObj.DownloadString(url);
    return respInfo;
}

處理流程實現,建立一個 WebApi,代碼如是說。

public JObject Index([FromBody] JObject body)
{
    string keyword = body.Value<string>("keyword");
    string parameter = body.Value<string>("parameter");
    string user = body.Value<string>("user");
    JObject result = new JObject();
    if (!"提取".Equals(keyword))
    {
        result["err_code"] = 101;
        result["err_msg"] = "關鍵詞未找到";
        return result;
    }

    //// 處理過程 
    var content = parameter;
    var regUrl = @"^((ht)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-.,@?^=%&:\/~+#]*[\w\-@?^=%&\/~+#])?$";
  
    // (1) 為網址嗎
    if (Regex.IsMatch(content, regUrl))
    {
        try
        {
            content = GetUrlContent(content);
        }
        catch (Exception ue)
        {
            result["err_code"] = 101;
            result["err_msg"] = "站點無法連接!";
            return result;
        }
    }
             
    //(2)根據正則表達式提取
    Dictionary<string, List<string>> typeMatches = new Dictionary<string, List<string>>();
    foreach (var kv in RegexDict)
    {
        List<string> list = new List<string>();
        var mc = Regex.Matches(content, kv.Value, RegexOptions.IgnoreCase);
        foreach (Match c in mc)
        {
            list.Add(c.Value);
        }

        if (list.Count > 0)
        {
            typeMatches.Add(kv.Key, list);
        }
    }


    //(3)拼成字元串
    StringBuilder sb = new StringBuilder(1024);
    foreach (var kv in typeMatches)
    {
        sb.Append(kv.Key + "\n" + String.Join("\n", kv.Value) + "\n"); 
    }

    //(4)長度<1020 文本消息
    if (sb.Length < 1020)
    {
        result["err_code"] = 200;
        result["err_msg"] = "success";
        result["key_type"] = "文字";
        result["data"] = sb.Length == 0 ? "無匹配內容!" : sb.ToString();
        return result;
    }

    //(5)長度較大,返回工具鏈接
    JObject link = new JObject();
    link["title"] = "提取內容中的格式化數據信息";
    link["icon"] = "http://www.timeddd.com/Content/images/logo_bar.png";
    link["note_desc"] = "指定鏈接地址或文本內容,從中提取一些常格式數據,如郵箱、手機號、鏈接、身份證號等信息!";
    link["url"] = "http://www.timeddd.com/Tool/Fetch";

    JArray links = new JArray();
    links.Add(link);

    result["err_code"] = 200;
    result["err_msg"] = "success";
    result["key_type"] = "鏈接";
    result["data"] = links;
    return result;              
}

3 效果

在公眾號“時間維度”中,回覆關鍵詞提取,空格帶上內容,如下:

提取 各種格式的郵箱入下所示:[email protected][email protected] 3. [email protected] 4. [email protected] 5. [email protected] 6. [email protected] 7. [email protected] 8. [email protected] 9. [email protected]

會得到以下結果:

郵箱
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]

回覆:

提取 https://www.nhxz.com/doc/181017fc325d4b598aaede18.html

會得到:

郵箱
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
手機號
15758523729
18101710555
18300405945
身份證號
560087183004059455

3 招募關鍵詞

給定一個關鍵詞,一個接收關鍵詞及參數的 URL 地址,按約定的格式返回 JSON,就有可能成為“時間維度”公眾號里的實用工具供大家使用。如有興趣歡迎在“時間維度”留言。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一. 數據類型轉換 1.1 自動類型轉換 又叫:隱式類型轉換 概念:數據範圍小的類型能自動轉換成數據範圍大的類型 byte short int long float double 1.2 強制類型轉換 概念:將數據範圍大的類型使用指定格式轉換成數據範圍小的類型 格式:範圍小的數據類型 變數名 = ( ...
  • Ural 1029 Ministry 題解 [TOC] 題意 給定一個$n\times m(1\le n \le10,1\le m \le500)$的矩陣,矩陣中的每個值都是一個小於等於$10^9$的正整數。 現在從第$1$行的任意位置開始,在第$n$行的任意位置結束。每次有$3$種移動選擇(不能移 ...
  • 上班有一周了,聊一聊在大廠上班的一點感受和學到的一些東西。 1.吃飯也有江湖 入職那天去了周圍的一家早餐點,看了一眼價格,不得不說帝都著外面的店真的貴啊,半根油條6塊錢,一碗豆漿5塊錢,一根烤腸5塊錢,隨隨便便一頓早飯就15 20塊了,瑟瑟發抖。。。平時午餐點個外賣的話算上餐盒費和送餐費,一個外賣大 ...
  • 目錄 [隱藏] 0.1 前言: 0.2 界面 0.3 Maven 環境 0.4 項目結構 0.5 整合 Hibernate 0.5.1 SQLiteDialect.java 資料庫方言代碼 0.5.2 hibernate.cfg.xml Hibernate配置文件 0.6 項目初始化連接資料庫自動建 ...
  • 面向對象 Go語言開發者認為:面向對象就是特定類型(結構體)有著自己的方法,利用這個方法完成面向對象編程, 並沒有提封裝、繼承、多態。所以Go語言進行面向對象編程時,重點在於靈活使用方法。 Go語言有著自己對面向對象的理解,它也有著自己的封裝、繼承、多態。 5.1.封裝 實例 5.2.繼承 5.3. ...
  • 作者:黃小斜 來源:http://suo.im/5eJuQZ 我來阿裡,已經幾個月了。這段時間,最大的感受就是累。我是在今年的三月份加入阿裡的。 當初我沒有參加阿裡巴巴的實習,而是選擇了直接進行校園招聘,這也是因為當時我對實習的部門不感興趣,於是在校招的時候我就選擇了自己感興趣的部門,也就是現在我所 ...
  • Windows系統下同時安裝Python2和Python3 說明 有時由於工作需求我們需要在Python2版本下麵進行一些開發,有時又需要Python3以上的版本,那麼我們怎麼在一臺電腦上同時安裝多個Python版本呢? 下載 兩個版本的Python可以在官網上下載:https://www.pyth ...
  • remove() 函數用於移除列表中某個值的第一個匹配項。 remove()方法語法: list.remove(obj) 如果obj不在列表中會引發 ValueError 錯誤,通常先使用count方法查看有多少個obj pop() 函數用於移除列表中的一個元素(預設最後一個元素),並且返回該元素的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...