2013-03-01 121 views
0

我正嘗試從.NET應用程序連接到Google AnalyticsAPI。下面是代碼,我想出了:嘗試通過.NET連接到Google Analytics API會產生「400錯誤請求」

Public Function GetData() As String 
    Dim client As AssertionFlowClient = New AssertionFlowClient(GoogleAuthenticationServer.Description, 
                   New X509Certificate2("C:\Users\xxxxx\privatekey.p12", "notasecret", 
                        X509KeyStorageFlags.Exportable Or X509KeyStorageFlags.MachineKeySet)) With { 
                   .Scope = "analytics.readonly", 
                   .ServiceAccountId = "[email protected]"} 
    Dim authenticator As OAuth2Authenticator(Of AssertionFlowClient) = New OAuth2Authenticator(Of AssertionFlowClient)(client, AddressOf AssertionFlowClient.GetState) 
    Dim service As AnalyticsService = New AnalyticsService(authenticator) 

    Dim profileId As String = "ga:xxxxx" 
    Dim startDate As String = "2013-02-15" 
    Dim endDate As String = "2013-02-20" 
    Dim metrics As String = "ga:visitors" 

    Dim request As DataResource.GaResource.GetRequest = service.Data.Ga.Get(profileId, startDate, endDate, metrics) 
    Dim data As GaData = request.Fetch() 

    Return data.ToString() 
End Function 

我的問題是,當我打這個方法,我上request.Fetch()一行「在發送直接消息或得到響應時出現錯誤異常「。內部例外說:「遠程服務器返回一個錯誤:(400)錯誤的請求。」

這個錯誤顯然非常含糊。根據Google's documentation of the error codes,400錯誤請求表明輸入參數不知道。任何人都可以通過查看我的代碼中的參數來診斷問題嗎?否則,我怎麼會開始追查我做錯了什麼?錯誤中幾乎沒有提供任何信息。

(至少我已經得到過驗證的階段......我認爲

回答

1

this answer廣泛借鑑,我想出瞭解決的辦法是這樣的:

Imports System.Security.Cryptography.X509Certificates 
Imports Google.Apis.Analytics.v3 
Imports Google.Apis.Analytics.v3.Data 
Imports Google.Apis.Authentication.OAuth2 
Imports Google.Apis.Authentication.OAuth2.DotNetOpenAuth 
Imports System.Security.Cryptography 

Public Class GoogleAnalytics 

    Private _profileId As String 
    Private _service As AnalyticsService 

    ''' <summary> 
    ''' Creates an instance of the Google Analytics interface 
    ''' </summary> 
    ''' <param name="profileId">The Google Analytics profile ID, in the form "ga:123456789". This is *not* the same as the ID number used in the GA JavaScript to initialize the tracking! The number you want is in Google Analytics > Admin > (your profile) > Profile Settings.</param> 
    ''' <param name="serviceAccountId">The e-mail address of the Service Account that will access the API. These accounts can be generated from the Google API Console and then authorized by adding the e-mail address to the list of authorized users in Google Analytics.</param> 
    ''' <param name="privateKeyPath">The path to the private-key (.p12) file from Google.</param> 
    ''' <param name="certificatePassword">The password for the private key. Probably "notasecret".</param> 
    ''' <remarks>Once created, this GoogleAnalytics object can be used to make an arbitrary number of requests.</remarks> 
    Public Sub New(profileId As String, serviceAccountId As String, privateKeyPath As String, certificatePassword As String) 
     Dim cert As X509Certificate2 = New X509Certificate2(privateKeyPath, certificatePassword, X509KeyStorageFlags.Exportable Or X509KeyStorageFlags.MachineKeySet) 
     Dim client As AssertionFlowClient = New AssertionFlowClient(GoogleAuthenticationServer.Description, cert) With {.Scope = "https://www.googleapis.com/auth/analytics.readonly", 
                                 .ServiceAccountId = serviceAccountId} 
     Dim authenticator As OAuth2Authenticator(Of AssertionFlowClient) = New OAuth2Authenticator(Of AssertionFlowClient)(client, AddressOf AssertionFlowClient.GetState) 
     _service = New AnalyticsService(authenticator) 

     _profileId = profileId 
    End Sub 

    Public Function GetData(startDate As String, endDate As String, metrics As String, dimensions As String, Optional filters As String = Nothing) As GaData 
     Dim request As DataResource.GaResource.GetRequest = _service.Data.Ga.Get(_profileId, startDate, endDate, metrics) 
     request.Dimensions = dimensions 

     If filters IsNot Nothing Then 
      request.Filters = filters 
     End If 

     Return request.Fetch() 
    End Function 

End Class 

這是一個獨立的類,可以使用,如下所示:

Dim analytics As New GoogleAnalytics("ga:12345678", "[email protected]", "C:\privatekey.p12", "notasecret") 
Dim data as GaData = analytics.GetData(DateTime.Now.AddDays(-30).ToString("yyyy-MM-dd"), 
             DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd"), 
             "ga:totalEvents", 
             "ga:eventCategory,ga:eventAction") 

我發現這個窪最大的困惑是配置文件ID。這是而不是您傳遞給Google的Javascript跟蹤代碼的ID號;相反,這是您在Google Analytics>管理>(您的個人資料)>配置文件設置中找到的號碼。希望這可以幫助別人!

相關問題