So posten Sie Bilder mithilfe der API auf Instagram

107

Ich baue eine PHP-Anwendung, die das vom Benutzer hochgeladene Bild direkt auf Instagram posten muss, aber nach einer schnellen Suche stellte ich fest, dass es keine solche Funktion in der API gibt :( und es fühlt sich komisch an ... weil sie eine bereitstellen sollten Ich bin mir nicht sicher, ob es eine andere Möglichkeit gibt (außer den Apps für Android und iOS), Bilder mit PHP hochzuladen. Bitte geben Sie mir eine Idee, wenn es eine Möglichkeit gibt.

Ich habe das auch gelesen,

Wie teile ich einen Link und ein Foto mit Instagram über PHP?

Altaf Hussain
quelle
2
Es ist nicht möglich, Bilder über die API auf Instagram zu posten.
Amal Murali
3
Ich frage mich, wie sie - blog.hootsuite.com/schedule-instagram-posts-in-hootsuite - es tun ... (Blog-Ankündigung wurde vor 8 Stunden veröffentlicht)
Mars Robertson
1
@MichalStefanow Ich fand es auch eine gute Frage. Diese Blog-Ankündigung enthält auch einen Kommentar von Hootsuite (im Kommentarbereich unter dem Artikel), dass aufgrund von API-Beschränkungen keine direkte Veröffentlichung auf Instagram erfolgt und die endgültige Veröffentlichung auf Instagram erfolgen muss.
Thecommonthread
Was ist mit Mitte 2019? Gibt es irgendwelche Änderungen?
Userlond

Antworten:

81

Wenn Sie den von Ihnen freigegebenen Link lesen, lautet die akzeptierte Antwort:

Sie können keine Bilder über die API auf Instagram posten.

Es scheint, dass Sie Instagram auf dem PC emulieren können.

Bluestacks ist ein Emulator, mit dem Sie Android-Apps auf Ihrem PC / Mac usw. ausführen können.

Ich bin mir nicht sicher, wie gut es funktioniert.

Albzi
quelle
57
Nun, wenn es KEINE Möglichkeit gibt, dann gibt es wohl keine andere Möglichkeit.
Albzi
1
@bart zum Zeitpunkt der @ Ritu-Veröffentlichung, es tat Instagram und war posts.sonichtpostso.com
Albzi
2
@usama leider nicht offiziell, aber ich habe Gerüchte gehört, dass, wenn Sie auf ihre Website gehen und es auf mobile Ansicht verkleinern, Sie können. Ich habe es selbst nicht versucht
Albzi
1
@Albzi Wenn Sie Google Chrome verwenden; Gehen Sie zur Instagram-Website und klicken Sie mit der rechten Maustaste und verwenden Sie "Inspect". Dadurch wird die Größe geändert und der Header in eine mobile Browsersignatur geändert, die dies zulässt. Möglicherweise müssen Sie die Instagram-Seite einmal in "Inspect" aktualisieren, aber Sie können die Website als Handy verwenden und Fotos posten und was nicht. Jedoch; Dies hilft nicht bei der API-Frage. Ich würde gerne ein Foto von PHP auf Instagram posten können, das das Endergebnis unserer Teams zeigt.
Dawson Irvine
1
Gutes Argument. @BrodaNoel, vielleicht sollte ich das auf keinen "offiziellen" Weg ändern.
Albzi
102

Aktualisieren:

Instagram sperrt jetzt Konten und entfernt die Bilder basierend auf dieser Methode. Bitte mit Vorsicht verwenden.


Es scheint, dass jeder, der diese Frage mit etwas in der Art von beantwortet hat, it can't be doneetwas richtig ist. Offiziell können Sie mit ihrer API kein Foto auf Instagram veröffentlichen. Wenn Sie die API jedoch zurückentwickeln, können Sie dies tun.

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

Kopieren Sie einfach den obigen Code und fügen Sie ihn in Ihren Texteditor ein. Ändern Sie die wenigen Variablen entsprechend und VOILA! Ich habe einen Artikel darüber geschrieben und ich habe es viele Male getan. Hier finden Sie eine Demo hier .

Lanze
quelle
1
Anmeldung mit dem oben genannten Code ohne Telefon nicht möglich. Ich habe gerade in localhost mit dem PC verwendet und habe gerade eine Fehlermeldung wie **** erhalten. Leere Antwort vom Server beim Versuch,
mich anzumelden
1
Gibt es bereits eine funktionierende .net-Variante dieses Codes? Ich kann nicht mit PHP arbeiten und eine .NET-Version dieses Codes wäre wirklich nützlich!
Yosoyke
1
Ich konnte das Skript erfolgreich auf einem neuen Instagram-Konto ausführen.
Loretoparisi
2
Wenn Sie erhalten status isnt okay, stellen Sie sicher, dass CURL über die Berechtigung zum Erstellen einer Cookies.txt-Datei verfügt. chmod 777 /directorywerde dies tun (sei vorsichtig). Ich erhalte eine Erfolgsmeldung von Ihrem Skript, aber der Beitrag wird nicht auf Instagram angezeigt. Funktioniert das noch
kmoney12
8
Der Code funktioniert einwandfrei, aber die Guid- und Geräte-ID ändert sich jedes Mal und Instagram verbietet mein Konto nach einem einzigen erfolgreichen Beitrag. Das Foto wurde ebenfalls entfernt.
Alp Altunel
27

UPDATE Es ist jetzt möglich:

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

Die Content Publishing-API ist eine Teilmenge der Instagram Graph API-Endpunkte, mit denen Sie Medienobjekte veröffentlichen können. Das Veröffentlichen von Medienobjekten mit dieser API erfolgt in zwei Schritten: Sie erstellen zuerst einen Medienobjektcontainer und veröffentlichen den Container dann in Ihrem Geschäftskonto.

Tom Roggero
quelle
22
Es ist erwähnenswert, dass "die Content Publishing-API nur mit Facebook-Marketingpartnern und Instagram-Partnern in der Closed Beta ist. Wir akzeptieren derzeit keine neuen Bewerber."
William Reed
Gilt dies nur für Geschäftskonten?
Suncatcher
Wie ist das eine Antwort? Es ist nicht möglich, diese API ist nur für Partner ...
Matej J
Es heißt Seite nicht gefunden!
Mohamed Imran
12

Mit Instagram können Unternehmen ihre Posts jetzt mithilfe der neuen Beta-Endpunkte für Content Publishing planen.

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

Dieser Blog-Beitrag - https://business.instagram.com/blog/instagram-api-features-updates - macht jedoch deutlich, dass sie diese API nur für ihre Facebook-Marketingpartner oder Instagram-Partner öffnen.

Um mit der Planung von Posts zu beginnen, arbeiten Sie bitte mit einem unserer Facebook-Marketingpartner oder Instagram-Partner zusammen.

Dieser Link von Facebook - https://developers.facebook.com/docs/instagram-api/content-publishing - listet ihn als Closed Beta auf.

Die Content Publishing API befindet sich in der Closed Beta nur für Facebook Marketing Partner und Instagram Partner. Wir akzeptieren derzeit keine neuen Bewerber.

Aber so würden Sie es machen:

Sie haben ein Foto bei ...

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

Sie möchten es mit dem Hashtag "#BronzFonz" veröffentlichen.

Sie können die /user/mediaKante verwenden, um den Container wie folgt zu erstellen:

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

Dies würde eine Container-ID zurückgeben (sagen wir 17889455560051444), die Sie dann mit der Kante / user / media_publish wie folgt veröffentlichen würden:

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

Dieses Beispiel aus den Dokumenten .

Joshua Dance
quelle
Danke, aber wo ich die App dafür erstellen kann, können wir auch eine App für Facebook im Facebook-Entwicklerbereich erstellen.
Usama
Dieser Code gibt einen Fehler aus - "Die Anwendung kann diesen API-Aufruf nicht ausführen."? Dies ist für diese Technologieunternehmen völlig unsinnig. Wie können sie darum bitten, über einige bevorzugte Partner zu kommen und nicht unsere eigene App zu erstellen?
Amit Khare
8

Ich habe versucht, IFTTT und viele andere Dienste zu verwenden, aber alle haben Dinge getan oder von Instagram auf eine andere Plattform gepostet, nicht auf Instagram. Ich habe mehr darüber gelesen, dass Instagram derzeit keine solche API bietet.

Die Verwendung von Blue Stack erfordert wiederum eine umfangreiche Installation und die manuelle Ausführung nur manuell.

Sie können jedoch Google Chrome auf der Desktop-Version verwenden, um einen Beitrag auf Instagram zu verfassen. Es muss ein bisschen optimiert werden.

  1. Öffne dein Chrome und durchsuche Instagram.com
  2. Gehen Sie zum Inspizieren des Elements, indem Sie mit der rechten Maustaste auf Chrom klicken.
  3. Wählen Sie im Corener-Menü oben rechts in den Entwicklertools ein weiteres Tool aus.
  4. Wählen Sie weitere Netzwerkbedingungen aus.
  5. Im Abschnitt Netzwerkauswahl finden Sie den zweiten Abschnitt mit dem Namen Benutzeragent.
  6. Deaktivieren Sie die Option Automatisch auswählen und wählen Sie Chrome für Android aus der Liste der angegebenen Benutzeragenten aus.
  7. Aktualisieren Sie Ihre Instagram.com-Seite.

Sie werden eine Änderung in der Benutzeroberfläche und die Option bemerken, einen Beitrag auf Instagram zu verfassen. Dein Leben ist jetzt einfach. Lassen Sie mich einen einfacheren Weg wissen, wenn Sie einen finden können.

Geben Sie hier die Bildbeschreibung ein

Ich habe auf https://www.inteligentcomp.com/2018/11/how-to-upload-to-instagram-from-pc-mac.html darüber geschrieben.

Arbeits-Screenshot

Geben Sie hier die Bildbeschreibung ein

Dheeraj Thedijje
quelle
Aber du kannst nichts posten.
Aarvy
1
Ich habe gerade mit der gleichen Methode gepostet. Es funktioniert absolut gut. Siehe Screenshot im Update.
Dheeraj Thedijje
5

Für Benutzer, die diese Frage finden, können Sie Fotos mithilfe von iPhone-Hooks an den Instagram-Freigabefluss (von Ihrer App zum Filterbildschirm) auf dem iPhone übergeben: http://help.instagram.com/355896521173347 Ansonsten gibt es derzeit keine Weg in Version 1 der API.

Amru E.
quelle
1
@ Ritu interessant. Es muss dann möglich sein, aber es scheint nicht so, als ob die API dies zulässt. Vielen Dank für das Teilen, ich möchte es untersuchen.
Amru E.
1
Ich habe mich auch gefragt, wie sie es machen. Bitte teilen Sie uns mit, ob Sie etwas Relevantes bekommen.
Ritu
2
Es scheint, dass die meisten nicht autorisierten Clients die API zurückentwickeln, indem sie den SSL-Verkehr von der App zum Server entschlüsseln und überwachen. Dies ist zumindest bei Snapchat der Fall. Könnte hier genauso sein.
Amru E.
Flume App für Mac veröffentlicht auch in Ihrem Feed
Joshua - Pendo
0

Es gibt keine API, um Fotos mithilfe der API auf Instagram zu veröffentlichen. Es gibt jedoch eine einfache Möglichkeit, die Google-Erweiterung "User Agent" zu installieren, mit der Ihr Browser auf die Android Mobile Chrome-Version verdeckt wird. Hier ist der Erweiterungslink https://chrome.google.com/webstore/detail/user-agent-switcher/clddifkhlkcojbojppdojfeeikdkgiae?utm_source=chrome-ntp-icon

Klicken Sie einfach auf das Erweiterungssymbol und wählen Sie Chrome für Android und öffnen Sie Instagram.com

Waheed Sabir
quelle
0

Wenn es eine Benutzeroberfläche hat, hat es eine "API". Verwenden wir das folgende Beispiel: Ich möchte das Bild veröffentlichen, das ich in jedem neuen Blog-Beitrag verwende, den ich erstelle. Nehmen wir an, es ist Wordpress.

  1. Erstellen Sie einen Dienst, der Ihr Blog ständig per RSS überwacht.
  2. Wenn ein neuer Blog-Beitrag veröffentlicht wird, laden Sie das Bild herunter.
  3. (Optional) Verwenden Sie eine Drittanbieter-API, um einige Überlagerungen und so weiter auf Ihr Bild anzuwenden.
  4. Platzieren Sie das Foto an einem bekannten Ort auf Ihrem PC oder Server.
  5. Konfigurieren Sie Chrome (siehe oben) so, dass Sie den Browser als Mobiltelefon verwenden können.
  6. Simulieren Sie mit Selenium (oder einer anderen dieser Bibliotheken) den gesamten Prozess der Veröffentlichung auf Instagram.
  7. Getan. Du solltest es haben.
Pepito Fernandez
quelle
0

Für alle, die nach einer Lösung für das Posten auf Instagram mit AWS Lambda und Puppenspieler ( Chrome-Aws-Lambda ) suchen . Beachten Sie, dass Sie mit dieser Lösung nur 1 Foto für jeden Beitrag veröffentlichen können . Wenn Sie nicht Lambda verwenden, ersetzen Sie einfach chrome-aws-lambdamit puppeteer.

Beim ersten Start von Lambda funktioniert dies normalerweise nicht, da instagram einen „verdächtigen Anmeldeversuch“ erkennt . Gehen Sie einfach mit Ihrem PC zur Instagram-Seite und genehmigen Sie sie . Alles sollte in Ordnung sein.

Hier ist mein Code, zögern Sie nicht, ihn zu optimieren:

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

Es muss sich um einen lokalen Dateipfad handeln. Wenn es sich um eine URL handelt, laden Sie sie zuerst in den Ordner / tmp herunter .

Allen Wong
quelle