Як розмістити зображення в instagram за допомогою API


109

Я будую PHP-додаток, який повинен розміщувати завантажене користувачем зображення безпосередньо в Instagram, але після швидкого пошуку я виявив, що такої функції в API немає :( і це дивно ... тому що вони повинні надати її. I Я не впевнений, чи є інший спосіб (крім програм для Android та iOS) для завантаження зображення за допомогою php. Будь ласка, дайте мені будь-яку ідею, якщо є можливість.

Я також читав це,

Як я можу поділитися посиланням та фотографією в Instagram за допомогою PHP


2
Неможливо розмістити фотографії в Instagram через API.
Амаль Муралі

3
Цікаво, як вони - blog.hootsuite.com/schedule-instagram-posts-in-hootsuite - робіть це (повідомлення про блог було розміщено 8 годин тому)
Mars Robertson

1
@MichalStefanow Я також вважав це гарним питанням. У цьому анонсі блогу також є коментар Hootsuite (у розділі коментарів під статтею), що немає фактичного прямого розміщення в Instagram через обмеження API та остаточне розміщення потрібно робити в Instagram.
thecommonthread

А як щодо середини 2019 року? Чи є якісь зміни?
userlond

Відповіді:


81

Якщо ви прочитали посилання, яким ви поділилися, прийнята відповідь:

Ви не можете публікувати фотографії в Instagram через API.

Здається, ви можете імітувати інстаграм на ПК.

Bluestacks - це емулятор, який дозволяє запускати програми Android на ПК / Mac тощо.

Я не впевнений, наскільки добре це працює.


58
Ну, якщо НЕ існує способу цього зробити, то я не думаю, що існує "інший" спосіб.
Альбзі

1
@bart на момент публікації @Ritu, це зробив інстаграм та posts.soне булоpostso.com
Альбзі

2
@usama, на жаль, не офіційно, але я чув чутки, що якщо ви перейдете на їхній веб-сайт і розгорніть його до перегляду для мобільних пристроїв, ви можете. Не спробував сам, хоча
Альбзі

1
@Albzi Якщо ви використовуєте Google Chrome; потрапив на веб-сайт Instagram і клацніть правою кнопкою миші та скористайтеся пунктом "Перевірити", він змінить розмір і змінить заголовок на мобільний підпис браузера, що дозволяє. Можливо, вам доведеться оновити сторінку Instagram один раз у розділі "Оглянути", але це дозволить вам використовувати веб-сайт як мобільний, і ви можете розміщувати фотографії, а що ні. Однак; це не допомагає у питанні API. Я б хотів, щоб можна було розмістити фото з PHP в Instagram, де відображається остаточний результат наших команд.
Доусон Ірвін

1
Справедливий пункт. @BrodaNoel, можливо, я повинен змінити це на "офіційний" спосіб.
Альбзі

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
Неможливо увійти за допомогою вказаного вище коду без використання телефону. Я щойно використовував у localhost за допомогою ПК, і я щойно отримав повідомлення про помилку, як ****. Порожня відповідь, отримана від сервера під час спроби увійти ***, як вирішити цю помилку
Рабеш Лал Шрестха,

1
Чи є вже працюючий варіант .net, виготовлений з цього коду? Я не можу працювати з PHP, і .NET версія цього коду була б справді корисною!
Йосойке

1
Мені вдалося запустити сценарій успішно в новому акаунті Instagram.
loretoparisi

2
Якщо ви отримуєте status isnt okay, переконайтесь, що CURL має дозволи на створення файлу cookie.txt. chmod 777 /directoryзробимо це (будьте обережні). Я отримую повідомлення про успіх від вашого сценарію, але публікація не відображається в instagram. Це все ще працює?
kmoney12

8
Код працює добре, але настанови та пристрої змінюються щоразу і instagram ЗАБЕЗПЕЧИТИ мій рахунок після одного успішного повідомлення. фотографію також видалено.
Альп Альтунель

27

ОНОВЛЕННЯ Зараз можливо:

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

API публікації вмісту - це підмножина кінцевих точок API API Graph Graphics, які дозволяють публікувати медіа-об’єкти. Опублікування медіа-об’єктів за допомогою цього API - це двоетапний процес - спочатку ви створюєте контейнер для медіа-об’єктів, а потім публікуєте контейнер у своєму бізнес-акаунті.


22
Варто зазначити, що "API публікації контенту закритий бета-версією, лише для партнерів з маркетингу Facebook та партнерів Instagram. Наразі ми не приймаємо нових заявників".
Вільям Рід

Чи це стосується лише облікових записів бізнесу?
Suncatcher

Як це відповідь? Це неможливо, цей API призначений лише для партнерів ...
Matej J

1
Там написано, що сторінку не знайдено!
Мохамед Імран

12

Instagram тепер дозволяє компаніям планувати свої публікації, використовуючи нові бета-версії контенту Content Publishing.

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

Цей приклад з док .


Дякую, але де я можу створити додаток для цього, як ми можемо створити додаток для facebook у зоні розробника facebook.
усама

Цей код дає помилку - "Програма не має можливості здійснити цей виклик API."? Це абсолютно безглуздо від цих технологічних компаній. Як вони можуть попросити використатись, щоб прийти через декілька бажаних партнерів, а не робити власне додаток.
Аміт Харе

8

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

Використання синього стека знову включає в себе важку установку і виконувати речі лише вручну.

Однак ви можете використовувати свій Google Chrome у версії для настільних ПК, щоб зробити публікацію в Instagram. Це потрібно трохи підправити.

  1. Відкрийте свій хром і перегляньте Instagram.com
  2. Перейдіть на огляд елемента, клацнувши правою кнопкою миші на хром.
  3. У верхньому правому верхньому меню основного меню, що випадає на інструменти для розробників, виберіть більше інструменту.
  4. Далі виберіть мережеві умови.
  5. У розділі вибору мережі дивіться другий розділ, названий користувальницьким агентом.
  6. Зніміть прапорець біля параметра Вибір автоматично та виберіть хром для Android зі списку даного агента користувача.
  7. Оновіть сторінку Instagram.com.

Ви помітите зміни в інтерфейсі користувача та можливість зробити публікацію в Instagram. Ваше життя зараз легке. Дайте мені знати простіший спосіб, якщо ви знайдете будь-який.

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

Про це я писав на https://www.inteligentcomp.com/2018/11/how-to-upload-to-instagram-from-pc-mac.html .

Робочий знімок екрана

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


Але ти не можеш нічого розмістити.
Aarvy

1
Я щойно розмістив цей же метод. Це працює абсолютно чудово. Дивіться знімок екрана в оновленнях.
Dheeraj Thedijje

5

Користувачі, які знайшли це запитання, ви можете передати фотографії в потік інстаграм (від вашої програми до екрану фільтрів) на iPhone за допомогою гачків iPhone: http://help.instagram.com/355896521173347 Окрім цього, наразі немає спосіб у версії 1 api.


1
@Ritu цікаво. Це повинно бути можливим тоді, але, схоже, API не дозволяє. Дякую за те, що ви поділилися, я хочу вивчити це.
Амру Е.

1
мені також було цікаво, як вони це роблять, будь ласка, поділіться, якщо ви отримаєте щось відповідне.
Ріту

2
Схоже, більшість несанкціонованих клієнтів зворотно розробляють API, розшифровуючи та відстежуючи трафік SSL з програми на сервер. Це стосується принаймні Snapchat. Можливо, тут буде те саме.
Амру Е.

Додаток Flume для Mac також публікує вашу стрічку
Джошуа - Пендо

0

Немає API для розміщення фотографії в instagram за допомогою API, але є простий спосіб - встановити розширення google "User Agent", воно перекриє ваш веб-переглядач для Android Chrome версії Chrome. Ось посилання на розширення https://chrome.google.com/webstore/detail/user-agent-switcher/clddifkhlkcojbojppdojfeeikdkgiae?utm_source=chrome-ntp-icon

просто натисніть на значок розширення та виберіть хром для android та відкрийте Instagram.com


0

Якщо у нього є інтерфейс користувача, він має "API". Давайте скористаємось наступним прикладом: я хочу опублікувати фотографію, яку я використовую, у будь-якій новій створеній мною публікації блогу. Припустимо, це Wordpress.

  1. Створіть сервіс, який постійно контролює ваш блог за допомогою RSS.
  2. Коли буде розміщена нова публікація в блозі, завантажте зображення.
  3. (Необов’язково) Використовуйте сторонній API, щоб застосувати деякі накладки та те, що не потрібно, до картинки.
  4. Розмістіть фотографію у відомому місці на вашому ПК або сервері.
  5. Налаштуйте Chrome (читайте вище), щоб браузер міг використовуватись як мобільний.
  6. Використовуючи Selenium (або будь-яку іншу з цих бібліотек), моделюйте весь процес публікації в Instagram.
  7. Зроблено. Ви повинні його мати.

0

Для всіх, хто шукає рішення щодо публікації в Instagram за допомогою лямбда AWS та лялечки ( 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 .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.