using Jiguang.JPush.Model; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace Jiguang.JPush { public class ReportClient { public const string BASE_URL_REPORT_DEFAULT = "https://report.jpush.cn/v3"; public const string BASE_URL_REPORT_BEIJING = "https://bjapi.push.jiguang.cn/v3/report"; private string BASE_URL = BASE_URL_REPORT_DEFAULT; /// /// 设置 Report API 的调用地址。 /// /// /// or public void SetBaseURL(string url) { BASE_URL = url; } /// /// /// public async Task GetMessageReportAsync(List msgIdList) { if (msgIdList == null) throw new ArgumentNullException(nameof(msgIdList)); var msgIds = string.Join(",", msgIdList); var url = BASE_URL + "/received?msg_ids=" + msgIds; HttpResponseMessage msg = await JPushClient.HttpClient.GetAsync(url).ConfigureAwait(false); var content = await msg.Content.ReadAsStringAsync().ConfigureAwait(false); return new HttpResponse(msg.StatusCode, msg.Headers, content); } /// /// 获取指定 msg_id 的消息送达统计数据。 /// /// 消息的 msg_id 列表,每次最多支持 100 个。 public HttpResponse GetMessageReport(List msgIdList) { Task task = Task.Run(() => GetMessageReportAsync(msgIdList)); task.Wait(); return task.Result; } /// /// /// public async Task GetReceivedDetailReportAsync(List msgIdList) { if (msgIdList == null) throw new ArgumentNullException(nameof(msgIdList)); var msgIds = string.Join(",", msgIdList); var url = BASE_URL + "/received/detail?msg_ids=" + msgIds; HttpResponseMessage msg = await JPushClient.HttpClient.GetAsync(url).ConfigureAwait(false); var content = await msg.Content.ReadAsStringAsync().ConfigureAwait(false); return new HttpResponse(msg.StatusCode, msg.Headers, content); } /// /// 送达统计详情(新) /// /// /// 消息的 msg_id 列表,每次最多支持 100 个。 public HttpResponse GetReceivedDetailReport(List msgIdList) { Task task = Task.Run(() => GetReceivedDetailReportAsync(msgIdList)); task.Wait(); return task.Result; } /// /// /// public async Task GetMessageSendStatusAsync(string msgId, List registrationIdList, string data) { if (string.IsNullOrEmpty(msgId)) throw new ArgumentNullException(nameof(msgId)); if (registrationIdList == null) throw new ArgumentNullException(nameof(registrationIdList)); JObject body = new JObject { { "msg_id", long.Parse(msgId) }, { "registration_ids", JArray.FromObject(registrationIdList) } }; if (!string.IsNullOrEmpty(data)) body.Add("data", data); var url = BASE_URL + "/status/message"; var httpContent = new StringContent(body.ToString(), Encoding.UTF8); HttpResponseMessage msg = await JPushClient.HttpClient.PostAsync(url, httpContent).ConfigureAwait(false); var content = await msg.Content.ReadAsStringAsync().ConfigureAwait(false); return new HttpResponse(msg.StatusCode, msg.Headers, content); } /// /// 查询指定消息的送达状态。 /// /// /// 待查询消息的 Message Id。 /// 收到消息设备的 Registration Id 列表。 /// 待查询日期,格式为 yyyy-MM-dd。如果传 null,则默认为当天。 public HttpResponse GetMessageSendStatus(string msgId, List registrationIdList, string data) { Task task = Task.Run(() => GetMessageSendStatusAsync(msgId, registrationIdList, data)); task.Wait(); return task.Result; } /// /// /// public async Task GetMessageDetailReportAsync(List msgIdList) { if (msgIdList == null) throw new ArgumentNullException(nameof(msgIdList)); var msgIds = string.Join(",", msgIdList); var url = BASE_URL + "/messages?msg_ids=" + msgIds; HttpResponseMessage msg = await JPushClient.HttpClient.GetAsync(url).ConfigureAwait(false); var content = await msg.Content.ReadAsStringAsync().ConfigureAwait(false); return new HttpResponse(msg.StatusCode, msg.Headers, content); } /// /// 消息统计(VIP 专属接口,旧) /// /// /// 消息的 msg_id 列表,每次最多支持 100 个。 public HttpResponse GetMessageDetailReport(List msgIdList) { Task task = Task.Run(() => GetMessageDetailReportAsync(msgIdList)); task.Wait(); return task.Result; } /// /// /// public async Task GetMessagesDetailReportAsync(List msgIdList) { if (msgIdList == null) throw new ArgumentNullException(nameof(msgIdList)); var msgIds = string.Join(",", msgIdList); var url = BASE_URL + "/messages/detail?msg_ids=" + msgIds; HttpResponseMessage msg = await JPushClient.HttpClient.GetAsync(url).ConfigureAwait(false); var content = await msg.Content.ReadAsStringAsync().ConfigureAwait(false); return new HttpResponse(msg.StatusCode, msg.Headers, content); } /// /// 消息统计详情(VIP 专属接口,新) /// /// /// 消息的 msg_id 列表,每次最多支持 100 个。 public HttpResponse GetMessagesDetailReport(List msgIdList) { Task task = Task.Run(() => GetMessagesDetailReportAsync(msgIdList)); task.Wait(); return task.Result; } /// /// /// public async Task GetUserReportAsync(string timeUnit, string startTime, int duration) { if (string.IsNullOrEmpty(timeUnit)) throw new ArgumentNullException(nameof(timeUnit)); if (startTime == null) throw new ArgumentNullException(nameof(startTime)); if (duration <= 0) throw new ArgumentOutOfRangeException(nameof(duration)); var url = BASE_URL + "/users?time_unit=" + timeUnit + "&start=" + startTime + "&duration=" + duration; HttpResponseMessage msg = await JPushClient.HttpClient.GetAsync(url).ConfigureAwait(false); var content = await msg.Content.ReadAsStringAsync().ConfigureAwait(false); return new HttpResponse(msg.StatusCode, msg.Headers, content); } /// /// 提供近2个月内某时间段的用户相关统计数据:新增用户、在线用户、活跃用户(VIP only)。 /// /// /// 时间单位。支持 "HOUR", "DAY" 或 "MOUNTH" /// /// 起始时间。 /// 如果单位是小时,则起始时间是小时(包含天),格式例:2014-06-11 09 /// 如果单位是天,则起始时间是日期(天),格式例:2014-06-11 /// 如果单位是月,则起始时间是日期(月),格式例:2014-06 /// /// /// 持续时长。 /// 如果时间单位(timeUnit)是天,则是持续的天数,其他时间单位以此类推。 /// 只支持查询 60 天以内的用户信息。如果 timeUnit 为 HOUR,则只会输出当天的统计结果。 /// public HttpResponse GetUserReport(string timeUnit, string startTime, int duration) { Task task = Task.Run(() => GetUserReportAsync(timeUnit, startTime, duration)); task.Wait(); return task.Result; } } }