Back to "利用Umami数据进行网站统计"

This is a viewer only at the moment see the article on how this works.

To update the preview hit Ctrl-Alt-R (or ⌘-Alt-R on Mac) or Enter to refresh. The Save icon lets you save the markdown file to disk

This is a preview from the server running through my markdig pipeline

ASP.NET Umami

利用Umami数据进行网站统计

Friday, 13 September 2024

一. 导言 导言 导言 导言 导言 导言 一,导言 导言 导言 导言 导言 导言

自博客开始以来, 我的一个计划几乎是渴望追踪有多少用户看我的网站。 为了做到这一点,我用木美 并有一个 员额的BUNCH 使用和设置Umami。 我还有一套“Niget”软件包, 能够追踪ASP.NET核心网站的数据。

现在我添加了一个新的服务, 允许您将数据从 Umami 调回到 C # 应用程序 。 这是一个简单的服务, 使用 Umami API 从您的 Umami 实例中提取数据, 并在您的网站/ 应用程序中使用 。

和往常一样,所有源代码都可以找到 我的吉他露露,我的吉他露露,我的吉他露露,我的吉他露露,我的吉卜露,我的吉卜露,我的吉卜露,我的吉卜露,我的吉卜露, 用于此站点 。

[技选委

安装安装

已经在 Ummami.Net Nuget 软件包中了, 使用以下命令安装 :

dotnet add package Umami.Net

然后,你需要设置服务 在您的 Program.cs 文件 :

    services.SetupUmamiData(config);

此处使用 Analytics' element from your appings.json'file:

 "Analytics":{
   "UmamiPath" : "https://umamilocal.mostlylucid.net",
   "WebsiteId" : "32c2aa31-b1ac-44c0-b8f3-ff1f50403bee",
    "UmamiScript" : "getinfo",
   "UserName": "admin",
   "Password": ""
 }

在这里 UmamiScript 是在 Umami (Umami) 客户端跟踪时使用的脚本此处见 如何设置 。 ) 缩略 WebSiteId 是您在 Umami 实例中创建的网站的 ID 。 UmamiPath 您的 Umami 实例路径 。

缩略 UserNamePassword 是Umami案的证书(在这种情况下,我使用行政密码)。

用法

现在你有了 UmamiDataService 在您的服务收藏中,您可以开始使用它!

方法方法

方法都来自Umami API定义, http://umami.is/docs/api/website-stats http://umami.is/docs/api/website-stats https://umami.is/docs/api/website-stats

将所有返回都包裹在 UmamiResults<T> 对象具有 Success 财产和财产财产及财产财产(a) Result 财产。 缩略 Result 属性是从 Umami API 返回的对象。

public record UmamiResult<T>(HttpStatusCode Status, string Message, T? Data);

除下列所有请求外的所有请求 ActiveUsers 具有两个强制特性的基本请求对象。 我将“方便日期时间”添加到基本请求对象,以便更容易确定开始日期和结束日期。

public class BaseRequest
{
    [QueryStringParameter("startAt", isRequired: true)]
    public long StartAt => StartAtDate.ToMilliseconds(); // Timestamp (in ms) of starting date
    [QueryStringParameter("endAt", isRequired: true)]
    public long EndAt => EndAtDate.ToMilliseconds(); // Timestamp (in ms) of end date
    public DateTime StartAtDate { get; set; }
    public DateTime EndAtDate { get; set; }
}

本服务有以下方法:

活动用户

这正好使网站的当前用户总数达到此数

public async Task<UmamiResult<ActiveUsersResponse>> GetActiveUsers()

状态

这将返回有关网站的一堆统计数据, 包括用户数、页面浏览量等 。

public async Task<UmamiResult<StatsResponseModels>> GetStats(StatsRequest statsRequest)    

您可以设置若干参数来过滤从 API 返回的数据。 例如,使用 url 返回特定 URL 的统计 。

StatsRequest object ```csharp public class StatsRequest : BaseRequest { [QueryStringParameter("url")] public string? Url { get; set; } // Name of URL [QueryStringParameter("referrer")] public string? Referrer { get; set; } // Name of referrer [QueryStringParameter("title")] public string? Title { get; set; } // Name of page title [QueryStringParameter("query")] public string? Query { get; set; } // Name of query [QueryStringParameter("event")] public string? Event { get; set; } // Name of event [QueryStringParameter("host")] public string? Host { get; set; } // Name of hostname [QueryStringParameter("os")] public string? Os { get; set; } // Name of operating system [QueryStringParameter("browser")] public string? Browser { get; set; } // Name of browser [QueryStringParameter("device")] public string? Device { get; set; } // Name of device (e.g., Mobile) [QueryStringParameter("country")] public string? Country { get; set; } // Name of country [QueryStringParameter("region")] public string? Region { get; set; } // Name of region/state/province [QueryStringParameter("city")] public string? City { get; set; } // Name of city } ```
JSON反对Umami的返回如下:
{
  "pageviews": { "value": 5, "change": 5 },
  "visitors": { "value": 1, "change": 1 },
  "visits": { "value": 3, "change": 2 },
  "bounces": { "value": 0, "change": 0 },
  "totaltime": { "value": 4, "change": 4 }
}

这个包裹在我的体内 StatsResponseModel 对象。

namespace Umami.Net.UmamiData.Models.ResponseObjects;

public class StatsResponseModels
{
    public Pageviews pageviews { get; set; }
    public Visitors visitors { get; set; }
    public Visits visits { get; set; }
    public Bounces bounces { get; set; }
    public Totaltime totaltime { get; set; }


    public class Pageviews
    {
        public int value { get; set; }
        public int prev { get; set; }
    }

    public class Visitors
    {
        public int value { get; set; }
        public int prev { get; set; }
    }

    public class Visits
    {
        public int value { get; set; }
        public int prev { get; set; }
    }

    public class Bounces
    {
        public int value { get; set; }
        public int prev { get; set; }
    }

    public class Totaltime
    {
        public int value { get; set; }
        public int prev { get; set; }
    }
}

计量数

Umami的计量为您提供特定类型属性的视图数量 。

事件事件事件事件

其中一个例子是:

在Umami的“晚上”是特定的东西 你可以在现场追踪到 当使用 Umami. Net 跟踪事件时, 您可以设置一些属性, 这些属性会与事件名称一起被跟踪 。 比如这里,我追踪 Search 与 URL 和 搜索 条目一起请求 。

       await  umamiBackgroundSender.Track( "searchEvent", eventData: new UmamiEventData(){{"query", encodedQuery}});

要获取此事件的数据, 您将会使用此 Metrics 方法 :

public async Task<UmamiResult<MetricsResponseModels[]>> GetMetrics(MetricsRequest metricsRequest)

与本接受的其他方法一样,本 MetricsRequest 对象( 强制 BaseRequest 属性)和一些用于筛选数据的可选属性。

MetricsRequest object ```csharp public class MetricsRequest : BaseRequest { [QueryStringParameter("type", isRequired: true)] public MetricType Type { get; set; } // Metrics type
[QueryStringParameter("url")]
public string? Url { get; set; } // Name of URL

[QueryStringParameter("referrer")]
public string? Referrer { get; set; } // Name of referrer

[QueryStringParameter("title")]
public string? Title { get; set; } // Name of page title

[QueryStringParameter("query")]
public string? Query { get; set; } // Name of query

[QueryStringParameter("host")]
public string? Host { get; set; } // Name of hostname

[QueryStringParameter("os")]
public string? Os { get; set; } // Name of operating system

[QueryStringParameter("browser")]
public string? Browser { get; set; } // Name of browser

[QueryStringParameter("device")]
public string? Device { get; set; } // Name of device (e.g., Mobile)

[QueryStringParameter("country")]
public string? Country { get; set; } // Name of country

[QueryStringParameter("region")]
public string? Region { get; set; } // Name of region/state/province

[QueryStringParameter("city")]
public string? City { get; set; } // Name of city

[QueryStringParameter("language")]
public string? Language { get; set; } // Name of language

[QueryStringParameter("event")]
public string? Event { get; set; } // Name of event

[QueryStringParameter("limit")]
public int? Limit { get; set; } = 500; // Number of events returned (default: 500)

}


</details>
您可以在此看到, 您可以在请求元素中指定一些属性, 以指定要返回的度量 。

您也可以设置 `Limit` 属性以限制返回结果的数量。

例如,为了得到上述我提到的过去一天的事件,你将提出以下请求:

```csharp
var metricsRequest = new MetricsRequest
{
    StartAtDate = DateTime.Now.AddDays(-1),
    EndAtDate = DateTime.Now,
    Type = MetricType.@event,
    Event = "searchEvent"
};

从API返回的JSON物体如下:

[
  { "x": "searchEvent", "y": 46 }
]

我再次将这个包在 MetricsResponseModels 对象。

public class MetricsResponseModels
{
    public string x { get; set; }
    public int y { get; set; }
}

x 是事件名称, y 是它被触发的次数 。

页面意见和意见

最有用的衡量标准之一是页面浏览量。 这是页面在网站上浏览的次数 。 以下是我用来测试过去30天页面浏览量的测试。 你会注意到 Type 参数设置为 MetricType.url 然而,这也是默认值, 所以您不需要设置它 。

  [Fact]
    public async Task Metrics_StartEnd()
    {
        var setup = new SetupUmamiData();
        var serviceProvider = setup.Setup();
        var websiteDataService = serviceProvider.GetRequiredService<UmamiDataService>();
        
        var metrics = await websiteDataService.GetMetrics(new MetricsRequest()
        {
            StartAtDate = DateTime.Now.AddDays(-30),
            EndAtDate = DateTime.Now,
            Type = MetricType.url,
            Limit = 500
        });
        Assert.NotNull(metrics);
        Assert.Equal( HttpStatusCode.OK, metrics.Status);

    }

此返回返回 a MetricsResponse 具有下列 JSON 结构的物体:

[
  {
    "x": "/",
    "y": 1
  },
  {
    "x": "/blog",
    "y": 1
  },
  {
    "x": "/blog/usingumamidataforwebsitestats",
    "y": 1
  }
]

何处处 x URL 是 URL 和 y 是它被查看的次数。

页面意见和意见

这将返回特定 URL 页面浏览数 。

我用这个方法来测试:

    [Fact]
    public async Task PageViews_StartEnd_Day_Url()
    {
        var setup = new SetupUmamiData();
        var serviceProvider = setup.Setup();
        var websiteDataService = serviceProvider.GetRequiredService<UmamiDataService>();
    
        var pageViews = await websiteDataService.GetPageViews(new PageViewsRequest()
        {
            StartAtDate = DateTime.Now.AddDays(-7),
            EndAtDate = DateTime.Now,
            Unit = Unit.day,
            Url = "/blog"
        });
        Assert.NotNull(pageViews);
        Assert.Equal( HttpStatusCode.OK, pageViews.Status);

    }

此返回返回 a PageViewsResponse 具有下列 JSON 结构的物体:

[
  {
    "date": "2024-09-06 00:00",
    "value": 1
  }
]

何处处 date 日期和 value 是页面浏览次数,按指定范围(或小时、月等)每天重复使用。 取决于 Unit 财产))

与本接受的其他方法一样,本 PageViewsRequest 对象( 强制 BaseRequest 属性)和一些用于筛选数据的可选属性。

PageViewsRequest object ```csharp public class PageViewsRequest : BaseRequest { // Required properties
[QueryStringParameter("unit", isRequired: true)]
public Unit Unit { get; set; } = Unit.day; // Time unit (year | month | hour | day)

[QueryStringParameter("timezone")]
[TimeZoneValidator]
public string Timezone { get; set; }

// Optional properties
[QueryStringParameter("url")]
public string? Url { get; set; } // Name of URL
[QueryStringParameter("referrer")]
public string? Referrer { get; set; } // Name of referrer
[QueryStringParameter("title")]
public string? Title { get; set; } // Name of page title
[QueryStringParameter("host")]
public string? Host { get; set; } // Name of hostname
[QueryStringParameter("os")]
public string? Os { get; set; } // Name of operating system
[QueryStringParameter("browser")]
public string? Browser { get; set; } // Name of browser
[QueryStringParameter("device")]
public string? Device { get; set; } // Name of device (e.g., Mobile)
[QueryStringParameter("country")]
public string? Country { get; set; } // Name of country
[QueryStringParameter("region")]
public string? Region { get; set; } // Name of region/state/province
[QueryStringParameter("city")]
public string? City { get; set; } // Name of city

}


</details>
与其它方法一样,您可以设置一些属性来过滤从 API 返回的数据,例如,您可以设置
`Country` 属性从特定国家获取页面浏览次数。

# 利用该处

使用此服务获取每个博客页面的浏览量。 在下面的代码中,我需要一个开始和结束日期和一个前缀(即: `/blog` 并获得博客上每一页的浏览量。

然后把数据藏起来一个小时 这样我就不用一直打UmamiAPI了

```csharp
public class UmamiDataSortService(
    UmamiDataService dataService,
    IMemoryCache cache)
{
    public async Task<List<MetricsResponseModels>?> GetMetrics(DateTime startAt, DateTime endAt, string prefix="" )
    {
        using var activity = Log.Logger.StartActivity("GetMetricsWithPrefix");
        try
        {
            var cacheKey = $"Metrics_{startAt}_{endAt}_{prefix}";
            if (cache.TryGetValue(cacheKey, out List<MetricsResponseModels>? metrics))
            {
                activity?.AddProperty("CacheHit", true);
                return metrics;
            }
            activity?.AddProperty("CacheHit", false);
            var metricsRequest = new MetricsRequest()
            {
                StartAtDate = startAt,
                EndAtDate = endAt,
                Type = MetricType.url,
                Limit = 500
            };
            var metricRequest = await dataService.GetMetrics(metricsRequest);

            if(metricRequest.Status != HttpStatusCode.OK)
            {
                return null;
            }
            var filteredMetrics = metricRequest.Data.Where(x => x.x.StartsWith(prefix)).ToList();
            cache.Set(cacheKey, filteredMetrics, TimeSpan.FromHours(1));
            activity?.AddProperty("MetricsCount", filteredMetrics?.Count()?? 0);
            activity?.Complete();
            return filteredMetrics;
        }
        catch (Exception e)
        {
            activity?.Complete(LogEventLevel.Error, e);
         
            return null;
        }
    }

在结论结论中

这是一个简单的服务, 允许您从 Umami 提取数据, 并将其用于应用程序 。 我用这个来获得每个博客页面的浏览次数, 但它非常有用 仅仅获得一个BUNCH数据 有关谁使用你的网站 以及他们如何使用它。

logo

©2024 Scott Galloway