Пишем 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

Код не идеален, собран на коленке, основная идея была показать как можно имитировать поведение живого человека, дабы не попасть под санкции.
Демо

ссылка на оригинал статьи http://habrahabr.ru/post/200472/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *