Jak publikować zdjęcia na Instagramie za pomocą API

109

Buduję aplikację php, która musi opublikować przesłane przez użytkownika zdjęcie bezpośrednio na Instagram, ale po szybkim wyszukiwaniu stwierdziłem, że nie ma takiej funkcji w API :( i wydaje się dziwne ... ponieważ powinni ją udostępnić. Nie jestem pewien, czy istnieje inny sposób (poza aplikacjami na Androida i iOS), aby przesłać zdjęcie za pomocą php. Jeśli jest taka możliwość, daj mi jakiś pomysł.

Ja też to czytałem,

Jak udostępnić link i zdjęcie na Instagramie za pomocą PHP

Altaf Hussain
źródło
2
Nie można publikować zdjęć na Instagramie za pośrednictwem interfejsu API.
Amal Murali
3
Zastanawiam się, jak oni - blog.hootsuite.com/schedule-instagram-posts-in-hootsuite - zrób to ... (ogłoszenie na blogu zostało opublikowane 8 godzin temu)
Mars Robertson
1
@MichalStefanow Też pomyślałem, że to dobre pytanie. To ogłoszenie na blogu zawiera również komentarz Hootsuite (w sekcji komentarzy pod artykułem), że nie ma rzeczywistego bezpośredniego wysyłania na Instagram ze względu na ograniczenia API, a ostateczne publikowanie musi być wykonane na Instagramie.
wspólny wątek
A co z połową 2019 roku? Czy są jakieś zmiany?
userlond

Odpowiedzi:

81

Jeśli przeczytasz udostępniony link, zaakceptowana odpowiedź brzmi:

Nie możesz publikować zdjęć na Instagramie za pośrednictwem interfejsu API.

Wygląda jednak na to, że możesz emulować Instagram na PC.

Bluestacks to emulator, który umożliwia uruchamianie aplikacji na Androida na komputerze PC / Mac itp.

Nie jestem jednak pewien, jak dobrze to działa.

Albzi
źródło
58
Cóż, jeśli NIE ma sposobu, aby to zrobić, to nie sądzę, że istnieje „inny” sposób.
Albzi,
1
@bart w czasie postu @Ritu, zrobił instagram i posts.sonie byłpostso.com
Albzi
2
@usama niestety nie oficjalnie, ale słyszałem plotki, że jeśli wejdziesz na ich stronę i przeskalujesz ją do widoku mobilnego, możesz.
Sam tego
1
@Albzi Jeśli używasz Google Chrome; dostałem się na stronę Instagrama i kliknij prawym przyciskiem myszy i użyj opcji „Sprawdź”, spowoduje to zmianę rozmiaru i zmianę nagłówka na zezwalający na podpis przeglądarki mobilnej. Być może będziesz musiał raz odświeżyć stronę Instagrama w "Inspect", ale pozwoli ci to używać strony internetowej jako telefonu komórkowego i publikować zdjęcia, a co nie. Jednak; to nie pomaga w pytaniu o API. Bardzo chciałbym móc opublikować zdjęcie z PHP na Instagramie, pokazujące końcowy wynik naszych zespołów.
Dawson Irvine,
1
Słuszna uwaga. @BrodaNoel, może powinienem zmienić to na żaden „oficjalny” sposób.
Albzi,
102

Aktualizacja:

Instagram blokuje teraz konta i usuwa obrazy w oparciu o tę metodę. Należy zachować ostrożność.


Wydaje się, że każdy, kto odpowiedział na to pytanie czymś w rodzaju, it can't be donejest w pewnym stopniu poprawny. Oficjalnie nie możesz publikować zdjęć na Instagramie za pomocą ich API. Jeśli jednak dokonasz inżynierii wstecznej API, możesz.

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";
                    }
                }
            }
        }
    }
}

Po prostu skopiuj i wklej powyższy kod w edytorze tekstu, zmień odpowiednio kilka zmiennych i VOILA! Napisałem o tym artykuł i robiłem to wiele razy. Zobacz demo tutaj .

Lanca
źródło
1
Nie można zalogować się przy użyciu powyższego kodu bez użycia telefonu. Właśnie użyłem w localhost na komputerze i właśnie otrzymałem komunikat o błędzie w stylu **** Pusta odpowiedź otrzymana z serwera podczas próby logowania *** jak rozwiązać ten błąd
Rabesh Lal Shrestha
1
Czy istnieje już działający wariant .net utworzony z tego kodu? Nie mogę pracować z PHP i wersja .NET tego kodu byłaby naprawdę przydatna!
Yosoyke
1
Udało mi się pomyślnie uruchomić skrypt na nowym koncie na Instagramie.
loretoparisi
2
Jeśli otrzymujesz status isnt okay, upewnij się, że CURL ma uprawnienia do tworzenia pliku cookie.txt. chmod 777 /directoryzrobi to (bądź ostrożny). Otrzymuję komunikat o sukcesie z Twojego skryptu, ale post nie jest wyświetlany na Instagramie. Czy to nadal działa?
kmoney12
8
Kod działa dobrze, ale guid i deviceid zmieniają się za każdym razem, a instagram ZABLOKOWANY moje konto po jednym udanym poście. zdjęcie również zostało usunięte.
Alp Altunel
27

AKTUALIZACJA Teraz jest to możliwe:

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

Content Publishing API to podzbiór punktów końcowych Instagram Graph API, które umożliwiają publikowanie obiektów multimedialnych. Publikowanie obiektów multimedialnych za pomocą tego interfejsu API to proces dwuetapowy - najpierw tworzysz kontener obiektów multimedialnych, a następnie publikujesz go na swoim koncie biznesowym.

Tom Roggero
źródło
22
Warto zauważyć, że „Content Publishing API jest w zamkniętej wersji beta tylko dla partnerów marketingowych Facebooka i partnerów Instagrama. W tej chwili nie przyjmujemy nowych kandydatów”.
William Reed
Czy dotyczy to tylko kont firmowych?
Suncatcher
Jak to jest odpowiedź? To niemożliwe, to API jest tylko dla partnerów ...
Matej J
1
Mówi, że nie znaleziono strony!
Mohamed Imran
12

Instagram pozwala teraz firmom planować swoje posty, korzystając z nowych punktów końcowych Content Publishing Beta.

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

Jednak ten post na blogu - https://business.instagram.com/blog/instagram-api-features-updates - wyjaśnia, że ​​otwierają to API tylko dla swoich partnerów marketingowych Facebooka lub partnerów Instagrama.

Aby rozpocząć planowanie postów, skontaktuj się z jednym z naszych partnerów marketingowych na Facebooku lub na Instagramie.

Ten link z Facebooka - https://developers.facebook.com/docs/instagram-api/content-publishing - wymienia go jako zamkniętą wersję beta.

Content Publishing API jest w zamkniętej wersji beta tylko dla partnerów marketingowych Facebooka i partnerów Instagrama. W tej chwili nie przyjmujemy nowych kandydatów.

Ale tak byś to zrobił:

Masz zdjęcie w ...

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

Chcesz go opublikować z hashtagiem „#BronzFonz”.

Możesz użyć /user/mediakrawędzi, aby utworzyć kontener w ten sposób:

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

To zwróci identyfikator kontenera (powiedzmy 17889455560051444), który następnie opublikujesz przy użyciu krawędzi / user / media_publish, na przykład:

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

Ten przykład z docs .

Joshua Dance
źródło
Dzięki, ale gdzie mogę stworzyć aplikację do tego, tak jak możemy stworzyć aplikację na facebooku w obszarze deweloperskim Facebooka.
usama
Ten kod wyświetla błąd - „Aplikacja nie ma możliwości wykonania tego wywołania interfejsu API.”? Ze strony tych firm technologicznych to absolutny brak sensu. W jaki sposób mogą poprosić o przyjście za pośrednictwem preferowanych partnerów i nie tworzenie własnej aplikacji.
Amit Khare
8

Próbowałem użyć IFTTT i wielu innych usług, ale wszyscy robili rzeczy lub publikowali z Instagrama na inną platformę, a nie na Instagram. Przeczytałem więcej, aby stwierdzić, że Instagram nie zapewnia obecnie takiego interfejsu API.

Korzystanie z niebieskiego stosu ponownie wiąże się z ciężką instalacją i wykonywaniem czynności tylko ręcznie.

Możesz jednak użyć przeglądarki Google Chrome w wersji komputerowej, aby opublikować post na Instagramie. To wymaga trochę poprawek.

  1. Otwórz swój chrome i przeglądaj Instagram.com
  2. Przejdź do sprawdzenia elementu, klikając prawym przyciskiem myszy chrome.
  3. Z rozwijanego menu narzędzi programistycznych w prawym górnym rogu wybierz więcej narzędzi.
  4. Dalej wybierz warunki sieciowe.
  5. W sekcji wyboru sieci, zobacz drugą sekcję o nazwie user agent.
  6. Odznacz opcję wybierz automatycznie i wybierz chrome dla Androida z listy danego klienta użytkownika.
  7. Odśwież swoją stronę Instagram.com.

Zauważysz zmianę w interfejsie użytkownika i opcję opublikowania posta na Instagramie. Twoje życie jest teraz łatwe. Daj mi znać, jeśli możesz znaleźć jakiś łatwiejszy sposób.

wprowadź opis obrazu tutaj

Napisałem o tym na https://www.inteligentcomp.com/2018/11/how-to-upload-to-instagram-from-pc-mac.html .

Roboczy zrzut ekranu

wprowadź opis obrazu tutaj

Dheeraj Thedijje
źródło
Ale nie możesz niczego publikować.
Aarvy
1
Właśnie wysłałem, używając tej samej metody. Działa absolutnie dobrze. Zobacz zrzut ekranu w aktualizacji.
Dheeraj Thedijje
5

Użytkownicy, którzy znajdą to pytanie, mogą przekazywać zdjęcia do przepływu udostępniania na Instagramie (z aplikacji do ekranu filtrów) na iPhonie za pomocą haków iPhone'a: http://help.instagram.com/355896521173347 Poza tym obecnie nie ma sposób w wersji 1 interfejsu API.

Amru E.
źródło
1
@Ritu ciekawe. To musi być wtedy możliwe, ale nie wydaje się, żeby API na to pozwalało. Dzięki za udostępnienie, chcę się temu przyjrzeć.
Amru E.,
1
Zastanawiałem się też, jak oni to robią. Udostępnij, jeśli dostaniesz coś odpowiedniego.
Ritu
2
Wygląda na to, że większość nieautoryzowanych klientów dokonuje inżynierii wstecznej API poprzez odszyfrowanie i monitorowanie ruchu SSL z aplikacji na serwer. Tak jest przynajmniej w przypadku Snapchata. Tutaj może być tak samo.
Amru E.
Aplikacja Flume na komputery Mac publikuje również posty na Twoim kanale
Joshua - Pendo
0

Jeśli ma interfejs użytkownika, ma „API”. Skorzystajmy z następującego przykładu: Chcę opublikować zdjęcie, którego używam w każdym nowym poście na blogu, który tworzę. Załóżmy, że to Wordpress.

  1. Stwórz usługę, która stale monitoruje Twój blog za pośrednictwem RSS.
  2. Po opublikowaniu nowego posta na blogu pobierz zdjęcie.
  3. (Opcjonalnie) Użyj interfejsu API innej firmy, aby zastosować kilka nakładek i inne elementy do swojego zdjęcia.
  4. Umieść zdjęcie w dobrze znanym miejscu na swoim komputerze lub serwerze.
  5. Skonfiguruj Chrome (przeczytaj powyżej), aby móc używać przeglądarki jako telefonu komórkowego.
  6. Korzystając z Selenium (lub dowolnej innej z tych bibliotek), zasymuluj cały proces publikowania na Instagramie.
  7. Gotowe. Powinieneś to mieć.
Pepito Fernandez
źródło
0

Dla każdego, kto szuka rozwiązania dotyczącego publikowania na Instagramie za pomocą AWS lambda i puppeteer ( chrome-aws-lambda ). Zauważyłem, że to rozwiązanie pozwala opublikować tylko 1 zdjęcie do każdego postu . Jeśli nie używasz lambda, po prostu zastąpić chrome-aws-lambdaz puppeteer.

Przy pierwszym uruchomieniu lambdy to normalne, że nie zadziała, ponieważ Instagram wykrywa „podejrzaną próbę logowania” . Po prostu wejdź na stronę Instagram na swoim komputerze i zatwierdź ją , wszystko powinno być w porządku.

Oto mój kod, możesz go zoptymalizować:

// 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');

musi to być lokalna ścieżka do pliku, jeśli jest to adres URL, najpierw pobierz go do folderu / tmp .

Allen Wong
źródło
To całkiem fajne rozwiązanie :) Dzięki.
Kristoffer Berg - EcodeAS