2017-06-13 1 views
1

Wenn ich die von get/messages.json zurückgegebenen Daten mit den Daten vergleichen, die über den Export in yammer abgerufen werden. get/messages.json gibt 6.300 Datensätze zurück. Der Datenexport liefert 10.469 Datensätze. Analog dazu post verwende ich auch den old_than Parameter. Es gab einen Kommentar in diesem Beitrag, der ein Ratenbegrenzungsproblem vorschlug. Ich kann Ihnen versichern, dass ich das Ratenlimit nicht überschreite, da ich nach jeweils 10 Anfragen 15 Sekunden pausiere.Yammer API get/messages.json gibt unvollständige Ergebnisse zurück

Zu meinen unvollständig 6.300 Zeilen I ...

  1. Verwenden Sie den Export-API, um eine Liste von allen Gruppen

  2. Schleife durch diese Liste von Gruppen zu erhalten und die Nachrichten herunterladen für Jede Gruppe mit https://www.yammer.com/api/v1/messages/in_group/:group_id.json

  3. Dann verwende ich https://www.yammer.com/api/v1/messages.json mit dem old_than-Parameter, um alle Nachrichten im Feed Alle Unternehmen zu erhalten.

Die Ausgabe erscheint mit Schritt 3

Hier zu sein ist der Code 3 im Zusammenhang oben beschriebene zu Schritt:

Sub GetAllCompanyMessages() 
      Try 
       Console.WriteLine("Getting All Company Messages") 
       If File.Exists(allCompanyPath) Then 
        'delete previous 
        If Directory.Exists(allCompanyPath) Then 
         For Each oldFile As String In Directory.GetFiles(allCompanyPath) 
          File.Delete(oldFile) 
         Next 
         Directory.Delete(allCompanyPath) 
        End If 
        'create dir 
        Directory.CreateDirectory(allCompanyPath) 
       Else 
        'create dir 
        Directory.CreateDirectory(allCompanyPath) 
        'Throw New Exception("Yammer Data Export Zip Download Failed") 
       End If 

       'get first group of messages 
       Console.WriteLine("Getting All Company Batch 1") 
       Dim client As New WebClient() 
       client.Headers.Add("Authorization", "Bearer " & accessToken) 
       client.DownloadFile(allCompanyMessagesURL, allCompanyPath & "1.json") 

       'getOlderThanID 
       Dim olderThanID As Int32 = getOlderThanID(allCompanyPath & "1.json") 

       'get remaining messages in batches of 20 
       Dim i As Int32 = 2 
       'Dim prevOlderThanID As Int32 = 0 
       Dim nextOlderThanID As Int32 = olderThanID 
       Do Until i = 0 
        Console.WriteLine("Getting All Company Batch " & i & " olderthanID " & nextOlderThanID) 
        client = Nothing 
        client = New WebClient() 
        client.Headers.Add("Authorization", "Bearer " & accessToken) 
        client.DownloadFile(allCompanyMessagesURL & "?older_than=" & nextOlderThanID, allCompanyPath & i & ".json") 
        'prevOlderThanID = nextOlderThanID 
        nextOlderThanID = getOlderThanID(allCompanyPath & i & ".json") 
        i = i + 1 
        If nextOlderThanID = 0 Then 
         'exit loop 
         i = 0 
        End If 

        ' HANDLES 10 REQUESTS IN 10 SECONDS LIMIT 
        If i >= 10 Then 
         If i Mod 10 = 0 Then 
          ' CAUSES APP TO WAIT 15 SECONDS AFTER EVERY 10th REQUEST 
          Console.WriteLine("Sleeping for 15 seconds") 
          System.Threading.Thread.Sleep(15000) 
         End If 
        End If 
       Loop 

       Console.WriteLine("Concatenating All Company Batches") 
       Dim masterJobject As New JObject 
       masterJobject = JObject.Parse("{""messages"":[]}") 
       For Each path As String In Directory.GetFiles(allCompanyPath, "*.json") 
        Console.WriteLine("Concatenating All Company Batch: " & path) 
        'open each json get messages object and append 
        Dim jObj As JObject = JObject.Parse(File.ReadAllText(path)) 
        Dim jms As New JsonMergeSettings 
        'beh 5.24.17 jms.MergeArrayHandling = MergeArrayHandling.Union 
        jms.MergeArrayHandling = MergeArrayHandling.Concat 
        masterJobject.Merge(jObj, jms) 
        'File.Delete(path) 
       Next 

       Console.WriteLine("Building Yammer-All-Company-Messages.json") 
       File.WriteAllText(outputJSONpath & "Yammer-All-Company-Messages.json", "{ ""messages"":" & masterJobject("messages").ToString() & "}") 


      Catch ex As Exception 
       ErrorHandler("ERROR GetAllCompanyMessages: " & ex.Message) 
      End Try 
     End Sub 

Function getOlderThanID(ByVal jsonPath As String) As Int32 
     Dim result As Int32 = 0 
     Try 
      Dim jObj As New JObject 
      jObj = JObject.Parse(File.ReadAllText(jsonPath)) 

      If CBool(jObj("meta")("older_available")) = True Then 

       If Not IsNothing(jObj("messages").Last()("id")) Then 
        result = jObj("messages").Last()("id") 
       End If 

      End If 
     Catch ex As Exception 
      ErrorHandler("ERROR getOlderThanID: " & ex.Message) 
     End Try 
     Return result 
    End Function 

Ich würde schätzen, nicht nur die Einsicht auf, was das Problem mit sein könnte Der get/messages.json-API-Endpunkt und wie ich meinen Code ändern könnte, um dieses Problem zu lösen.

Antwort

0

Es gibt technische Beschränkungen für die Anzahl der Elemente, die von der REST-API für Nachrichten zurückgegeben werden. Diese wurden für Client-Anwendungen entwickelt, die aktuelle Daten benötigen. Die beste Option wäre die Verwendung einzelner Aufrufe an den Nachrichtenendpunkt aus der REST-API (Feld api_url), um Lücken in Ihrem Archiv auszufüllen. Stellen Sie sicher, dass alles dauerhaft gespeichert ist.

+0

Woher wissen Sie, wo die "Lücken" programmatisch sind? – s15199d

Verwandte Themen