Instagram API. Автоматический постинг

В данной статье мы разобрались с автоматическим постингом на стену контакта без сторонних приложений. 
Ну, разобрались, и забыли. Но теперь, дабы развивать группу, я вспомнил еще про одну социальную сеть – instagram.

Не буду описывать все ее возможности, преимущества, и все такое. Сегодня мы поговорим об обратной стороне красивого сайта с фотографиями – о его API и возможности автоматически постить на фотографии с комментариями.

Лень – самое главное качество программиста. Если программист не ленивый – он плохой программист.
Да, да. Все именно так. Ведь только очень ленивый человек делает огромную работу единовременно, чтобы в будущем не делать практически ничего.

Загружать фотографии в инстаграм мне было лень, но для моего проекта это было бы очень полезно, и я стал искать.

В API самого инстаграма нет ничего интересного – поиск по фотографиям, изменение профиля, и все в этом духе. И ни слова как автоматически загрузить фотографию с комментарием.
Это меня очень раздосадовало, и я обратился к своему самому главному помощнику – интернету.

После нескольких часов поиска я нашел скрипт который более менее подходил под мои нужды, и немного подправил его.

Ну и собственно, хочу поделиться им с вами.
Для того чтобы запостить в инстаграм фотографию и текст нужна следующая функция

sendInstagramm($image, $text);
  • $image – Полный путь до изображения (отправляется с помощью cURL). Изображение должно быть квадратным, и должно быть локальным!
    загрузка по ссылке невозможна!
  • $text – ваш текст. Для вставки переносов применяется “n”, с поддержкой хэштэгов (#тэг)

Как видите – все достаточно просто. В ответ приходит статус, или ошибка (string)

Если вам лень пользоваться скриптом, то узнав, что статья пользуется неплохой популярностью, я решил написать сервис IPosting для автоматической публикации изображений в instagram

А вот собственно и сам код который все это делает

<?php

function SendRequest($url, $post, $post_data, $user_agent, $cookies) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://instagram.com/api/v1/'.$url);
    curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

    if($post) {
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    }

    if($cookies) {
        curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
    } else {
        curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
    }

    $response = curl_exec($ch);
    $http = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);

    return array($http, $response);
}

function GenerateGuid() {
    return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
        mt_rand(0, 65535),
        mt_rand(0, 65535),
        mt_rand(0, 65535),
        mt_rand(16384, 20479),
        mt_rand(32768, 49151),
        mt_rand(0, 65535),
        mt_rand(0, 65535),
        mt_rand(0, 65535));
}

function GenerateUserAgent() {
    $resolutions = array('720x1280', '320x480', '480x800', '1024x768', '1280x720', '768x1024', '480x320');
    $versions = array('GT-N7000', 'SM-N9000', 'GT-I9220', 'GT-I9100');
    $dpis = array('120', '160', '320', '240');

    $ver = $versions[array_rand($versions)];
    $dpi = $dpis[array_rand($dpis)];
    $res = $resolutions[array_rand($resolutions)];

    return 'Instagram 4.'.mt_rand(1,2).'.'.mt_rand(0,2).' Android ('.mt_rand(10,11).'/'.mt_rand(1,3).'.'.mt_rand(3,5).'.'.mt_rand(0,5).'; '.$dpi.'; '.$res.'; samsung; '.$ver.'; '.$ver.'; smdkc210; en_US)';
}

function GenerateSignature($data) {
    return hash_hmac('sha256', $data, 'b4a23f5e39b5929e0666ac5de94c89d1618a2916');
}

function GetPostData($filename) {
    if(!$filename) {
        echo "The image doesn't exist ".$filename;
    } else {
        $post_data = array('device_timestamp' => time(),
            'photo' => '@'.$filename);
        return $post_data;
    }
}


function sendInstagramm($filename, $caption)
{
    $username = _ВАШ_ЛОГИН_;
    $password = _ВАШ_ПАРОЛЬ_;

    $agent = GenerateUserAgent();
    $guid = GenerateGuid();
    $device_id = "android-" . $guid;
    $data = '{"device_id":"' . $device_id . '","guid":"' . $guid . '","username":"' . $username . '","password":"' . $password . '","Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"}';
    $sig = GenerateSignature($data);
    $data = 'signed_body=' . $sig . '.' . urlencode($data) . '&ig_sig_key_version=4';
    $login = SendRequest('accounts/login/', true, $data, $agent, false);
    $text = '';

    if (strpos($login[1], "Sorry, an error occurred while processing this request.")) {
        $text .= "Request failed, there's a chance that this proxy/ip is blocked";
        return $text;
    }

    if (empty($login[1])) {
        $text .= "Empty response received from the server while trying to login";
        return $text;
    }
    $obj = @json_decode($login[1], true);

    if (empty($obj)) {
        $text .= "Could not decode the response" ;
        return $text;
    }
    $data = GetPostData($filename);
    $post = SendRequest('media/upload/', true, $data, $agent, true);

    if (empty($post[1])) {
        $text .= "Empty response received from the server while trying to post the image";
        return $text;
    }
    $obj = @json_decode($post[1], true);

    if (empty($obj)) {
        $text .= "Could not decode the response";
        return $text;
    }
    $status = $obj['status'];

    if ($status != 'ok') {
        $text .= "Status isn't okay";
        return $text;
    }

    $media_id = $obj['media_id'];
    $device_id = "android-" . $guid;

    $data = (object)array(
        'device_id' => $device_id,
        'guid' => $guid,
        'media_id' => $media_id,
        'caption' => trim($caption),
        'device_timestamp' => time(),
        'source_type' => '5',
        'filter_type' => '0',
        'extra' => '{}',
        'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8',
    );
    $data = json_encode($data);
    $sig = GenerateSignature($data);
    $new_data = 'signed_body=' . $sig . '.' . urlencode($data) . '&ig_sig_key_version=4';

    $conf = SendRequest('media/configure/', true, $new_data, $agent, true);

    if (empty($conf[1])) {
        $text .= "Empty response received from the server while trying to configure the image";
    } else {
        if (strpos($conf[1], "login_required")) {
            $text .= "You are not logged in. There's a chance that the account is banned";
        } else {
            $obj = @json_decode($conf[1], true);
            $status = $obj['status'];
            if ($status != 'fail') {
                $text .= "Success";
            } else {
                $text .= 'Fail';
            }
        }
    }
    return $text;
}

Вам остается только заменить строки 75 – 76

$username = _ВАШ_ЛОГИН_;
$password = _ВАШ_ПАРОЛЬ_;

Все – теперь с помощью этого удобного скрипта можно автоматизировать еще один рутинный процесс.
Всем спасибо за внимание.

PS

  • Изображение должно быть квадратным
  • Изображение должно быть локальынм – лежать на машине со скриптом. По ссылке НЕ РАБОТАЕТ.
  • Не забудьте установить необходимые права на файлы для никсов
  • Сервис IPosting – для тех кто не умеет, у кого не получается, или кому просто лень 😉

PSS

Если у вас что-то не работает, значит вы что-то сделали не так. На сайте https://iposting.ru скрипт работает по сей день. Заходите – проверяйте 😉

[Всего голосов: 0    Средний: 0/5]