Facebook Войти используя cURL и PHP - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь добраться до страницы входа в Facebook, используя curl. Мое намерение состоит в том, чтобы войти в Facebook, а затем сделать некоторые scaping. Я не использую API Facebook из-за последних ограничений ... Мне нужно очистить комментарии к сообщениям, а это невозможно только с помощью API.

Вот мой код:

curl_setopt($ch, CURLOPT_URL,"https://web.facebook.com");
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$response = curl_exec($ch);
curl_close($ch);
echo $response;

Я бы хотел, чтобы это перенаправляло на страницу входа в систему, затем, когда пользователь заполняет форму входа в систему, я беру учетные данные и использую их для перенаправления на домашнюю страницу и начала очистки.

Во всяком случае, это то, что я получаю:

I am actually running this on chrome...

1 Ответ

0 голосов
/ 31 августа 2018

(ps, я являюсь автором программы) эта программа входит в Facebook для отправки сообщений. код входа в систему можно найти здесь , процедура входа выполняется в функции конструктора,

но суть в том, что вам нужно сначала выполнить запрос GET, чтобы получить cookie-файл, токен csrf и некоторые другие данные, проанализировать их из формы lgoin, а затем отправить их обратно в application/x-www-form-urlencoded запрос POST вместе с именем пользователя и паролем к URL-адресу входа, специфичному для вашей сессии cookie, URL-адрес которого вы также должны проанализировать из html, полученного в первом GET-запросе.

также было бы в ваших интересах использовать пользовательский агент, подразумевая, что у вас есть дерьмовая поддержка javascript (потому что на самом деле, с PHP, у вас ее нет.), Пример, используемый этим кодом, это 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9300; en) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.570 Mobile Safari/534.8+' (он же старый телефон BlackBerry)

  • Теперь, если вы используете пользовательский агент для смартфона, он может иногда попросить вас установить приложение для смартфона, и если вы получите этот вопрос, он не позволит вам завершить вход в систему, пока вы не ответите либо да или нет, поэтому вам нужно добавить код для обнаружения этого вопроса и ответить на него, если он есть, вы можете обнаружить этот вопрос с помощью XPath "//a[contains(@href,'/login/save-device/cancel/')]" и protip, хороший способ подтвердить, что вам удалось войти в систему, это посмотреть для кнопки выхода из системы, которая в XPath выглядит как //a[contains(@href,"/logout.php")]

самая важная часть кода:

function __construct() {
    $this->recipientID = \MsgMe\getUserOption ( 'Facebook', 'recipientID', NULL );
    if (NULL === $this->recipientID) {
        throw new \Exception ( 'Error: cannot find [Facebook] recipientID option!' );
    }
    $this->email = \MsgMe\getUserOption ( 'Facebook', 'email', NULL );
    if (NULL === $this->email) {
        throw new \Exception ( 'Error: cannot find [Facebook] email option!' );
    }
    $this->password = \MsgMe\getUserOption ( 'Facebook', 'password', NULL );
    if (NULL === $this->password) {
        throw new \Exception ( 'Error: cannot find [Facebook] password option!' );
    }
    $this->hc = new \hhb_curl ();
    $hc = &$this->hc;
    $hc->_setComfortableOptions ();
    $hc->setopt_array ( array (
            CURLOPT_USERAGENT => 'Mozilla/5.0 (BlackBerry; U; BlackBerry 9300; en) AppleWebKit/534.8+ (KHTML, like Gecko) Version/6.0.0.570 Mobile Safari/534.8+',
            CURLOPT_HTTPHEADER => array (
                    'accept-language:en-US,en;q=0.8' 
            ) 
    ) );
    $hc->exec ( 'https://m.facebook.com/' );
    // \hhb_var_dump ( $hc->getStdErr (), $hc->getStdOut () ) & die ();
    $domd = @\DOMDocument::loadHTML ( $hc->getResponseBody () );    
    $form = (\MsgMe\tools\getDOMDocumentFormInputs ( $domd, true )) ['login_form'];
    $url = $domd->getElementsByTagName ( "form" )->item ( 0 )->getAttribute ( "action" );
    $postfields = (function () use (&$form): array {
        $ret = array ();
        foreach ( $form as $input ) {
            $ret [$input->getAttribute ( "name" )] = $input->getAttribute ( "value" );
        }
        return $ret;
    });
    $postfields = $postfields (); // sorry about that, eclipse can't handle IIFE syntax.
    assert ( array_key_exists ( 'email', $postfields ) );
    assert ( array_key_exists ( 'pass', $postfields ) );
    $postfields ['email'] = $this->email;
    $postfields ['pass'] = $this->password;
    $hc->setopt_array ( array (
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => http_build_query ( $postfields ),
            CURLOPT_HTTPHEADER => array (
                    'accept-language:en-US,en;q=0.8' 
            ) 
    ) );
    // \hhb_var_dump ($postfields ) & die ();
    $hc->exec ( $url );
    // \hhb_var_dump ( $hc->getStdErr (), $hc->getStdOut () ) & die ();

    $domd = @\DOMDocument::loadHTML ( $hc->getResponseBody () );
    $xp = new \DOMXPath ( $domd );
    $InstallFacebookAppRequest = $xp->query ( "//a[contains(@href,'/login/save-device/cancel/')]" );
    if ($InstallFacebookAppRequest->length > 0) {
        // not all accounts get this, but some do, not sure why, anyway, if this exist, fb is asking "ey wanna install the fb app instead of using the website?"
        // and won't let you proceed further until you say yes or no. so we say no.
        $url = 'https://m.facebook.com' . $InstallFacebookAppRequest->item ( 0 )->getAttribute ( "href" );
        $hc->exec ( $url );
        $domd = @\DOMDocument::loadHTML ( $hc->getResponseBody () );
        $xp = new \DOMXPath ( $domd );
    }
    unset ( $InstallFacebookAppRequest, $url );
    $urlinfo = parse_url ( $hc->getinfo ( CURLINFO_EFFECTIVE_URL ) );
    $a = $xp->query ( '//a[contains(@href,"/logout.php")]' );
    if ($a->length < 1) {
        $debuginfo = $hc->getStdErr () . $hc->getStdOut ();
        $tmp = tmpfile ();
        fwrite ( $tmp, $debuginfo );
        $debuginfourl = shell_exec ( "cat " . escapeshellarg ( stream_get_meta_data ( $tmp ) ['uri'] ) . " | pastebinit" );
        fclose ( $tmp );
        throw new \RuntimeException ( 'failed to login to facebook! apparently... cannot find the logout url!  debuginfo url: ' . $debuginfourl );
    }
    $a = $a->item ( 0 );
    $url = $urlinfo ['scheme'] . '://' . $urlinfo ['host'] . $a->getAttribute ( "href" );
    $this->logoutUrl = $url;
    // all initialized, ready to sendMessage();
}
...