Почему постраничная страница Instagram возвращает одну и ту же страницу снова и снова?
Код
Я создал класс PHP для связи с Instagram API. Я использую частную функцию под названием api_request
(показано ниже) для связи с API-интерфейсом Instagram:
private function api_request( $request = null ) {
if ( is_null( $request ) ) {
$request = $this->request["httpRequest"];
}
$body = wp_remote_retrieve_body( wp_remote_get( $request, array(
"timeout" => 10,
"content-type" => "application/json"
)
)
);
try {
$response = json_decode( $body, true );
$this->data["pagination"] = $response["pagination"]["next_url"];
$this->data["response"] = $response["data"];
$this->setup_data( $this->data );
} catch ( Exception $ex ) {
$this->data = null;
}
}
Эти две строки кода...
$this->data["pagination"] = $response["pagination"]["next_url"];
$this->data["response"] = $response["data"];
... устанавливает мои данные в этом массиве:
private $data = array (
"response" => null,
"pagination" => null,
"photos" => array()
);
Проблема
Всякий раз, когда я запрашиваю следующую страницу, со следующей функцией:
public function pagination_query() {
$this->api_request( $this->data["pagination"] );
$output = json_encode( $this->data["photos"] );
return $output;
}
Instagram дает мне первую страницу, снова и снова выигрывает.
Любая идея, что проблема здесь?
Обновление # 1
Я понял, что, поскольку моя функция setup_data
(используется в функции api_request
) подталкивает мои фото объекты к концу моего массива $this->data["photos"]
:
private function setup_data( $data ) {
foreach ( $data["response"] as $obj ) {
/* code that parses the api, goes here */
/* pushes new object onto photo stack */
array_push( $this->data["photos"], $new_obj );
}
}
... при запросе новой страницы необходимо создать пустой массив:
public function pagination_query() {
$this->data["photos"] = array(); // kicks out old photo objects
$this->api_request( $this->data["pagination"] );
$output = json_encode( $this->data["photos"] );
return $output;
}
Я могу получить вторую страницу, но все последующие вызовы pagination_query
возвращают только вторую страницу. Любые идеи, что может быть неправильным?
Обновление # 2
Я обнаружил, что с помощью инструкции while
, чтобы сделать вызов функции api_request
сам, позволяет мне получить страницу за страницей просто отлично:
private function api_request( $request = null ) {
if ( is_null( $request ) ) {
$request = $this->request["httpRequest"];
}
$body = wp_remote_retrieve_body( wp_remote_get( $request, array(
"timeout" => 18,
"content-type" => "application/json"
)
)
);
try {
$response = json_decode( $body, true );
$this->data["response"] = $response["data"];
$this->data["next_page"] = $response["pagination"]["next_url"];
$this->setup_data( $this->data );
// while state returns page after page just fine
while ( count( $this->data["photos"] ) < 80 ) {
$this-> api_request( $this->data["next_page"] );
}
} catch ( Exception $ex ) {
$this->data = null;
}
}
Однако это не исправляет мою функцию pagination_query
и кажется, что мой блок try-catch
создает закрытие, и я не уверен, что с этим делать.
Ответы
Ответ 1
В вашем первом фрагменте кода у вас есть:
$this->data["response"] = $response["data"];
$this->data["next_page"] = $response["pagination"]["next_url"];
Обратите внимание на две клавиши: response
и next_page
Затем во втором фрагменте у вас есть:
$this->data["pagination"] = $response["pagination"]["next_url"];
$this->data["response"] = $response["data"];
Теперь next_page
есть pagination
Теперь, если вы используете
$this->api_request( $this->data["pagination"] );
Но вы используете $this->data["next_page"] = $response["pagination"]["next_url"];
, конечно, вы не получите правильных результатов.
В любом случае попробуйте var_dump содержимое вашего запроса $:
public function pagination_query() {
var_dump($this->data["pagination"]);
$this->api_request( $this->data["pagination"] );
$output = json_encode( $this->data["photos"] );
return $output;
}
Если у вас есть debbugger, также проверяйте внутри api_request, который каждый раз передается URL
Ответ 2
Я добавил следующие строки кода в блок try
моего оператора try...catch
для возврата нескольких последовательных страниц за раз:
while ( count( $this->data["photos"] ) < 160 ) {
$this-> api_request( $this->data["next_page"] );
}
Это по существу говорит api_request
для вызова себя, пока мой массив $this->data["next_page"]
не будет заполнен 160-граммами.
Это позволяет мне извлечь в общей сложности 320 грамм из Instagram api: 160 грамм, когда api_request
вызывается после загрузки страницы и еще 160 из моего первого вызова pagination_query
.
Это не идеальное решение, поскольку второй вызов pagination_query
еще возвращает одни и те же данные из моего первого вызова pagination_query
, но он должен будет сделать это в настоящее время.
Обновление
Вышеупомянутое решение является взломом. Если кто-нибудь может понять, почему мой метод pagination_query
все еще не работает, он будет очень признателен.