Подтвердить что ты не робот

Почему постраничная страница 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 создает закрытие, и я не уверен, что с этим делать.

4b9b3361

Ответ 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 все еще не работает, он будет очень признателен.