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;
}
}
}