С ошибкой написано в программе EXEx preg_match () - PullRequest
0 голосов
/ 26 августа 2018

Это вопрос о PHP, cURL , preg_match () , RegEx и Instagram.

Я пытаюсь написать PHP-код cURL, которыйВойдите в Instagram, а затем получите доступ к контенту, доступному только для проверенного (вошедшего в систему) пользователя. В этом вопросе есть интересный код только для этого .

Я скопировал и вставил следующий код:

<?php
$username = "yourname";
$password = "yourpass";
$useragent = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/50.0.2661.102 Chrome/50.0.2661.102 Safari/537.36";
$cookie=$username.".txt";

@unlink(dirname(__FILE__)."/".$cookie);

$url="https://www.instagram.com/accounts/login/?force_classic_login";

$ch  = curl_init();        

$arrSetHeaders = array(
    "User-Agent: $useragent",
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language: en-US,en;q=0.5',
    'Accept-Encoding: deflate, br',
    'Connection: keep-alive',
    'cache-control: max-age=0',
);

curl_setopt($ch, CURLOPT_HTTPHEADER, $arrSetHeaders);         
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__)."/".$cookie);
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__)."/".$cookie);
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

$page = curl_exec($ch);
curl_close($ch);          

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

$form = $form[0];

// find the action of the login form
if (!preg_match('/action="([^"]+)"/i', $form, $action)) {
    die('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);   

preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $page, $matches);

$cookieFileContent = '';

foreach($matches[1] as $item) 
{
    $cookieFileContent .= "$item; ";
}

$cookieFileContent = rtrim($cookieFileContent, '; ');
$cookieFileContent = str_replace('sessionid=; ', '', $cookieFileContent);

$oldContent = file_get_contents(dirname(__FILE__)."/".$cookie);
$oldContArr = explode("\n", $oldContent);

if(count($oldContArr))
{
    foreach($oldContArr as $k => $line)
    {
        if(strstr($line, '# '))
        {
            unset($oldContArr[$k]);
        }
    }

    $newContent = implode("\n", $oldContArr);
    $newContent = trim($newContent, "\n");

    file_put_contents(
        dirname(__FILE__)."/".$cookie,
        $newContent
    );    
}

$arrSetHeaders = array(
    'origin: https://www.instagram.com',
    'authority: www.instagram.com',
    'upgrade-insecure-requests: 1',
    'Host: www.instagram.com',
    "User-Agent: $useragent",
    'content-type: application/x-www-form-urlencoded',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language: en-US,en;q=0.5',
    'Accept-Encoding: deflate, br',
    "Referer: $url",
    "Cookie: $cookieFileContent",
    'Connection: keep-alive',
    'cache-control: max-age=0',
);

$ch  = curl_init();
curl_setopt($ch, CURLOPT_COOKIEJAR, dirname(__FILE__)."/".$cookie);
curl_setopt($ch, CURLOPT_COOKIEFILE, dirname(__FILE__)."/".$cookie);
curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $arrSetHeaders);     
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);        

sleep(5);
$page = curl_exec($ch);


preg_match_all('/^Set-Cookie:\s*([^;]*)/mi', $page, $matches);
$cookies = array();
foreach($matches[1] as $item) {
    parse_str($item, $cookie1);
    $cookies = array_merge($cookies, $cookie1);
}
var_dump($page);

curl_close($ch);
?>

Вы должны, конечно,измените значение $username с yourname на фактическое имя пользователя, а значение $password с yourpass на соответствующий пароль имени пользователя.Кроме того, я не думаю, что этот код будет работать, если в учетной записи пользователя включена двухэтапная аутентификация (т. Е., Например, MMS-сообщение отправляется на связанный телефонный номер или электронное письмо отправляется на связанный электронный адрес).), поэтому в настройках учетной записи пользователя необходимо отключить двухэтапную аутентификацию.

Однако, когда я запускаю этот скрипт PHP в Chrome, я получаю сообщение Не удалось найти журнал в форме! , что означает, что в строке 35 шаблон (записанный как RegEx) /<form method="POST" id="login-form" class="adjacent".*?<\/form>/is не найден в переменной $page, которая в то же время является в основном HTML-кодом классической страницы входа в Instagram .

RegEx error in preg_match() for the pattern

Странно, что такой шаблон не найден, потому что действительно есть HTML-код с именем <form method="POST" id="login-form" class="adjacent" (чтобы проверить его самостоятельно, перейдитена страницу входа , нажмите Ctrl + U, затем Ctrl + F и вставьте предыдущий шаблон).Итак, я предполагаю, что это потому, что RegEx каким-то образом написан с ошибкой.Это правильно?

Еще страннее, Я проверил это на странице RegEx101.com , и тест прошел успешно.Итак, почему PHP говорит, что шаблон не найден?

RegEx successful test on RegEx101.com

Идея состоит в том, что шаблон можно найти в коде исходного вопроса., так что я могу войти в систему автоматически / программно.Имейте в виду, что в коде позже используется больше preg_match() функций, например.в строках 42, 48 (preg_match_all()), 70 (preg_match_all()) и 137 (preg_match_all()).


РЕДАКТИРОВАТЬ: я понял, что если я добавлю var_dump($page); непосредственно перед строкой 35Я получаю bool(false) (другими словами, вывод HTML bool(false) Failed to find log in form!). Я думаю, именно поэтому код возвращает сообщение Не удалось найти форму входа! .Однако почему значение $page возвращает это значение?

...