2017-06-13 21 views
1

get/messages.jsonから返されたデータと、yammerで書き出しを使って取得したデータを比較すると、 get/messages.jsonは6,300レコードを返します。データのエクスポートでは10,469レコードが返されます。このpostと同様に、私もolder_thanパラメータを使用しています。そのポストにレート制限問題を示唆するコメントがありました。 10回のリクエストごとに15秒間休止するので、レート制限を超えていないことを保証することができます。 I ...Yammer API get/messages.jsonが不完全な結果を返す

  1. 私の不完全な6300行は、グループのリストをグループのすべての

  2. ループのリストを取得してのメッセージをダウンロードするには、エクスポートAPIを使用して取得するために

    各グループを使用するhttps://www.yammer.com/api/v1/messages/in_group/:group_id.json

  3. 次に、すべての会社のフィードのすべてのメッセージを取得するために、older_thanパラメータにhttps://www.yammer.com/api/v1/messages.jsonを使用します。

問題は、ここで、ステップ3

であるように思われる上記で概説した3段階に関連するコードです:

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 

は、私は問題がある可能性がありますどのように任意の洞察力をいただければ幸いですget/messages.json APIエンドポイント、およびこの問題を解決するためのコードの変更方法について説明します。

答えて

0

メッセージ用にREST APIから返されるアイテムの数には技術的な制限があります。最近のデータを必要とするクライアントアプリケーション向けに設計されています。最良の選択肢は、REST API(api_urlフィールド)からのメッセージエンドポイントへの個々の呼び出しを使用して、アーカイブ内のギャップを埋めることです。すべてが永続的な方法で格納されていることを確認してください。

+0

「ギャップ」がプログラム的にどこにあるのかはどうやって分かりますか? – s15199d

関連する問題