Как выбрать элементы из HTML-ответа, как это, используя php? - PullRequest
1 голос
/ 21 апреля 2019

Я просто делал запросы керлинга в Facebook. У меня возникла проблема: если я смогу просто преодолеть эту проблему, я мог бы продолжить все легко.

Мой код скручивания

function curl($url, $data=null, $ua=null, $cookie=null){
    $c = curl_init();
    curl_setopt($c, CURLOPT_URL, $url);
    if($data != null){
        curl_setopt($c, CURLOPT_POST, true);
        curl_setopt($c, CURLOPT_POSTFIELDS, $data);
    }
    curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
    if($cookie != null){
        curl_setopt($c, CURLOPT_COOKIE, $cookie);
    }
    if($ua != null){
        curl_setopt($c, CURLOPT_USERAGENT, $ua);
    }
    $hmm = curl_exec($c);
    curl_close($c);
    return $hmm;
}
$ua = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0';
$data = curl('https://facebook.com/', 0, $ua, 0,); //$data stores the html response of Facebook.com
print_r($data);

Итак, из этогоВ коде мы получаем ответ html от facebook.com. Моя проблема, в которой я застрял, заключалась в получении некоторых значений из ответа html. Мне нужно получить поля ввода значений. Вы можете посмотреть источник представления здесь: - view-source: https://www.facebook.com Поэтому, пожалуйста, помогите мне получить значения полей ввода из первой формы (форма id = "login_form" action = "https://www.facebook.com/login/device-based/regular/login/?login_attempt=1&lwv=111" method =" post "novalidate =" 1 "onsubmit =" ") Пример: - Мне нужно получитьиз этого поля (input type = "hidden" name = "jazoest" value = "2691" autocomplete = "off" /) name и value, поэтому мне нужно повторить jazoest, 2691 и другие поля ввода, подобные этому, я пробовал preg_matchне работает должным образом, и у меня есть пример с Dom делает то же самое

Используйте этот код с функцией curl

$ua = 'Mozilla/4.0 (compatible; MSIE 5.0; S60/3.0 NokiaN73-1/2.0(2.0617.0.0.7) Profile/MIDP-2.0 Configuration/CLDC-1.1)';
$data = curl('https://m.facebook.com/', 0, $ua, 0,); //$data stores the html response of Facebook.com
print_r($data);

Это URL веб-страницы для мобильных устройств Facebook и useragent, использованный здесь сгос помощью Dom мы можем получить поля ввода с кодом ниже

function parse_inputs($html) {
    $dom = new DOMDocument;
    @$dom->loadxml($html);
    $inputs = $dom->getElementsByTagName('input');
    return($inputs);
}

$inputs = parse_inputs($data);
    $post_params = "";
    foreach ($inputs as $input) {
                $post_params .= $input->getAttribute('name') . '=' . urlencode($input->getAttribute('value')) . '&';
        }
print_r($post_params);

Из этого кода я могу получить поля ввода для m.facebook.com, но не для www.facebook.com, пожалуйста, помогите мнес этим и другим полезным примером здесь, пожалуйста, проверьте это также: - https://github.com/jerry-riady/Script-auto-like-face/blob/master/update.php Заранее спасибо за все ответы.

Ответы [ 2 ]

1 голос
/ 21 апреля 2019

Использование loadHTML вместо loadXML должно работать (локально проверено):

Заменить:

@$dom->loadxml($html);

на:

$dom->loadHTML($html);

Кроме того, вместо того, чтобы приглушать ошибки вместе с @ (очень редко хорошая идея), я бы предложил использовать следующую строку (вне вашей функции parse_inputs):

libxml_use_internal_errors(true);

Этоболее подходящий способ отключения вывода ошибок (они по-прежнему будут доступны через libxml_get_last_error() и / или libxml_get_errors() ( source ).

0 голосов
/ 21 апреля 2019

пользовательский агент

Mozilla/4.0 (compatible; MSIE 5.0; S60/3.0 NokiaN73-1/2.0(2.0617.0.0.7) Profile/MIDP-2.0 Configuration/CLDC-1.1)

заставляет Facebook полагать, что вы (nokia) мобильный телефон, и пытается перенаправить вас на m.facebook.com, даже если ваш запрос https://www.facebook.com .. чтобы исправить это, используйте вместо этого настольный пользовательский агент, например

Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0

этот код:

<?php
declare(strict_types=1);
$ch=curl_init();
curl_setopt_array($ch,array(
    CURLOPT_URL=>'https://www.facebook.com',
    CURLOPT_USERAGENT=>'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0',//'libcurl/'.(curl_version()['version']).' PHP/'.PHP_VERSION,
    CURLOPT_RETURNTRANSFER=>1,
));
$html=curl_exec($ch);
$domd=@DOMDocument::loadHTML($html);
$inputs=[];
foreach($domd->getElementsByTagName("input") as $input){
    $inputs[$input->getAttribute("name")]=$input->getAttribute("value");
}
print_r($inputs);

дает такой вывод:

$ php wtf4.php
Array
(
    [jazoest] => 2747
    [lsd] => AVpUepnL
    [email] =>
    [pass] =>
    [] => Logg inn
    [timezone] =>
    [lgndim] =>
    [lgnrnd] => 171046_tirL
    [lgnjs] => n
    [ab_test_data] =>
    [locale] => nb_NO
    [next] => https://www.facebook.com/
    [login_source] => login_bluebar
    [prefill_contact_point] =>
    [prefill_source] =>
    [prefill_type] =>
    [firstname] =>
    [lastname] =>
    [reg_email__] =>
    [reg_email_confirmation__] =>
    [reg_second_contactpoint__] =>
    [reg_passwd__] =>
    [sex] => 2
    [referrer] =>
    [asked_to_login] => 0
    [terms] => on
    [ns] => 0
    [ri] => a78c3ab6-0e06-e414-b463-452c92229760
    [action_dialog_shown] =>
    [contactpoint_label] => email_or_phone
    [ignore] => reg_email_confirmation__|reg_second_contactpoint__
    [reg_instance] => BrW7XFdd5CvG1L4FidZcVijt
    [captcha_persist_data] => AZl2s6wFOpoQEyjGUhIQJW23Say7yoZA6QdqOYGsPdq52J_eXFWd6lVUIwsHSDDPDyK2dOdsaN8uh2HCO7nKrZawq0lN16Nq0w4qrl-IzIFK9QHic9uSo5kaElwzPLgLnLvRmswIUI_cfils5_0qrhOcCAghdy-wzJmamAi015ksnMSe6ZP3OQHf9l8Hcx1PqIbSK-vlKu9PWDUbSbtXT7o4NFM5jd3gAwPH2fVYhxtsc17DrOE5ABeZ_49j-WBNJNHEiiibndcI2iTVRt1QEMlzVDf5SNfSA0Ht7cbV9cA-u7DjTT8S40Wfw7xdmZ65dVpMR338xQuKuDZ2_sKKNousie9nKdono7COI51BFoHFFaKTq5ntNbaqNNxF3h1YBxE
    [captcha_response] =>
)
  • кстати, вы можете найти этот проект интересным: https://github.com/divinity76/msgme

    • инструмент командной строки для отправки сообщений в facebook, и он выполняет вход в Facebook, чтобы добиться этого.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...