Иногда, для разминки ради, ставлю себе задачи. Просто ради интереса. Чаще всего они забываются сразу после найденного решения и более не используются. Так произошло и в этот раз. Начитался в интернетах о том, что эффективным способ продвижения в Instagram, считается поиск фото по тегам и «лайканье» оных. Если правильно выбрать теги (как правило те, что соответствуют тематике вашего аккаунта), вы получите не только ответные лайки, но и новых подписчиков (что подтвердилось).
Написать робота (MySQl+php+js), который находил бы фото по тегам и ставил им лайки. Более того, желательно, чтобы наш робот не попал в бан.
В первую очередь, нам необходимо авторизоваться. Поэтому главная страница робота имеет всего одну кнопку-ссылку.
и в самом начале проверяем, не авторизован ли нас посетитель ранее (проверяем куку), и если да, то перенаправляем в личный кабинет.
Ниже содержимое скрипта, сюда человек попадает после того, как даст разрешение нам на обработку его данных. Подключаемый в начале файл config.php устанавливает соединение с БД
Проверяем есть ли, у нас такой пользователь и если нет, отправляем на главную.
Довольно примитивная авторизация, но сразу предполагалось, что сервисом кроме меня никто пользоваться не будет, так что проблем возникнуть не должно.
На самой же странице расположим всего несколько полей: для ввода тега, для ввода максимального кол-ва лайков у фотографии (фотографии с большим кол-ом лайкаться не будут, т.к. это не имеет смысла, кнопочка «Поехали» и кнопка «Выход»). Так же нам понадобится поле, где мы будем сохранять id следующей фотографии.
и не забудем див, для наблюдения за происходящим
Далее логика проста, нам необходимо имитировать поведение обычного человека, иначе нашего робота довольно быстро забянят, и вся работа коту под хвост. Поэтому добавляем на страницу следующий код (все таймауты можно выбрать произвольно):
Осталось посмотреть что же происходит в скриптах, которые ищут фото и ставят лайки.
Данный скрипт, формирует строку с разделителем, которая будет передана нам и разобрана.
Здесь все еще проще
Код не идеален, собран на коленке, основная идея была показать как можно имитировать поведение живого человека, дабы не попасть под санкции.
Демо
Задача
Написать робота (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
Код не идеален, собран на коленке, основная идея была показать как можно имитировать поведение живого человека, дабы не попасть под санкции.
Демо