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