Пишем instagram-робота, ставим лайки по тегам

Иногда, для разминки ради, ставлю себе задачи. Просто ради интереса. Чаще всего они забываются сразу после найденного решения и более не используются. Так произошло и в этот раз. Начитался в интернетах о том, что эффективным способ продвижения в Instagram, считается поиск фото по тегам и «лайканье» оных. Если правильно выбрать теги (как правило те, что соответствуют тематике вашего аккаунта), вы получите не только ответные лайки, но и новых подписчиков (что подтвердилось).

Задача


Написать робота (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


Код не идеален, собран на коленке, основная идея была показать как можно имитировать поведение живого человека, дабы не попасть под санкции.
Демо
  • –4
  • 54.1k
  • 7
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 7

    +2
    Тривиальная задача. Для чего эта статья?
      +3
      Статья нужна была чтобы попасть на хаб. Устал читать, хочу комментировать.
      +18
      $sql = mysql_query(«SELECT*FROM qf_users WHERE qf_sess_id='».$_COOKIE['sess_id']."'");

      я думаю Вам не стоит писать статьи
      • UFO just landed and posted this here
          0
          Да, ограничения есть, можно допилить этого робота на проверку ответа, ставить на паузу и запускать в начале часа… лимит он выбирает примерно за пол часа. Но даже с такими лимитами есть от него польза. Хотя сам не использую. По делу конечно еще записывать на каком месте остановился, чтобы по второму кругу не гонять в случае нового запуска. Но это был просто эксперимент, считаю, что удачный.
          • UFO just landed and posted this here
              0
              Как вариант, да.
              Думаю банить не будут. Опытным путем выяснил, что если ставить таймауты между действиями рандомом, то и последствий никаких нет. Но вот в чем дело, у каждого пользователя тоже есть лимиты, и не важно через сколько приложений он совершает дейтсвия. Если не ошибаюсь это 500 лайков в час. По своему роботу не могу цифр назвать, не считал.

        Only users with full accounts can post comments. Log in, please.