.net core 和 WPF 開發升訊威線上客服系統:呼叫百度翻譯介面實現實時自動翻譯

曹旭升(sheng.c)發表於2022-05-30

業餘時間用 .net core 寫了一個線上客服系統。並在部落格園寫了一個系列的文章,寫介紹這個開發過程。

我把這款業餘時間寫的小系統丟在網上,陸續有人找我要私有化版本,我都給了,畢竟軟體業的初衷就是免費和分享,後來我索性就官方發了一個私有化版直接給別人下載。希望能夠打造: 開放、開源、共享。努力打造 .net 社群的一款優秀開源產品。

2021年下半年,陸續有朋友聯絡我,表示從事外貿行業,希望客服系統能夠實現客服與訪客之間雙向的實時自動翻譯。

一開始我想的比較複雜,拖著沒做這個功能,後來詢問的朋友越來越多,我仔細調研了一下這個需求,發現通過公有云上的介面實現起來,非常的簡單!整個對接實現過程不誇張的說,10 分鐘就完成了。

本文將詳細的介紹百度翻譯介面的註冊、開通、對接全過程,以及 原始碼 ,希望對你有用。

先看實現效果

客服端程式以原文和譯文對照的方式顯示。

訪客端以訪客語言顯示。

以設定預設翻譯所有訪客的訊息,也可以由客服根據不同訪客自行決定是否翻譯。


簡介

升訊威線上客服與營銷系統是基於 .net core / WPF 開發的一款線上客服軟體,宗旨是: 開放、開源、共享。努力打造 .net 社群的一款優秀開源產品。

完整私有化包下載地址

? https://kf.shengxunwei.com/freesite.zip

鐘意的話請給個贊支援一下吧,謝謝~

安裝部署說明書

? https://docs.shengxunwei.com/Post/f7bc8496-14ee-4a53-07b4-08d8e3da6269


百度翻譯的對接使用

訪問百度翻譯開放平臺,註冊賬戶並認證。

https://fanyi-api.baidu.com

開通通用翻譯 API

注意:

  • 非常見語種(如:烏克蘭、菲律賓、印尼),僅企業認證尊享版可呼叫,未認證的非尊享版介面將返回 58001 錯誤。
  • 請選擇開通“尊享版”。“標準版” QPS 只有 1,每秒只允許呼叫 1 次翻譯介面,無法滿足客服系統正常使用需要。

建立應用

“伺服器回撥地址” 留空不填。
“伺服器地址”可留空不填,也可填寫部署客服系統的伺服器 IP 地址。

獲取 APP ID 和 金鑰

進入“開發者資訊”畫面,檢視“申請資訊”中的 APP ID金鑰,將其儲存備用,在隨後的客服系統主程式配置中使用。

使用 C# 呼叫翻譯介面

接入方式
翻譯API通過 HTTP 介面對外提供多語種互譯服務。只需要通過呼叫通用翻譯API,傳入待翻譯的內容,並指定要翻譯的源語言(支援源語言語種自動檢測)和目標語言種類,就可以得到相應的翻譯結果。

通用翻譯API HTTPS 地址:
https://fanyi-api.baidu.com/api/trans/vip/translate

簽名生成方法
簽名是為了保證呼叫安全,使用 MD5 演算法生成的一段字串,生成的簽名長度為 32 位,簽名中的英文字元均為小寫格式。

生成方法:
Step1. 將請求引數中的 APPID(appid), 翻譯 query(q,注意為UTF-8編碼),隨機數(salt),以及平臺分配的金鑰(可在管理控制檯檢視) 按照 appid+q+salt+金鑰的順序拼接得到字串 1。
Step2. 對字串 1 做 md5 ,得到 32 位小寫的 sign。
注:

  1. 待翻譯文字(q)需為 UTF-8 編碼;
  2. 在生成簽名拼接 appid+q+salt+金鑰 字串時,q 不需要做 URL encode,在生成簽名之後,傳送 HTTP 請求之前才需要對要傳送的待翻譯文字欄位 q 做 URL encode;
    3.如遇到報 54001 簽名錯誤,請檢查您的簽名生成方法是否正確,在對 sign 進行拼接和加密時,q 不需要做 URL encode,很多開發者遇到簽名報錯均是由於拼接 sign 前就做了 URL encode;
    4.在生成簽名後,傳送 HTTP 請求時,如果將 query 拼接在 url 上,需要對 query 做 URL encode。

輸入引數
請求方式: 可使用 GET 或 POST 方式,如使用 POST 方式,Content-Type 請指定為:application/x-www-form-urlencoded
字元編碼:統一採用 UTF-8 編碼格式
query 長度:為保證翻譯質量,請將單次請求長度控制在 6000 bytes以內(漢字約為輸入引數 2000 個)

程式碼

using System;
using System.Text;
using System.Net;
using System.IO;
using System.Security.Cryptography;
using System.Web;

namespace TransAPICSharpDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 原文
            string q = "apple";
            // 源語言
            string from = "en";
            // 目標語言
            string to = "zh";
            // 改成您的APP ID
            string appId = "2015063000000001";
            Random rd = new Random();
            string salt = rd.Next(100000).ToString();
            // 改成您的金鑰
            string secretKey = "12345678";
            string sign = EncryptString(appId + q + salt + secretKey);
            string url = "http://api.fanyi.baidu.com/api/trans/vip/translate?";
            url += "q=" + HttpUtility.UrlEncode(q);
            url += "&from=" + from;
            url += "&to=" + to;
            url += "&appid=" + appId;
            url += "&salt=" + salt;
            url += "&sign=" + sign;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "GET";
            request.ContentType = "text/html;charset=UTF-8";
            request.UserAgent = null;
            request.Timeout = 6000;
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Stream myResponseStream = response.GetResponseStream();
            StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
            string retString = myStreamReader.ReadToEnd();
            myStreamReader.Close();
            myResponseStream.Close();
            Console.WriteLine(retString);
            Console.ReadLine();
        }
        // 計算MD5值
        public static string EncryptString(string str)
        {
            MD5 md5 = MD5.Create();
            // 將字串轉換成位元組陣列
            byte[] byteOld = Encoding.UTF8.GetBytes(str);
            // 呼叫加密方法
            byte[] byteNew = md5.ComputeHash(byteOld);
            // 將加密結果轉換為字串
            StringBuilder sb = new StringBuilder();
            foreach (byte b in byteNew)
            {
                // 將位元組轉換成16進製表示的字串,
                sb.Append(b.ToString("x2"));
            }
            // 返回加密的字串
            return sb.ToString();
        }
    }
}

在編寫你的程式碼時,把以上示例程式碼中的 APP ID 和 金鑰 更換成你註冊開通百度翻譯時得到的即可!

希望能夠打造: 開放、開源、共享。努力打造 .net 社群的一款優秀開源產品。

鐘意的話請給個贊支援一下吧,謝謝~

相關文章