對不起,復活一個老問題,但我無意中發現了這個問題我自己,並寫了一個小的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文件包括:
- 你原來的問題示例代碼
- 基本
while-loop
基礎的解決方案
- 複雜狂飲,無極,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();
這聽起來像是對誰真實提供API的問題。他們可能會提供文件。除非SO上的某個人碰巧使用相同的API來做同樣的事情,否則你不可能得到這樣一個具體問題的答案。 – miken32
你還需要幫助嗎? –