PHP + Curl для входа на удаленную страницу с помощью csrfToken

У меня есть cronjob, который работает в настоящее время, и при достижении определенного порога он пытается открыть соединение с Instagram и вытащить все недавно помеченные фотографии, соответствующие этому тегу.

Проблема в том, что когда я пытаюсь инициировать удаленный вход в систему, чтобы «авторизовать» свое приложение из командной строки с помощью curl, Instagram постоянно отвечает веб-страницей с сообщением

Эта страница не может быть загружена. Если в вашем браузере отключены файлы cookie или вы просматриваете сайт в приватном режиме, попробуйте включить файлы cookie или отключить приватный режим, а затем повторите попытку.

Это мой скрипт curl.

    $username = "<myusername>";
    $password = "<mypassword>";
    $useragent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31"; // Yes cause that's the way I roll
    $cookie="InstagramCookie.txt";

    $ch  = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/'.$cookie);
    curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/'.$cookie);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.13) Gecko/20101206 Ubuntu/10.10 (maverick) Firefox/3.6.13');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

    $page = curl_exec($ch);

    // try to find the actual login form
    if (!preg_match('/<form method="POST" id="login-form" class="adjacent".*?<\/form>/is', $page, $form)) {
        throw Instagram_Manager('Failed to find log in form!');
    }

    $form = $form[0];

    // find the action of the login form
    if (!preg_match('/action="([^"]+)"/i', $form, $action)) {
        throw Instagram_Manager('Failed to find login form url');
    }

    $URL2 = $action[1]; // this is our new post url
    // find all hidden fields which we need to send with our login, this includes security tokens
    $count = preg_match_all('/<input type="hidden"\s*name="([^"]*)"\s*value="([^"]*)"/i', $form, $hiddenFields);

    $postFields = array();

    // turn the hidden fields into an array
    for ($i = 0; $i < $count; ++$i) {
        $postFields[$hiddenFields[1][$i]] = $hiddenFields[2][$i];
    }

    // add our login values
    $postFields['username'] = $username;
    $postFields['password'] = $password;

    $post = '';

    // convert to string, this won't work as an array, form will not accept multipart/form-data, only application/x-www-form-urlencoded
    foreach($postFields as $key => $value) {
        $post .= $key . '=' . urlencode($value) . '&';
    }

    $post = substr($post, 0, -1);

    // set additional curl options using our previous options
    curl_setopt($ch, CURLOPT_URL, "https://instagram.com/".$url2);
    curl_setopt($ch, CURLOPT_REFERER, $url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post);

    $page = curl_exec($ch);

    file_put_contents("/tmp/page.txt", $page);

Любые мысли, которые у вас есть, будут полезны в этот момент.


person Mark D    schedule 31.03.2013    source источник
comment
Марк Не могли бы вы рассказать мне, как запустить этот скрипт. Как передать ему URL-адрес страницы изображения и сохранить исходный код html в текстовую область?   -  person user1788736    schedule 25.11.2013


Ответы (1)


Попробовал ваш код и отлично работает после исправления некоторых основных ошибок.

Прежде всего убедитесь, что папка «/tmp» существует и файлы внутри нее доступны для записи и чтения.

сдача

$URL2 = $action[1];

за

$url2 = $action[1];

(переменная в нижнем регистре)

И

"https://instagram.com/".$url2

за

$url.$url2

Надеюсь, поможет

person Dan Stern    schedule 02.07.2013
comment
Каким должен быть $url? - person GoldenJoe; 27.05.2014