使用MTA HTML5統計API來分析數據

  • 2019 年 10 月 3 日
  • 筆記

在開發個人博客的時候,用到了騰訊移動分析(MTA),相比其他數據統計平台來說我喜歡她的簡潔高效,易上手,同時文檔也比較全面,提供了數據接口供用戶調用。

在看了MTA演示Demo官方文檔後,我就決定使用 .NET Core將其HTML5統計API進行封裝,以供博客直接調用,省去各種鑒權生成sign的操作。

首先需要在MTA官網進行HTML5應用創建,當然她還支持小程序和移動App。

MTA

然後就可以看到如上圖的應用管理界面,如果你不打算使用其API接口,直接拿到統計代碼嵌入在自己網站中即可,不出意外10分鐘左右即可查看網站部分指標的實時數據,次日可以查看昨日的全部數據。

接下來繼續,在調用MTA接口之前需要先生成sign,

雙方維護同一份私鑰,在發起請求的時候,發起方(合作方)將當前的請求參數數組,按照key值進行排序,然後’key=value’拼接到加密串後,進行md5的編碼。接收方以同樣的處理方式,對ts小於或等於30分鐘的請求進行處理,sign一致則合法,否則失敗。

有了這段算法描述,利用C#代碼實現如下:

/// <summary>  /// 生成sign  /// </summary>  /// <param name="keyValues"></param>  /// <returns></returns>  public static string GgenerateSign(this Dictionary<string, string> keyValues)  {      keyValues.Add("app_id", MtaConfig.App_Id);      IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(keyValues);      var iterator = sortedParams.GetEnumerator();      var sb = new StringBuilder();      while (iterator.MoveNext())      {          var key = iterator.Current.Key;          var value = iterator.Current.Value;          if (key.IsNotNullOrEmpty() && value.IsNotNullOrEmpty())          {              sb.Append(key).Append("=").Append(value);          }      }      return (MtaConfig.SECRET_KEY + sb.ToString()).Md5();  }

將參數放入一個字典,並按照key值進行排序。因為所有接口都需要參數app_id,所以將其默認添加進去,不在額外當做參數。

.Md5()是一個擴展方法,將字符串按照MD5方式加密

拿到sign後就可以調用接口了,因為是封裝,那麼將所有接口都保存為靜態變量,代碼如下

#region 應用趨勢    /// <summary>  /// 應用歷史趨勢  /// 每天的pvuvvviv數據  /// </summary>  public static string Ctr_core_data = "https://mta.qq.com/h5/api/ctr_core_data";    /// <summary>  /// 應用實時小時數據  /// 當天每小時的pvuvvviv數據  /// </summary>  public static string Ctr_realtime = "https://mta.qq.com/h5/api/ctr_realtime/get_by_hour";    /// <summary>  /// 應用心跳數據  /// 當前pvuvvviv心跳數據數據  /// </summary>  public static string Ctr_realtime_heartbeat = "https://mta.qq.com/h5/api/ctr_realtime/heartbeat";    #endregion    #region 訪客分析    /// <summary>  /// 實時訪客  /// 在24小時內的實時訪客信息  /// </summary>  public static string Ctr_user_realtime = "https://mta.qq.com/h5/api/ctr_user_realtime";    /// <summary>  /// 新老訪客比  /// 按天查詢當天新訪客與舊訪客的數量  /// </summary>  public static string Ctr_user_compare = "https://mta.qq.com/h5/api/ctr_user_compare";    /// <summary>  /// 用戶畫像  /// 查詢用戶畫像數據,包含性別比例、年齡分佈、學歷分佈、職業分佈,數據為pv量  /// </summary>  public static string Ctr_user_portrait = "https://mta.qq.com/h5/api/ctr_user_portrait";    #endregion    #region 客戶端分析    /// <summary>  /// 地區數據  /// 按天查詢地區的pvuvvviv量  /// </summary>  public static string Ctr_area = "https://mta.qq.com/h5/api/ctr_area/get_by_area";    /// <summary>  /// 省市數據  /// 按天查詢省市下有流量的城市的pvuvvviv量  /// </summary>  public static string Ctr_area_province = "https://mta.qq.com/h5/api/ctr_area/get_by_province";    /// <summary>  /// 運營商  /// 按天查詢運營商的pvuvvviv量  /// </summary>  public static string Ctr_operator = "https://mta.qq.com/h5/api/ctr_operator";    /// <summary>  /// 終端屬性列表  /// 按天查詢對應屬性的終端信息數據  /// </summary>  public static string Ctr_client_para = "https://mta.qq.com/h5/api/ctr_client/get_by_para";    /// <summary>  /// 終端信息  /// 按天查詢終端信息數據  /// </summary>  public static string Ctr_client_content = "https://mta.qq.com/h5/api/ctr_client/get_by_content";    #endregion    #region 頁面分析    /// <summary>  /// 頁面排行-當天實時列表  /// 查詢當天所有url的pvuvvviv數據  /// </summary>  public static string Ctr_page_realtime = "https://mta.qq.com/h5/api/ctr_page/list_all_page_realtime";    /// <summary>  /// 頁面排行-離線列表  /// 按天查詢所有url的pvuvvviv數據  /// </summary>  public static string Ctr_page_offline = "https://mta.qq.com/h5/api/ctr_page/list_all_page_offline";    /// <summary>  /// 頁面排行-指定查詢部分url  /// 按天查詢url的pvuvvviv數據。  /// </summary>  public static string Ctr_page_url = "https://mta.qq.com/h5/api/ctr_page";    /// <summary>  /// 性能監控  /// 按天查詢對應省市的訪問延時與解析時長  /// </summary>  public static string Ctr_page_speed = "https://mta.qq.com/h5/api/ctr_page_speed";    /// <summary>  /// 訪問深度  /// 按天查詢用戶訪問深度  /// </summary>  public static string Ctr_page_depth = "https://mta.qq.com/h5/api/ctr_depth";    #endregion    #region 來源分析    /// <summary>  /// 外部鏈接  /// 按天查詢外部同站鏈接帶來的流量情情況  /// </summary>  public static string Ctr_source_out = "https://mta.qq.com/h5/api/ctr_source_out";    /// <summary>  /// 入口頁面  /// 按天查詢用戶最後訪問的進入次數與跳出率  /// </summary>  public static string Ctr_page_land = "https://mta.qq.com/h5/api/ctr_page_land";    /// <summary>  /// 離開頁面  /// 按天查詢最後訪問頁面的離次數  /// </summary>  public static string Ctr_page_exit = "https://mta.qq.com/h5/api/ctr_page_exit";    #endregion    #region 自定義事件    /// <summary>  /// 自定義事件  /// 按天查詢自定義事件的pvuvvviv  /// </summary>  public static string Ctr_custom = "https://mta.qq.com/h5/api/ctr_custom";    #endregion    #region 渠道效果統計    /// <summary>  /// 渠道效果統計  /// 按天查詢渠道的分析數據  /// </summary>  public static string Ctr_adtag = "https://mta.qq.com/h5/api/ctr_adtag";    #endregion

接下來對照文檔生成URL的查詢參數,然後訪問接口拿到返回數據

/// <summary>  /// 生成URL查詢參數  /// </summary>  /// <param name="keyValues"></param>  /// <returns></returns>  public static string GgenerateQuery(this Dictionary<string, string> keyValues)  {      var sign = keyValues.GgenerateSign();        var query = "?";        keyValues.ForEach(x =>      {          query += $"{x.Key}={x.Value}&";      });        return $"{query}sign={sign}";  }
/// <summary>  /// 獲取MTA接口返回數據  /// </summary>  /// <param name="keyValues"></param>  /// <returns></returns>  public static async Task<string> GetMTAData(this Dictionary<string, string> keyValues, string api)  {      var url = $"{api}{keyValues.GgenerateQuery()}";        // HWRequest()和HWRequestResult()是擴展方法,可以選擇自己熟悉HTTP請求方法      var hwr = url.HWRequest();      string result = hwr.HWRequestResult();        return await Task.FromResult(result);  }

到這裡基本上就結束了,只需對照MTA文檔傳入對應的參數即可拿到返回的數據了。

以其中一個接口為例,應用歷史趨勢,獲取每天的pv、uv、vv、iv數據

/// <summary>  /// 應用歷史趨勢  /// 每天的pvuvvviv數據  /// </summary>  /// <param name="start_date">開始時間(Y-m-d)</param>  /// <param name="end_date">結束時間(Y-m-d)</param>  /// <param name="idx">查詢指標(pv,uv,vv,iv),使用「,」間隔</param>  /// <returns></returns>  public async Task<string> Ctr_core_data(string start_date, string end_date, string idx)  {      var keyValues = new Dictionary<string, string>      {          { "start_date", start_date },          { "end_date", end_date },          { "idx", idx }      };      return await keyValues.GetMTAData(MtaConfig.Ctr_core_data);  }

在controller中進行調用

/// <summary>  /// 應用歷史趨勢  /// 每天的pvuvvviv數據  /// </summary>  /// <param name="start_date">開始時間(Y-m-d)</param>  /// <param name="end_date">結束時間(Y-m-d)</param>  /// <param name="idx">查詢指標(pv,uv,vv,iv),使用「,」間隔</param>  /// <returns></returns>  [HttpGet]  [Route("ctr_core_data")]  public async Task<dynamic> Ctr_core_data(string start_date, string end_date, string idx)  {      var result = await _mtaService.Ctr_core_data(start_date, end_date, idx);        return result.DeserializeFromJson<dynamic>();  }

查詢結果看下圖

MTAAPI

詳細代碼可參考:https://github.com/Meowv/Blog/tree/master/src/MeowvBlog.MTA