Files

221 lines
9.9 KiB
C#
Raw Permalink Normal View History

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;
/// <summary>
/// 设置 Report API 的调用地址。
/// <see cref="https://docs.jiguang.cn/jpush/server/push/rest_api_v3_report/"/>
/// </summary>
/// <param name="url"><see cref="BASE_URL_REPORT_DEFAULT"/> or <see cref="BASE_URL_REPORT_BEIJING"/></param>
public void SetBaseURL(string url)
{
BASE_URL = url;
}
/// <summary>
/// <see cref="GetMessageReport(List{string})"/>
/// </summary>
public async Task<HttpResponse> GetMessageReportAsync(List<string> 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);
}
/// <summary>
/// 获取指定 msg_id 的消息送达统计数据。
/// </summary>
/// <param name="msgIdList">消息的 msg_id 列表,每次最多支持 100 个。</param>
public HttpResponse GetMessageReport(List<string> msgIdList)
{
Task<HttpResponse> task = Task.Run(() => GetMessageReportAsync(msgIdList));
task.Wait();
return task.Result;
}
/// <summary>
/// <see cref="GetReceivedDetailReport(List{string})"/>
/// </summary>
public async Task<HttpResponse> GetReceivedDetailReportAsync(List<string> 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);
}
/// <summary>
/// 送达统计详情(新)
/// <see cref="https://docs.jiguang.cn/jpush/server/push/rest_api_v3_report/#_7"/>
/// </summary>
/// <param name="msgIdList">消息的 msg_id 列表,每次最多支持 100 个。</param>
public HttpResponse GetReceivedDetailReport(List<string> msgIdList)
{
Task<HttpResponse> task = Task.Run(() => GetReceivedDetailReportAsync(msgIdList));
task.Wait();
return task.Result;
}
/// <summary>
/// <see cref="GetMessageSendStatus(string, List{string}, string)"/>
/// </summary>
public async Task<HttpResponse> GetMessageSendStatusAsync(string msgId, List<string> 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);
}
/// <summary>
/// 查询指定消息的送达状态。
/// <para><see cref="https://docs.jiguang.cn/jpush/server/push/rest_api_v3_report/#_7"/></para>
/// </summary>
/// <param name="msgId">待查询消息的 Message Id。</param>
/// <param name="registrationIdList">收到消息设备的 Registration Id 列表。</param>
/// <param name="data">待查询日期,格式为 yyyy-MM-dd。如果传 null则默认为当天。</param>
public HttpResponse GetMessageSendStatus(string msgId, List<string> registrationIdList, string data)
{
Task<HttpResponse> task = Task.Run(() => GetMessageSendStatusAsync(msgId, registrationIdList, data));
task.Wait();
return task.Result;
}
/// <summary>
/// <see cref="GetMessageDetailReport(List{string})"/>
/// </summary>
public async Task<HttpResponse> GetMessageDetailReportAsync(List<string> 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);
}
/// <summary>
/// 消息统计VIP 专属接口,旧)
/// <see cref="https://docs.jiguang.cn/jpush/server/push/rest_api_v3_report/#vip"/>
/// </summary>
/// <param name="msgIdList">消息的 msg_id 列表,每次最多支持 100 个。</param>
public HttpResponse GetMessageDetailReport(List<string> msgIdList)
{
Task<HttpResponse> task = Task.Run(() => GetMessageDetailReportAsync(msgIdList));
task.Wait();
return task.Result;
}
/// <summary>
/// <see cref="GetMessagesDetailReport(List{string})"/>
/// </summary>
public async Task<HttpResponse> GetMessagesDetailReportAsync(List<string> 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);
}
/// <summary>
/// 消息统计详情VIP 专属接口,新)
/// <see cref="https://docs.jiguang.cn/jpush/server/push/rest_api_v3_report/#vip_1"/>
/// </summary>
/// <param name="msgIdList">消息的 msg_id 列表,每次最多支持 100 个。</param>
public HttpResponse GetMessagesDetailReport(List<string> msgIdList)
{
Task<HttpResponse> task = Task.Run(() => GetMessagesDetailReportAsync(msgIdList));
task.Wait();
return task.Result;
}
/// <summary>
/// <see cref="GetUserReport(string, string, int)"/>
/// </summary>
public async Task<HttpResponse> 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);
}
/// <summary>
/// 提供近2个月内某时间段的用户相关统计数据新增用户、在线用户、活跃用户VIP only
/// <see cref="https://docs.jiguang.cn/jpush/server/push/rest_api_v3_report/#vip_1"/>
/// </summary>
/// <param name="timeUnit">时间单位。支持 "HOUR", "DAY" 或 "MOUNTH"</param>
/// <param name="startTime">
/// 起始时间。
/// <para>如果单位是小时则起始时间是小时包含天格式例2014-06-11 09</para>
/// <para>如果单位是天则起始时间是日期格式例2014-06-11</para>
/// <para>如果单位是月则起始时间是日期格式例2014-06</para>
/// </param>
/// <param name="duration">
/// 持续时长。
/// <para>如果时间单位timeUnit是天则是持续的天数其他时间单位以此类推。</para>
/// <para>只支持查询 60 天以内的用户信息。如果 timeUnit 为 HOUR则只会输出当天的统计结果。</para>
/// </param>
public HttpResponse GetUserReport(string timeUnit, string startTime, int duration)
{
Task<HttpResponse> task = Task.Run(() => GetUserReportAsync(timeUnit, startTime, duration));
task.Wait();
return task.Result;
}
}
}