2017-04-18 72 views
1

因此,我現在一直在嘗試幾個小時以基本獲得用此api選擇的用戶的最近平均分區。所以我可以用代碼得到它的一部分。但是如果有下一頁,我不知道如何進入下一頁。我所知道的是我需要更改的網址:cursor = nextPageCursor的json值以進入下一頁。但是,我一直在嘗試,無法從所有頁面獲取正確的信息。我如何通過光標的結果循環瀏覽每個頁面

繼承人我的代碼到目前爲止只得到第一頁:

<?php 
    $userid = htmlentities($_GET['userid'], ENT_QUOTES); 
    $assettypes = array("Hat", "Face", "Gear", "HairAccessory", "FaceAccessory", "NeckAccessory", "ShoulderAccessory", "FrontAccessory", "BackAccessory", "WaistAccessory"); 

    $rap2 = 0; 
    foreach($assettypes as $assettype){ 
     $url = "https://inventory.roblox.com/v1/users/" . $userid . "/assets/collectibles?assetType=" . $assettype . "&sortOrder=Asc&limit=100&cursor="; 
     $get = file_get_contents($url); 
     $json = json_decode($get); 
     $rap = 0; 

     foreach($json->data as $val){ 
      $rap += $val->recentAveragePrice; 
     } 

     $rap2 += $rap; 
    } 

    echo $rap2; 
?> 
+0

這聽起來像是對誰真實提供API的問題。他們可能會提供文件。除非SO上的某個人碰巧使用相同的API來做同樣的事情,否則你不可能得到這樣一個具體問題的答案。 – miken32

+0

你還需要幫助嗎? –

回答

0

對不起,復活一個老問題,但我無意中發現了這個問題我自己,並寫了一個小的PHP類來幫助我完成獲取所有頁面Roblox的分頁WebAPI端點在一個請求中。

基本解決(順序&慢)將激活某種循環,連續調用的API,同時增加?page?cursor查詢參數的值,直到對於給定AssetType不再返回nextPageCursor值的響應,再破循環和繼續前進。

<?php 
    function get_page($userid, $assettype, $page, $cursor){ 
     $url = "https://inventory.roblox.com/v1/users/" . $userid . "/assets/collectibles?assetType=" . $assettype . "&sortOrder=Asc&limit=100&cursor=" . $cursor . "&page=" . $page; 
     $get = file_get_contents($url); 
     $json = json_decode($get); 
     $rap = 0; 
     $items = 0; 
     foreach($json->data as $val){ 
      $rap += $val->recentAveragePrice; 
      $items += 1; 
     } 
     return [$rap, $items, $json->nextPageCursor]; 
    } 
    function get_all_pages_for_asset_type($userid, $assettype){ 
     $keep_fetching = true; 
     $cursor = ''; 
     $page = 1; 
     $rap = 0; 
     $items = 0; 
     while($keep_fetching){ 
      $results = get_page($userid, $assettype, $page, $cursor); 
      $rap += $results[0]; 
      $items += $results[1]; 
      if(!$results[2] || empty(trim($results[2]))){ 
       // nextPageCursor empty, break 
       $keep_fetching = false; 
       break; 
      }else{ 
       // nextPageCursor present, continue & fetch next page... 
       $page+=1; 
       $cursor = $results[2]; 
      } 
     } 
     return [$page, $items, $rap]; 
    } 
    $userid = htmlentities($_GET['userid'], ENT_QUOTES); 
    $assettypes = array("Hat", "Face", "Gear", "HairAccessory", "FaceAccessory", "NeckAccessory", "ShoulderAccessory", "FrontAccessory", "BackAccessory", "WaistAccessory"); 
    $rap2 = 0; 
    $exec_time_start = microtime(true); 
    $items_total = 0; 
    $pages_total = 0; 
    foreach($assettypes as $assettype){ 
     $results = get_all_pages_for_asset_type($userid, $assettype); 
     $pages_total += $results[0]; 
     $items_total += $results[1]; 
     $rap2 += $results[2]; 
    } 
    echo json_encode([ 
     'total_rap' => $rap2, 
     'items' => $items_total, 
     'pages' => $pages_total, 
     'rendertime' => (microtime(true) - $exec_time_start) 
    ]); 
?> 

一種更先進的解決方案(併發&更快)。將火過多個動態的諾言鏈,各1個AssetType,這將動態地在他們自己的,獨立的循環運行,直到nextPageCursor是空的,在該特定AssetType的承諾鏈可以解決。一旦所有10諾言鏈解決徹底,(使用GuzzleHttp\Promise\Settle,這就好比是JS的Promise.all(promises[])最終計算完成&返回

我已經發布了完整的代碼在這裏既解決Github上:https://github.com/jakedowns/roblox-api-fetch-all-pages

指數PHP文件包括:

  1. 你原來的問題示例代碼
  2. 基本while-loop基礎的解決方案
  3. 複雜狂飲,無極,CurlMulti方法

的方法之間的一些基本的時間比較:

// ~4 seconds for 10 pages of 607 items (incomplete) 
original_example(); 

// ~15 seconds for 31 pages of 2483 
basic_solution(); 

// ~4 seconds for 31 pages of 2483 items 
advanced_solution();