1

我有一个工作解决方案,它成功地从 Google Analytics 网站检索数据。但是它开始产生 404 错误,阅读后我发现谷歌更改了他们的服务网址。我做了同样的事情,现在我得到了一个错误:

无效的 URI:无法确定 URI 的格式。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Xml;

namespace FractalConnect
{
public class BaseData
{

    public IEnumerable<KeyValuePair<Dimension, string>> Dimensions { get; set; }
    public IEnumerable<KeyValuePair<Metric, string>> Metrics { get; set; }

    private const string PageViewReportUrl =
      "https://www.google.com/analytics/feeds/data?ids={0}&dimensions={1}&metrics={2}&start-date={3}&end-date={4}&sort={5}&max-results={6}";
    internal static string authenticationKey { get; set; }



    private static XDocument getXMLData(string tableID, IEnumerable<Dimension> dimensions,
        IEnumerable<Metric> metrics, DateTime from, DateTime to, Metric sort, SortDirection direction, int maxrecords)
    {
        XDocument doc = null;
        if (authenticationKey.Length > 0)
        {
            var dimension = new StringBuilder();
            for (var i = 0; i < dimensions.Count(); i++)
            {
                dimension.Append("ga:" + dimensions.ElementAt(i));
                if (i < dimensions.Count() - 1)
                    dimension.Append(",");
            }
            var metric = new StringBuilder();
            for (var i = 0; i < metrics.Count(); i++)
            {
                metric.Append("ga:" + metrics.ElementAt(i));
                if (i < metrics.Count() - 1)
                    metric.Append(",");
            }
            var sorter = "ga:" + sort;
            if (direction == SortDirection.Descending)
                sorter = "-" + sorter;
            var fromDate = from.ToString("yyyy-MM-dd");
            var toDate = to.ToString("yyyy-MM-dd");
            var header = new[] { "Authorization: GoogleLogin " + authenticationKey };
            var url = string.Format(PageViewReportUrl, "ga:" + tableID, dimension, metric, fromDate, toDate, sorter, maxrecords);

            doc = XDocument.Parse(HttpRequests.HttpGetRequest(url, header));
        }

        return doc;
    }


    public static IEnumerable<BaseData> GetBaseData(string tableID, IEnumerable<Dimension> dimensions,
        IEnumerable<Metric> metrics, DateTime from, DateTime to, Metric sort, SortDirection direction, int maxrecords)
    {
        IEnumerable<BaseData> data = null;
        XDocument xml = getXMLData(tableID, dimensions, metrics, from, to, sort, direction, maxrecords);
        if (xml != null)
        {
            XNamespace dxp = xml.Root.GetNamespaceOfPrefix("dxp");
            XNamespace dns = xml.Root.GetDefaultNamespace();
            data = xml.Root.Descendants(dns + "entry").Select(element => new BaseData
            {
                Dimensions =
                  new List<KeyValuePair<Dimension, string>>(
                  element.Elements(dxp + "dimension").Select(
                    dimensionElement =>
                    new KeyValuePair<Dimension, string>(
                      dimensionElement.Attribute("name").Value.Replace("ga:", "")
                      .ParseEnum<Dimension>(),
                      dimensionElement.Attribute("value").Value))),
                Metrics =
                  new List<KeyValuePair<Metric, string>>(
                  from metricElement in element.Elements(dxp + "metric")
                  select new KeyValuePair<Metric, string>(
                    metricElement.Attribute("name").Value.Replace("ga:", "")
                      .ParseEnum<Metric>(),
                    metricElement.Attribute("value").Value))
            });
        }
        return data;
    }

    public static XDocument GetProfilesData(string email, string pwd)
    {

        XDocument docAnalyticsData = null;

        if (authenticationKey.Length > 0)

        {
            var header = new[] { "Authorization: GoogleLogin " + authenticationKey };
            docAnalyticsData = XDocument.Parse(HttpRequests.HttpGetRequest("https://www.googleapis.com/analytics/v2.4/data?ids=ga:XXXX&dimensions=ga:date&metrics=ga:visits&start-date=2012-04-01&end-date=2012-04-02&key?", header));
        }
        return docAnalyticsData;
    }

}

}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Xml;
using System.IO;

namespace FractalConnect
{
public class GADataFetcher
{
    public string Email { get; set; }
    public string Password { get; set; }
    private string AuthenticationKey { get; set; }
    private const string AuthenticationUrl = "https//www.googleapis.com/analytics/v2,4/management/accounts?key=AIzaSyDGaZZnDrHNaUyMwQHE-KnEB0LYvi8wQtI";
    public GADataFetcher(string email, string password)
    {
        this.Email = email;
        this.Password = password;
        try
        {
            Authenticate();
            BaseData.authenticationKey = AuthenticationKey;
        }
        catch
        {
            throw;
        }
    }

    private void Authenticate()
    {
        string AuthenticationPost = string.Format("accountType=GOOGLE&Email={0}&Passwd={1}&service=analytics&source=xxx-xxx",
            this.Email, this.Password);

        this.AuthenticationKey = null;
        string result = HttpRequests.HttpPostRequest(AuthenticationUrl, AuthenticationPost);
        var tokens = result.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
        foreach (var item in tokens)
        {
            if (item.StartsWith("Auth="))
                AuthenticationKey = item;
        }
    }


    static IEnumerable<GAProfile> GetProfiles<T>(XDocument xml)
    where T : GAProfile, new()
    {
        XNamespace dxp = xml.Root.GetNamespaceOfPrefix("dxp");
        XNamespace dns = xml.Root.GetDefaultNamespace();
        IEnumerable<GAProfile> profiles = null;
        profiles = xml.Root.Descendants(dns + "entry").Select(f => new GAProfile
        {
            AccountID = f.Elements(dxp + "property").Where(x => x.Attribute("name").Value == "ga:accountId").First().Attribute("value").Value,
            AccountName = f.Elements(dxp + "property").Where(x => x.Attribute("name").Value == "ga:accountName").First().Attribute("value").Value,
            ProfileID = f.Elements(dxp + "property").Where(x => x.Attribute("name").Value == "ga:profileId").First().Attribute("value").Value,
            WebPropertyID = f.Elements(dxp + "property").Where(x => x.Attribute("name").Value == "ga:webPropertyId").First().Attribute("value").Value,
            Currency = f.Elements(dxp + "property").Where(x => x.Attribute("name").Value == "ga:currency").First().Attribute("value").Value,
            TimeZone = f.Elements(dxp + "property").Where(x => x.Attribute("name").Value == "ga:timezone").First().Attribute("value").Value,
            TableID = f.Element(dxp + "tableId").Value,
            Updated = DateTime.Parse(f.Element(dns + "updated").Value),
            ID = f.Element(dns + "id").Value,
            Title = f.Element(dns + "title").Value
        });
        return profiles;
    }
    public IEnumerable<GAProfile> GetUserProfiles()
    {
        var xml = BaseData.GetProfilesData(Email, Password);
        return GetProfiles<GAProfile>(xml);
    }

    public IEnumerable<GAData> GetAnalytics(string tableID, DateTime from, DateTime to, int max, List<Dimension> dimensions, List<Metric> metrics, Metric sort, SortDirection order)
    {
        IEnumerable<BaseData> data = BaseData.GetBaseData(tableID, dimensions, metrics, from, to, sort, order, max);
        return data.Select(d => new GAData
        {
            Pageviews = Convert.ToInt32(d.Metrics.FirstOrDefault(met => met.Key == Metric.pageviews).Value),
            Bounces = Convert.ToInt32(d.Metrics.FirstOrDefault(met => met.Key == Metric.bounces).Value),
            Entrances = Convert.ToInt32(d.Metrics.FirstOrDefault(met => met.Key == Metric.entrances).Value),
            Exits = Convert.ToInt32(d.Metrics.FirstOrDefault(met => met.Key == Metric.exits).Value),
            NewVisits = Convert.ToInt32(d.Metrics.FirstOrDefault(met => met.Key == Metric.newVisits).Value),
            TimeOnPage = Convert.ToDouble(d.Metrics.FirstOrDefault(met => met.Key == Metric.timeOnPage).Value),
            TimeOnSite = Convert.ToDouble(d.Metrics.FirstOrDefault(met => met.Key == Metric.timeOnSite).Value),
            Visitors = Convert.ToInt32(d.Metrics.FirstOrDefault(met => met.Key == Metric.visits).Value),
            Visits = Convert.ToInt32(d.Metrics.FirstOrDefault(met => met.Key == Metric.pageviews).Value),
            UniquePageviews = Convert.ToInt32(d.Metrics.FirstOrDefault(met => met.Key == Metric.uniquePageviews).Value),
            ExitPagePath = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.exitPagePath).Value,
            LandingPagePath = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.landingPagePath).Value,
            NextPagePath = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.nextPagePath).Value,
            PagePath = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.pagePath).Value,
            PageTitle = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.pageTitle).Value,
            PreviousPagePath = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.previousPagePath).Value,
            SecondPagePath = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.secondPagePath).Value,
            Browser = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.browser).Value,
            BrowserVersion = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.browserVersion).Value,
            City = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.city).Value,
            ConnectionSpeed = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.connectionSpeed).Value,
            Country = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.country).Value,
            Date = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.date).Value,
            DaysSinceLastVisit = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.daysSinceLastVisit).Value,
            Day = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.day).Value,
            FlashVersion = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.flashVersion).Value,
            Hostname = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.hostname).Value,
            IsMobile = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.isMobile).Value,
            Hour = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.hour).Value,
            JavaEnabled = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.javaEnabled).Value,
            Language = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.language).Value,
            Latitude = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.latitude).Value,
            Longitude = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.longitude).Value,
            Month = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.month).Value,
            NetworkDomain = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.networkDomain).Value,
            NetworkLocation = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.networkLocation).Value,
            OperatingSystem = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.operatingSystem).Value,
            OperatingSystemVersion = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.operatingSystemVersion).Value,
            PageDepth = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.pageDepth).Value,
            Region = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.region).Value,
            ScreenColors = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.screenColors).Value,
            ScreenResolution = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.screenResolution).Value,
            SubContinent = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.subContinent).Value,
            UserDefinedValue = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.userDefinedValue).Value,
            VisitCount = Convert.ToInt32(d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.visitCount).Value),
            VisitLength = Convert.ToInt32(d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.visitLength).Value),
            VisitorType = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.visitorType).Value,
            Week = Convert.ToInt32(d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.week).Value),
            Year = Convert.ToInt32(d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.year).Value),
            Source = d.Dimensions.FirstOrDefault(dim => dim.Key == Dimension.source).Value
        });
    }
}
public enum Dimension
{
    exitPagePath,
    landingPagePath,
    nextPagePath,
    pagePath,
    pageTitle,
    previousPagePath,
    secondPagePath,
    browser,
    browserVersion,
    city,
    connectionSpeed,
    country,
    date,
    daysSinceLastVisit,
    day,
    flashVersion,
    hostname,
    isMobile,
    hour,
    javaEnabled,
    language,
    latitude,
    longitude,
    month,
    networkDomain,
    networkLocation,
    operatingSystem,
    operatingSystemVersion,
    pageDepth,
    region,
    screenColors,
    screenResolution,
    subContinent,
    userDefinedValue,
    visitCount,
    visitLength,
    visitorType,
    week,
    year,
    source,

}
public enum Metric
{
    bounces,
    entrances,
    exits,
    newVisits,
    pageviews,
    timeOnPage,
    timeOnSite,
    visitors,
    visits,
    uniquePageviews
}

public enum SortDirection
{
    Ascending,
    Descending
}

}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.Net;
using System.IO;
/// <summary>
/// Summary description for HttpRequests
/// </summary>
public static class HttpRequests
{
public static string HttpPostRequest(string url, string post)
{
    var encoding = new ASCIIEncoding();
    byte[] data = encoding.GetBytes(post);
    WebRequest request = WebRequest.Create(url);
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = data.Length;
    Stream stream = request.GetRequestStream();
    stream.Write(data, 0, data.Length);
    stream.Close();
    WebResponse response = request.GetResponse();
    String result;
    using (var sr = new StreamReader(response.GetResponseStream()))
    {
        result = sr.ReadToEnd();
        sr.Close();
    }
    return result;
}


public static string HttpGetRequest(string url, string[] headers)
{
    String result;
    WebRequest request = WebRequest.Create(url);
    if (headers.Length > 0)
    {
        foreach (var header in headers)
        {
            request.Headers.Add(header);
        }
    }
    WebResponse response = request.GetResponse();
    using (var sr = new StreamReader(response.GetResponseStream()))
    {
        result = sr.ReadToEnd();
        sr.Close();
    }
    return result;
}

}

这些似乎是导致错误的所有页面,对此主题的任何帮助将不胜感激。

4

0 回答 0