Задача
Написать робота (MySQl+php+js), который находил бы фото по тегам и ставил им лайки. Более того, желательно, чтобы наш робот не попал в бан.
Авторизация
В первую очередь, нам необходимо авторизоваться. Поэтому главная страница робота имеет всего одну кнопку-ссылку.
<a href="https://api.instagram.com/oauth/authorize/?client_id=ваш_id&redirect_uri=страница_куда_направляем_пользователя_после_авторизации&response_type=code&scope=basic+comments+relationships+likes"><img src="img/logo.png"></a>
и в самом начале проверяем, не авторизован ли нас посетитель ранее (проверяем куку), и если да, то перенаправляем в личный кабинет.
if ($_COOKIE['sess_id']!="") header('location: ссылка на личный кабинет');
Ниже содержимое скрипта, сюда человек попадает после того, как даст разрешение нам на обработку его данных. Подключаемый в начале файл config.php устанавливает соединение с БД
//Установим соединение с БД include 'config.php'; //Если юзер не дал разрешение, отправляем его на первую страницу if ($_GET['error']=='access_denied') header('location: ссылка_на_главную_страницу'); else { if ($_GET['code']!="") { //Получаем токен $ClientID = 'ИД_НАШЕГО_ПРИЛОЖЕНИЯ'; $ClientSecret = 'КлиентСикрет_НАШЕГО_ПРИЛОЖЕНИЯ'; $uri = 'ссылка_на_этот_скрипт'; $url = "https://api.instagram.com/oauth/access_token"; $access_token_parameters = array( 'client_id' => $ClientID, 'client_secret' => $ClientSecret, 'grant_type' => 'authorization_code', 'redirect_uri' => $uri, 'code' => $_GET['code'] ); $curl = curl_init($url); curl_setopt($curl,CURLOPT_POST,true); curl_setopt($curl,CURLOPT_POSTFIELDS,$access_token_parameters); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($curl); curl_close($curl); $data = json_decode($data, true); $token = $data['access_token']; $full_name = $data['user']['full_name']; $username = $data['user']['username']; $profile_picture = $data['user']['profile_picture']; $id = $data['user']['id']; if ($id!="") { //может уже есть? $nashelsy = 0; $sql = mysql_query("SELECT*FROM qf_users Where qf_id='".$id."' LIMIT 1"); while($record = mysql_fetch_array($sql)) $nashelsy = 1; //сгенерируем id сессии $sess_id = md5(md5($id).$_SERVER['REMOTE_ADDR']); if ($nashelsy==0) { //нет такого, добавим $sql = mysql_query("INSERT INTO `qf_users` (`qf_id`, `qf_token`, `qf_username`, `qf_full_name`, `qf_profile_picture`, `qf_sess_id`, `qf_ip`) VALUES ('".$id."', '".$token."', '".$username."', '".$full_name."', '".$profile_picture."', '".$sess_id."', '".$_SERVER['REMOTE_ADDR']."');"); } else { //есть такой, обновим $sql1 = mysql_query("UPDATE `qf_users` SET `qf_token` = '".$token."', `qf_username` = '".$username."', `qf_full_name` = '".$full_name."', `qf_profile_picture` = '".$profile_picture."', `qf_ip` = '".$_SERVER['REMOTE_ADDR']."', `qf_sess_id` = '".$sess_id."' WHERE `qf_users`.`qf_id` = '".$id."' LIMIT 1 ;"); } //теперь ставим куку и отправляем его на главную, там его встретит наш скрипт и перенаправит в личный кабинет setcookie('sess_id',$sess_id,time()+86400,'/','имя_домена'); header('location: ссылка_на_главную'); } } }
Переходим к личному кабинету
Проверяем есть ли, у нас такой пользователь и если нет, отправляем на главную.
include 'config.php'; $sql = mysql_query("SELECT*FROM qf_users WHERE qf_sess_id='".$_COOKIE['sess_id']."'"); while($record = mysql_fetch_array($sql)) { $user_id = $record['qf_id']; $user_token = $record['qf_token']; $user_email = $record['qf_email']; $user_username = $record['qf_username']; $user_full_name = $record['qf_full_name']; $user_profile_picture = $record['qf_profile_picture']; $user_ip = $record['qf_ip']; } if (md5(md5($user_id).$_SERVER['REMOTE_ADDR'])!=$_COOKIE['sess_id']) { setcookie('sess_id',$_COOKIE['sess_id'],time()-3600,'/','домен'); header('location: ссылка на главную'); }
Довольно примитивная авторизация, но сразу предполагалось, что сервисом кроме меня никто пользоваться не будет, так что проблем возникнуть не должно.
На самой же странице расположим всего несколько полей: для ввода тега, для ввода максимального кол-ва лайков у фотографии (фотографии с большим кол-ом лайкаться не будут, т.к. это не имеет смысла, кнопочка «Поехали» и кнопка «Выход»). Так же нам понадобится поле, где мы будем сохранять id следующей фотографии.
<table width="100%" border="0" cellspacing="0" cellpadding="0"> <tr> <td align="left" valign="bottom"> Искать фото с тегом <input name="tag" id="tag" type="text" placeholder='Введите тег'> где лайков не более <input name="kollikes" id="kollikes" type="number" value="40"> <span style="display:inline-block; border:1px solid black; padding:5px; cursor:pointer" onClick="gogogo()" id="bb">Поехали!</span> <hr> <input name="last_id" id="last_id" type="text" placeholder='Следующая'> </td> <td align="right" valign="bottom"> <img src="" height="30"> <?=$user_full_name?> / <a href="logout.php">Выход</a></td> </tr> </table>
и не забудем див, для наблюдения за происходящим
<div id="res" align="center"></div>
Далее логика проста, нам необходимо имитировать поведение обычного человека, иначе нашего робота довольно быстро забянят, и вся работа коту под хвост. Поэтому добавляем на страницу следующий код (все таймауты можно выбрать произвольно):
<script> var rep = 0; setInterval(function() { if (rep==1) gogogo(); },3000); function gogogo() { rep = 0; $('#res').text('... получаем фото ...'); $('#bb').text('...'); $.post('getphoto.php',{token:'<?=$user_token?>',tag:tag.value,kollikes:kollikes.value,last_id:last_id.value}, function (data) { arr = data.split('(@-a4h-@)'); $('#title').text(arr[0]); $('#mylink').attr('href',arr[1]); $('#myimg').attr('src',arr[2]); myid.value = arr[3]; last_id.value=arr[4]; $('#bb').text('like'); $('#res').text('... ставим лайк ...'); setTimeout(function() { $.post('like.php',{id:myid.value,token:'<?=$user_token?>'}, function (data) { arr = data.split('<-=a4h=->'); $('#res').html(arr[0]+"<br>"+arr[1]); if (arr[0]==200) rep=1; }); }, Math.floor(Math.random() * (6000 - 3000) + 3000)); }); } </script>
Осталось посмотреть что же происходит в скриптах, которые ищут фото и ставят лайки.
Поиск фото по тегам
Данный скрипт, формирует строку с разделителем, которая будет передана нам и разобрана.
$user_token = $_POST['token']; $images = 0; $title = ''; $src = ''; $link = ''; $like = 0; $im_id = ''; $last_id = $_POST['last_id']; while ($images==0) { if ($last_id!="") $api = 'https://api.instagram.com/v1/tags/'.$_POST['tag'].'/media/recent?max_tag_id='.$last_id.'&count=1&access_token='.$user_token; else $api = 'https://api.instagram.com/v1/tags/'.$_POST['tag'].'/media/recent?count=1&access_token='.$user_token; $response = file_get_contents($api); $last_id = htmlspecialchars(json_decode($response)->pagination->next_max_tag_id); foreach(json_decode($response)->data as $item){ $title = $item->caption->text; $src = $item->images->low_resolution->url; $link = $item->link; $like = $item->likes->count; $im_id = $item->id; if ($like < $_POST['kollikes']) { $images = 1; echo htmlspecialchars($title)."(@-a4h-@)".htmlspecialchars($link)."(@-a4h-@)".htmlspecialchars($src)."(@-a4h-@)".htmlspecialchars($im_id)."(@-a4h-@)".$last_id; } } }
Ставим лайки
Здесь все еще проще
<?php $id = $_POST['id']; $user_token = $_POST['token']; $url = "https://api.instagram.com/v1/media/".$id."/likes"; $access_token_parameters = array( 'access_token' => $user_token ); $curl = curl_init($url); curl_setopt($curl,CURLOPT_POST,true); curl_setopt($curl,CURLOPT_POSTFIELDS,$access_token_parameters); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($curl); curl_close($curl); $data = json_decode($data, true); $result = $data['meta']['code']; $result2 = $data['meta']['error_message']; echo $result."<-=a4h=->".$result2; ?>
Profit
Код не идеален, собран на коленке, основная идея была показать как можно имитировать поведение живого человека, дабы не попасть под санкции.
Демо
ссылка на оригинал статьи http://habrahabr.ru/post/200472/
Добавить комментарий