Иногда, для разминки ради, ставлю себе задачи. Просто ради интереса. Чаще всего они забываются сразу после найденного решения и более не используются. Так произошло и в этот раз. Начитался в интернетах о том, что эффективным способ продвижения в 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
Код не идеален, собран на коленке, основная идея была показать как можно имитировать поведение живого человека, дабы не попасть под санкции.
Демо
Автор: AlexLeFou