Files
g.hnyhua.cn/Jiguang.JPush/ReportClient.cs
2026-02-07 15:48:27 +08:00

221 lines
9.9 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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;
}
}
}