Как разместить фото в инстаграмм с помощью API

109

Я создаю приложение php, которое должно публиковать загруженное пользователем изображение непосредственно в Instagram, но после быстрого поиска я обнаружил, что в API нет такой функции :( и это кажется странным ... потому что они должны предоставлять ее. Я Я не уверен, есть ли другой способ (кроме приложений для Android и iOS) загрузить изображение с помощью php. Пожалуйста, дайте мне какую-нибудь идею, если есть такая возможность.

Я тоже читал это,

Как отправить ссылку и фотографию в Instagram с помощью PHP

Альтаф Хуссейн
источник
2
Публиковать изображения в Instagram через API невозможно.
Амаль Мурали
3
Интересно, как они - blog.hootsuite.com/schedule-instagram-posts-in-hootsuite - делают это ... (объявление в блоге было опубликовано 8 часов назад)
Марс Робертсон
1
@MichalStefanow Я тоже подумал, что это хороший вопрос. В этом объявлении в блоге также есть комментарий от Hootsuite (в разделе комментариев под статьей) о том, что фактической прямой публикации в Instagram нет из-за ограничений API, и окончательная публикация должна быть сделана в Instagram.
thecommonthread
А как насчет середины 2019 года? Есть какие-то изменения?
userlond 08

Ответы:

81

Если вы прочитали ссылку, которой поделились, принятый ответ:

Вы не можете публиковать изображения в Instagram через API.

Кажется, вы можете эмулировать Instagram на ПК.

Bluestacks - это эмулятор, который позволяет запускать приложения для Android на вашем ПК / Mac и т. Д.

Я не уверен, насколько хорошо это работает.

Альбзи
источник
58
Что ж, если нет способа сделать это, то я не думаю, что есть «другой» способ.
Albzi
1
@bart во время публикации @Ritu, он делал инстаграмм, а posts.soне былpostso.com
Albzi
2
@usama, к сожалению, не официально, но до меня доходили слухи, что если вы зайдете на их веб-сайт и уменьшите его до мобильной версии, вы сможете. Но сам не пробовал
Albzi 02
1
@Albzi Если вы используете Google Chrome; попал на веб-сайт Instagram, щелкните правой кнопкой мыши и используйте «Проверить», он изменит размер и изменит заголовок на подпись мобильного браузера. Возможно, вам придется обновить страницу Instagram один раз в «Inspect», но это позволит вам использовать веб-сайт в качестве мобильного устройства и публиковать фотографии и многое другое. Тем не мение; это не помогает с вопросом API. Я хотел бы иметь возможность опубликовать фотографию из PHP в Instagram, показывающую окончательный результат наших команд.
Доусон Ирвин
1
Честная оценка. @BrodaNoel, может мне стоит изменить это на «не официальный» способ.
Albzi
102

Обновить:

Instagram теперь блокирует аккаунты и удаляет изображения на основе этого метода. Пожалуйста, используйте с осторожностью.


Кажется, что каждый, кто ответил на этот вопрос чем-то вроде, в it can't be doneчем-то прав. Официально вы не можете публиковать фото в Instagram с их API. Однако, если вы перепроектируете API, вы сможете.

function SendRequest($url, $post, $post_data, $user_agent, $cookies) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://i.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;
    }
}


// Set the username and password of the account that you wish to post a photo to
$username = 'ig_username';
$password = 'ig_password';

// Set the path to the file that you wish to post.
// This must be jpeg format and it must be a perfect square
$filename = 'pictures/test.jpg';

// Set the caption for the photo
$caption = "Test caption";

// Define the user agent
$agent = GenerateUserAgent();

// Define the GuID
$guid = GenerateGuid();

// Set the devide ID
$device_id = "android-".$guid;

/* LOG IN */
// You must be logged in to the account that you wish to post a photo too
// Set all of the parameters in the string, and then sign it with their API key using SHA-256
$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);

if(strpos($login[1], "Sorry, an error occurred while processing this request.")) {
    echo "Request failed, there's a chance that this proxy/ip is blocked";
} else {            
    if(empty($login[1])) {
        echo "Empty response received from the server while trying to login";
    } else {            
        // Decode the array that is returned
        $obj = @json_decode($login[1], true);

        if(empty($obj)) {
            echo "Could not decode the response: ".$body;
        } else {
            // Post the picture
            $data = GetPostData($filename);
            $post = SendRequest('media/upload/', true, $data, $agent, true);    

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

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

                    if($status == 'ok') {
                        // Remove and line breaks from the caption
                        $caption = preg_replace("/\r|\n/", "", $caption);

                        $media_id = $obj['media_id'];
                        $device_id = "android-".$guid;
                        $data = '{"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"}';   
                        $sig = GenerateSignature($data);
                        $new_data = 'signed_body='.$sig.'.'.urlencode($data).'&ig_sig_key_version=4';

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

                       if(empty($conf[1])) {
                           echo "Empty response received from the server while trying to configure the image";
                       } else {
                           if(strpos($conf[1], "login_required")) {
                                echo "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') {
                                    echo "Success";
                                } else {
                                    echo 'Fail';
                                }
                            }
                        }
                    } else {
                        echo "Status isn't okay";
                    }
                }
            }
        }
    }
}

Просто скопируйте и вставьте приведенный выше код в текстовый редактор, измените несколько переменных соответственно и VOILA! Я написал об этом статью и делал это много раз. Смотрите демо здесь .

Копье
источник
1
Невозможно войти в систему с использованием вышеуказанного кода без телефона. Я просто использовал
локальный хост
1
Есть ли уже рабочий вариант .net из этого кода? Я не могу работать с PHP, и .NET-версия этого кода была бы действительно полезной!
Ёсойке
1
Мне удалось успешно запустить скрипт в новой учетной записи Instagram.
loretoparisi
2
Если вы получаете status isnt okay, убедитесь, что у CURL есть разрешения на создание файла cookies.txt. chmod 777 /directoryсделаю это (будьте осторожны). Я получаю сообщение об успешном выполнении вашего сценария, но сообщение не отображается в Instagram. Это все еще работает?
kmoney12
8
Код работает нормально, но guid и deviceid меняются каждый раз, и моя учетная запись в Instagram ЗАБАНАЛАСЬ после одной успешной публикации. фото также было удалено.
Алп Алтунель
27

ОБНОВЛЕНИЕ Теперь возможно:

https://developers.facebook.com/docs/instagram-api/content-publishing

Content Publishing API - это подмножество конечных точек Instagram Graph API, которые позволяют публиковать медиа-объекты. Публикация медиа-объектов с помощью этого API - это двухэтапный процесс: вы сначала создаете контейнер медиа-объекта, а затем публикуете контейнер в своей бизнес-учетной записи.

Том Роггеро
источник
22
Стоит отметить, что «API публикации контента находится в закрытой бета-версии только с партнерами по маркетингу Facebook и партнерами Instagram. В настоящее время мы не принимаем новых кандидатов».
Уильям Рид
Это применимо только для бизнес-аккаунтов?
Suncatcher
Как это ответ? Это невозможно, этот API предназначен только для партнеров ...
Матей Дж.
1
Он говорит, что страница не найдена!
Мохамед Имран
12

Instagram теперь позволяет компаниям планировать свои публикации, используя новые конечные точки Content Publishing Beta.

https://developers.facebook.com/blog/post/2018/01/30/instagram-graph-api-updates/

Однако это сообщение в блоге - https://business.instagram.com/blog/instagram-api-features-updates - дает понять, что они открывают этот API только для своих партнеров по маркетингу Facebook или партнеров Instagram.

Чтобы начать планирование публикаций, обратитесь к одному из наших партнеров по маркетингу Facebook или партнеров Instagram.

Эта ссылка с Facebook - https://developers.facebook.com/docs/instagram-api/content-publishing - перечисляет его как закрытую бета-версию.

API публикации контента находится в закрытой бета-версии только с партнерами по маркетингу Facebook и партнерами Instagram. В настоящее время мы не принимаем новых кандидатов.

Но вот как бы вы это сделали:

У вас есть фото на ...

https://www.example.com/images/bronz-fonz.jpg

Вы хотите опубликовать его с хэштегом "#BronzFonz".

Вы можете использовать /user/mediaкрай для создания контейнера следующим образом:

POST graph.facebook.com 
  /17841400008460056/media?
    image_url=https%3A%2F%2Fwww.example.com%2Fimages%2Fbronz-fonz.jpg&
    caption=%23BronzFonz

Это вернет идентификатор контейнера (скажем, 17889455560051444), который вы затем опубликуете с помощью края / user / media_publish, например:

POST graph.facebook.com
  /17841405822304914/media_publish
    ?creation_id=17889455560051444

Этот пример из docs .

Джошуа танец
источник
Спасибо, но где я могу создать приложение для этого, как мы можем создать приложение для facebook в области разработчика facebook.
usama
Этот код выдает ошибку - «Приложение не может выполнить этот вызов API»? Это полная чушь со стороны этих технологических компаний. Как они могут попросить использовать их через некоторых избранных партнеров, а не создавать собственное приложение.
Амит Кхаре,
9

Я пробовал использовать IFTTT и многие другие сервисы, но все делали что-то или публиковали сообщения из Instagram на другую платформу, а не в Instagram. Я прочитал больше и обнаружил, что в настоящее время Instagram не предоставляет такого API.

Использование синего стека снова связано с тяжелой установкой и работой только вручную.

Однако вы можете использовать свой Google Chrome в настольной версии, чтобы разместить пост в Instagram. Требуется небольшая настройка.

  1. Откройте свой Chrome и просмотрите Instagram.com
  2. Перейдите к проверке элемента, щелкнув правой кнопкой мыши хром.
  3. В раскрывающемся меню Corener вверху справа выберите инструменты разработчика.
  4. Далее выберите условия сети.
  5. В разделе выбора сети см. Второй раздел под названием user agent.
  6. Снимите флажок « Выбирать автоматически» и выберите Chrome для Android из списка данного пользовательского агента.
  7. Обновите свою страницу в Instagram.com.

Вы заметите изменения в пользовательском интерфейсе и возможность разместить пост в Instagram. Твоя жизнь теперь легка. Сообщите мне более простой способ, если вы его найдете.

введите описание изображения здесь

Я писал об этом на https://www.inteligentcomp.com/2018/11/how-to-upload-to-instagram-from-pc-mac.html .

Рабочий снимок экрана

введите описание изображения здесь

Дирадж Тедидже
источник
Но вы не можете ничего опубликовать.
Aarvy
1
Я только что опубликовал, используя тот же метод. Работает абсолютно нормально. Смотрите скриншот в обновлении.
Дирадж Тедидже
это гениально!
Томас Г.
5

Для пользователей, которые нашли этот вопрос, вы можете передать фотографии в поток обмена Instagram (из вашего приложения на экран фильтров) на iPhone с помощью хуков iPhone: http://help.instagram.com/355896521173347 Кроме этого, в настоящее время нет путь в версии 1 api.

Амру Э.
источник
1
@ Риту интересно. Тогда это должно быть возможно, но не похоже, что API позволяет это. Спасибо, что поделились, я хочу разобраться в этом.
Амру Э.
1
Мне также было интересно, как они это делают, поделитесь, пожалуйста, если вы получите что-то актуальное.
Ritu
2
Похоже, что большинство неавторизованных клиентов реконструируют API, расшифровывая и отслеживая SSL-трафик от приложения к серверу. По крайней мере, это относится к Snapchat. Здесь может быть то же самое.
Amru E.
Приложение Flume для Mac также публикует сообщения в вашей ленте
Джошуа - Пендо
0

Не существует API для публикации фотографий в Instagram с использованием API, но есть простой способ - установить расширение Google «User Agent», оно переведет ваш браузер в версию Chrome для мобильных устройств Android. Вот ссылка на расширение https://chrome.google.com/webstore/detail/user-agent-switcher/clddifkhlkcojbojppdojfeeikdkgiae?utm_source=chrome-ntp-icon

просто нажмите на значок расширения, выберите Chrome для Android и откройте Instagram.com

Вахид Сабир
источник
0

Если у него есть пользовательский интерфейс, у него есть «API». Давайте воспользуемся следующим примером: я хочу опубликовать картинку, которую использую, в любом новом посте в блоге, который я создаю. Предположим, это Wordpress.

  1. Создайте сервис, который постоянно отслеживает ваш блог через RSS.
  2. Когда будет опубликовано новое сообщение в блоге, загрузите изображение.
  3. (Необязательно) Используйте сторонний API, чтобы применить к вашему изображению некоторые наложения и многое другое.
  4. Поместите фотографию в известное место на вашем ПК или сервере.
  5. Настройте Chrome (см. Выше), чтобы вы могли использовать браузер как мобильный телефон.
  6. Используя Selenium (или любую другую из этих библиотек), смоделируйте весь процесс публикации в Instagram.
  7. Готово. Вы должны это получить.
Пепито Фернандес
источник
0

Для всех, кто ищет решение для публикации в Instagram с использованием AWS lambda и puppeteer ( chrome-aws-lambda ). Отметил, что это решение позволяет размещать только 1 фото для каждого сообщения . Если вы не используете лямбда, просто замените chrome-aws-lambdaна puppeteer.

При первом запуске лямбда это нормально, потому что instagram обнаруживает «Подозрительную попытку входа» . Просто перейдите на страницу Instagram с помощью ПК и подтвердите ее , все должно быть в порядке.

Вот мой код, не стесняйтесь его оптимизировать:

// instagram.js
const chromium = require('chrome-aws-lambda');

const username = process.env.IG_USERNAME;
const password = process.env.IG_PASSWORD;

module.exports.post = async function(fileToUpload, caption){
    const browser = await chromium.puppeteer.launch({
        args: [...chromium.args, '--window-size=520,700'],
        defaultViewport: chromium.defaultViewport,
        executablePath: await chromium.executablePath,
        headless: false,
        ignoreHTTPSErrors: true,
    });
    const page = await browser.newPage();
    await page.setUserAgent('Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_2 like Mac OS X) AppleWebKit/603.2.4 (KHTML, like Gecko) FxiOS/7.5b3349 Mobile/14F89 Safari/603.2.4');
    await page.goto('https://www.instagram.com/', {waitUntil: 'networkidle2'});
    
    const [buttonLogIn] = await page.$x("//button[contains(., 'Log In')]");
    if (buttonLogIn) {
        await buttonLogIn.click();
    }

    await page.waitFor('input[name="username"]');
    await page.type('input[name="username"]', username)
    await page.type('input[name="password"]', password)
    await page.click('form button[type="submit"]');

    await page.waitFor(3000);
    const [buttonSaveInfo] = await page.$x("//button[contains(., 'Not Now')]");
    if (buttonSaveInfo) {
        await buttonSaveInfo.click();
    }

    await page.waitFor(3000);
    const [buttonNotificationNotNow] = await page.$x("//button[contains(., 'Not Now')]");
    const [buttonNotificationCancel] = await page.$x("//button[contains(., 'Cancel')]");
    if (buttonNotificationNotNow) {
        await buttonNotificationNotNow.click();
    } else if (buttonNotificationCancel) {
        await buttonNotificationCancel.click(); 
    }

    await page.waitFor('form[enctype="multipart/form-data"]');
    const inputUploadHandle = await page.$('form[enctype="multipart/form-data"] input[type=file]');

    await page.waitFor(5000);
    const [buttonPopUpNotNow] = await page.$x("//button[contains(., 'Not Now')]");
    const [buttonPopUpCancel] = await page.$x("//button[contains(., 'Cancel')]");
    if (buttonPopUpNotNow) {
        await buttonPopUpNotNow.click();
    } else if (buttonPopUpCancel) {
        await buttonPopUpCancel.click(); 
    }

    await page.click('[data-testid="new-post-button"]')
    await inputUploadHandle.uploadFile(fileToUpload);

    await page.waitFor(3000);
    const [buttonNext] = await page.$x("//button[contains(., 'Next')]");
    await buttonNext.click();

    await page.waitFor(3000);
    await page.type('textarea', caption);

    const [buttonShare] = await page.$x("//button[contains(., 'Share')]");
    await buttonShare.click();
    await page.waitFor(3000);

    return true;
};
// handler.js

await instagram.post('/tmp/image.png', '#text');

это должен быть локальный путь к файлу, если это URL-адрес, сначала загрузите его в папку / tmp .

Аллен Вонг
источник
Замечательное решение :) Спасибо.
Кристоффер Берг - EcodeAS