2013-03-31 2 views
2

У меня есть cronjob, который выполняется в настоящее время, когда при достижении определенного порога он пытается открыть соединение с Instagram и вытащить все недавно помеченные фотографии, соответствующие этому тегу ,PHP + Curl для входа на удаленную страницу с csrfToken

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

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

Это мой скручивающийся скрипт.

$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); 

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

+0

Mark Не могли бы вы рассказать мне, как запустить этот скрипт. Как передать URL-адрес страницы изображения и сохранить исходный код html в textarea? – user1788736

ответ

1

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

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

изменение

$URL2 = $action[1]; 

для

$url2 = $action[1]; 

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

И

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

для

$url.$url2 

надеюсь, что это поможет

+0

Что такое $ url? – GoldenJoe

Смежные вопросы