咱們訂閱號就是這樣,啥東西都有。
群主想到什麼就給你們寫什麼,分享就完事了
正文開始
一般聊天機器人什麼的,肯定不會自己從無到有的開發
畢竟有那麼多現成的第三方機器人
但是很多機器人都是收費的,或者是有限制
今天我們就以對接騰訊閒聊機器人為例
第一步
註冊騰訊AI開放平臺,裡面有很多AI功能,
閒聊機器人只是其中一種。
https://ai.qq.com/
第二步
創建應用,選擇接入能力【智能閒聊】
這一步照著提示做好了。
應用創建成功後可以獲得
APPID和APPKEY
這兩個值在後面有大用
第三步
騰訊AI開放平臺只有PHP和Python的SDK
群主用的是C#,所以只能自己對接了
廢話說完了,開始擼代碼
先定義兩個基礎的函數,後面接口鑑權需要使用到
/// <summary>/// 獲取時間戳/// </summary>/// <param name="dt"></param>/// <returns></returns>private int GetTimeStamp(DateTime dt){ var dateStart = new DateTime(1970, 1, 1, 8, 0, 0); var timeStamp = Convert.ToInt32((dt - dateStart).TotalSeconds); return timeStamp;}
/// <summary>/// MD5加密/// </summary>/// <param name="str"></param>/// <returns></returns>private string GenerateMD5(string str){ var md5 = new MD5CryptoServiceProvider(); var byteArray = Encoding.ASCII.GetBytes(str); byteArray = md5.ComputeHash(byteArray); var hashedValue = ""; foreach (byte b in byteArray) { hashedValue += b.ToString("x2"); } return hashedValue;}籤名邏輯(官方文檔)
將<key, value>請求參數對按key進行字典升序排序,得到有序的參數對列表N
將列表N中的參數對按URL鍵值對的格式拼接成字符串,得到字符串T(如:key1=value1&key2=value2),URL鍵值拼接過程value部分需要URL編碼,URL編碼算法用大寫字母,例如%E8,而不是小寫%e8
將應用密鑰以app_key為鍵名,組成URL鍵值拼接到字符串T末尾,得到字符串S(如:key1=value1&key2=value2&app_key=密鑰)
對字符串S進行MD5運算,將得到的MD5值所有字符轉換成大寫,得到接口請求籤名
這個就是根據以上邏輯寫的實現代碼,這個函數直接返回的是完整的請求參數
private string GetReqSign(Dictionary<string, string> dic, string key){ dic = dic.OrderBy(x => x.Key).ToDictionary(p => p.Key, o => o.Value); var str = ""; foreach (var item in dic) { if (!string.IsNullOrWhiteSpace(item.Value)) { str += $"{item.Key}={HttpUtility.UrlEncode(item.Value).ToUpper()}&"; } } var forSign = $"app_key={key}"; var sign = GenerateMD5(forSign).ToUpper(); str += $"sign={sign}"; return str;}開始調用
/// <summary>/// 獲取機器人的回覆/// </summary>/// <param name="question">發送給機器人的語句</param>/// <param name="sessionId">會話標識(應用內唯一),比如用戶名,OPENID什麼的</param>/// <returns></returns>public string GetReply(string question, string sessionId){ try { var dic = new Dictionary<string, string>(); dic.Add("app_id", "上面獲取的APPID"); dic.Add("time_stamp", GetTimeStamp(DateTime.Now).ToString()); dic.Add("nonce_str", "隨機字符串"); dic.Add("session", sessionId); dic.Add("question", question); dic.Add("sign", ""); var data = GetReqSign(dic, "上面獲取的APPKEY"); var http = new HttpHelper(); var result = http.GetHtml(new HttpItem { URL = $"https://api.ai.qq.com/fcgi-bin/nlp/nlp_textchat?{data}", Method = "GET" }); var re = Newtonsoft.Json.JsonConvert.DeserializeObject<AibotResult>(result.Html); return re.data.answer; } catch (Exception) { return "我竟無言以對 ORZ"; }}
/// <summary>/// 機器人返回類/// </summary>public class AibotResult{ public int ret { get; set; } public string msg { get; set; } public Data data { get; set; } public class Data { public string session { get; set; } public string answer { get; set; } }}