Cara memposting gambar ke instagram menggunakan API

109

Saya sedang membangun aplikasi php yang perlu memposting gambar yang diunggah pengguna langsung ke Instagram, tetapi setelah pencarian cepat saya menemukan bahwa tidak ada fungsi seperti itu di API :( dan rasanya aneh ... karena mereka harus menyediakannya. Saya Saya tidak yakin apakah ada cara lain (kecuali aplikasi untuk android dan iOS) untuk mengunggah gambar menggunakan php. Mohon beri saya ide apa pun jika ada kemungkinan.

Saya juga membaca ini,

Bagaimana cara membagikan tautan dan foto dengan Instagram menggunakan PHP

Altaf Hussain
sumber
2
Tidak mungkin memposting gambar ke Instagram melalui API.
Amal Murali
3
Saya bertanya-tanya bagaimana mereka - blog.hootsuite.com/schedule-instagram-posts-in-hootsuite - melakukannya ... (pengumuman blog telah diposting 8 jam yang lalu)
Mars Robertson
1
@MichalStefanow Saya pikir itu pertanyaan yang bagus juga. Pengumuman blog itu juga mendapat komentar dari Hootsuite (di bagian komentar di bawah artikel) bahwa sebenarnya tidak ada posting langsung ke Instagram karena batasan API dan posting terakhir harus dilakukan di Instagram.
baca setiap
Bagaimana dengan pertengahan 2019? Apakah ada perubahan?
userlond

Jawaban:

81

Jika Anda membaca tautan yang Anda bagikan, jawaban yang diterima adalah:

Anda tidak dapat memposting gambar ke Instagram melalui API.

Sepertinya Anda dapat meniru instagram di PC.

Bluestacks adalah emulator yang memungkinkan Anda menjalankan aplikasi Android di PC / Mac, dll.

Saya tidak yakin seberapa baik kerjanya.

Albzi
sumber
58
Jika TIDAK ADA cara untuk melakukannya, maka saya kira tidak ada cara 'lain'.
Albzi
1
@bart pada saat @Ritu memposting, itu memang instagram dan posts.sotidakpostso.com
Albzi
2
Sayangnya @usama tidak secara resmi tetapi saya telah mendengar desas-desus bahwa jika Anda membuka situs web mereka dan menurunkannya ke tampilan seluler, Anda bisa. Tidak mencobanya sendiri
Albzi
1
@Albzi Jika Anda menggunakan Google Chrome; masuk ke situs web Instagram dan klik kanan dan gunakan "Inspect" itu akan mengubah ukuran dan mengubah tajuk menjadi tanda tangan browser seluler yang memungkinkan. Anda mungkin harus menyegarkan halaman Instagram sekali dalam "Inspect" tetapi itu akan memungkinkan Anda untuk menggunakan situs web sebagai ponsel dan dapat memposting foto dan yang tidak. Namun; ini tidak membantu dengan pertanyaan API. Saya ingin sekali dapat memposting foto dari PHP ke Instagram yang menunjukkan skor akhir tim kami.
Dawson Irvine
1
Poin yang adil. @BrodaNoel, mungkin saya harus mengubahnya ke cara yang tidak 'resmi'.
Albzi
102

Memperbarui:

Instagram sekarang melarang akun dan menghapus gambar berdasarkan metode ini. Harap gunakan dengan hati-hati.


Tampaknya setiap orang yang menjawab pertanyaan ini dengan sesuatu di sepanjang baris it can't be doneagak benar. Secara resmi, Anda tidak dapat memposting foto ke Instagram dengan API mereka. Namun, jika Anda merekayasa balik API, Anda bisa.

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

Cukup salin dan tempel kode di atas di editor teks Anda, ubah beberapa variabel sesuai dan VOILA! Saya menulis artikel tentang ini dan saya telah melakukannya berkali-kali. Lihat demo di sini .

Tombak
sumber
1
Tidak dapat masuk menggunakan kode di atas tanpa menggunakan ponsel. Saya baru saja menggunakan localhost menggunakan PC dan saya baru saja mendapat pesan Kesalahan seperti **** Tanggapan kosong yang diterima dari server saat mencoba masuk *** bagaimana mengatasi kesalahan itu
Rabesh Lal Shrestha
1
Apakah sudah ada varian .net yang berfungsi dari kode ini? Saya tidak dapat bekerja dengan PHP dan versi .NET dari kode ini akan sangat berguna!
Yosoyke
1
Saya berhasil menjalankan skrip di akun Instagram baru.
loretoparisi
2
Jika Anda mendapatkan status isnt okay, pastikan CURL memiliki izin untuk membuat file cookies.txt. chmod 777 /directoryakan melakukan ini (hati-hati). Saya mendapatkan pesan sukses dari skrip Anda, tetapi kiriman tidak muncul di instagram. Apakah ini masih berfungsi?
kmoney12
8
Kode berfungsi dengan baik tetapi guid dan deviceid berubah setiap saat dan instagram MEMBATALKAN akun saya setelah satu posting yang sukses. foto juga telah dihapus.
Alp Altunel
27

MEMPERBARUI Sekarang mungkin:

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

Content Publishing API adalah bagian dari titik akhir API Grafik Instagram yang memungkinkan Anda untuk mempublikasikan objek media. Menerbitkan objek media dengan API ini merupakan proses dua langkah - Anda terlebih dahulu membuat wadah objek media, lalu menerbitkan wadah tersebut di Akun Bisnis Anda.

Tom Roggero
sumber
22
Perlu dicatat bahwa "Content Publishing API hanya dalam versi beta tertutup dengan Mitra Pemasaran Facebook dan Mitra Instagram. Kami tidak menerima pelamar baru saat ini."
William Reed
Apakah ini hanya berlaku untuk akun Bisnis?
Suncatcher
Bagaimana ini jawabannya? Tidak mungkin, API ini hanya untuk mitra ...
Matej J
1
Dikatakan halaman tidak ditemukan!
Mohamed Imran
12

Instagram sekarang memungkinkan bisnis untuk menjadwalkan posting mereka, menggunakan titik akhir Content Publishing Beta baru.

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

Namun, postingan blog ini - https://business.instagram.com/blog/instagram-api-features-updates - menjelaskan bahwa mereka hanya membuka API tersebut ke Mitra Pemasaran Facebook atau Mitra Instagram.

Untuk mulai menjadwalkan postingan, bekerjasamalah dengan salah satu Mitra Pemasaran Facebook atau Mitra Instagram kami.

Tautan dari Facebook ini - https://developers.facebook.com/docs/instagram-api/content-publishing - mencantumkannya sebagai beta tertutup.

Content Publishing API hanya dalam versi beta tertutup dengan Mitra Pemasaran Facebook dan Mitra Instagram. Kami tidak menerima pelamar baru saat ini.

Tapi beginilah cara Anda melakukannya:

Anda punya foto di ...

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

Anda ingin menerbitkannya dengan hashtag "#BronzFonz".

Anda bisa menggunakan /user/mediatepi untuk membuat wadah seperti ini:

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

Ini akan mengembalikan ID penampung (katakanlah 17889455560051444), yang kemudian akan Anda publikasikan menggunakan tepi / user / media_publish, seperti ini:

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

Contoh ini dari dokumen .

Joshua Dance
sumber
Terima kasih, tetapi di mana saya dapat membuat aplikasi untuk ini seperti kita dapat membuat aplikasi untuk facebook di area pengembang facebook.
usama
Kode ini memberikan kesalahan - "Aplikasi tidak memiliki kemampuan untuk melakukan panggilan API ini."? Ini sama sekali tidak masuk akal dari perusahaan teknologi ini. Bagaimana mereka bisa meminta untuk datang melalui beberapa mitra pilihan dan tidak membuat Aplikasi kami sendiri.
Amit Khare
8

Saya mencoba menggunakan IFTTT dan banyak layanan lainnya tetapi semuanya melakukan sesuatu atau memposting dari Instagram ke platform lain bukan ke Instagram. Saya membaca lebih lanjut untuk menemukan Instagram tidak menyediakan API seperti yang sekarang.

Menggunakan blue stack sekali lagi melibatkan instalasi berat dan melakukan sesuatu secara manual saja.

Namun, Anda bisa menggunakan Google Chrome versi desktop untuk membuat postingan di Instagram. Perlu sedikit penyesuaian.

  1. Buka chrome Anda dan jelajahi Instagram.com
  2. Pergi untuk memeriksa elemen dengan mengklik kanan pada chrome.
  3. Dari drop down menu corener kanan atas pada alat pengembang, pilih alat lainnya.
  4. Kondisi jaringan selanjutnya pilih.
  5. Di bagian pemilihan jaringan, lihat bagian kedua di sana bernama agen pengguna.
  6. Hapus centang pilih secara otomatis , dan pilih chrome untuk Android dari daftar agen pengguna yang diberikan.
  7. Segarkan halaman Instagram.com Anda.

Anda akan melihat perubahan UI dan opsi untuk membuat posting di Instagram. Hidupmu sekarang mudah. Beri tahu saya cara yang lebih mudah jika Anda dapat menemukannya.

masukkan deskripsi gambar di sini

Saya menulis di https://www.inteligentcomp.com/2018/11/how-to-upload-to-instagram-from-pc-mac.html tentang itu.

Screenshot Bekerja

masukkan deskripsi gambar di sini

Dheeraj Thedijje
sumber
Tetapi Anda tidak dapat memposting apa pun.
Aarvy
1
Saya baru saja memposting menggunakan metode yang sama. Ini bekerja dengan sangat baik. Lihat tangkapan layar di pembaruan.
Dheeraj Thedijje
5

Untuk pengguna yang menemukan pertanyaan ini, Anda dapat meneruskan foto ke aliran berbagi Instagram (dari aplikasi Anda ke layar filter) di iPhone menggunakan kait iPhone: http://help.instagram.com/355896521173347 Selain itu, saat ini tidak ada cara di versi 1 api.

Amru E.
sumber
1
@Ritu menarik. Itu pasti mungkin, tapi sepertinya API tidak mengizinkannya. Terima kasih telah berbagi, saya ingin memeriksanya.
Amru E.
1
Saya juga bertanya-tanya bagaimana mereka melakukannya, tolong bagikan jika Anda akan mendapatkan sesuatu yang relevan.
Ritu
2
Tampaknya sebagian besar klien yang tidak sah merekayasa balik API dengan mendekripsi dan memantau lalu lintas SSL dari aplikasi ke server. Ini adalah kasus Snapchat, setidaknya. Bisa jadi sama di sini.
Amru E.
Aplikasi Flume untuk Mac juga memposting ke feed Anda
Joshua - Pendo
0

Jika memiliki UI, ia memiliki "API". Mari kita gunakan contoh berikut: Saya ingin mempublikasikan gambar yang saya gunakan di setiap posting blog baru yang saya buat. Mari kita asumsikan adalah Wordpress.

  1. Buat layanan yang terus memantau blog Anda melalui RSS.
  2. Saat postingan blog baru diposting, download gambarnya.
  3. (Opsional) Gunakan API pihak ketiga untuk menerapkan beberapa overlay dan yang lainnya pada gambar Anda.
  4. Tempatkan foto di lokasi terkenal di PC atau server Anda.
  5. Konfigurasikan Chrome (baca di atas) sehingga Anda dapat menggunakan browser sebagai seluler.
  6. Menggunakan Selenium (atau pustaka lainnya), simulasikan seluruh proses posting di Instagram.
  7. Selesai. Kamu harus memilikinya.
Pepito Fernandez
sumber
0

Untuk siapa saja yang mencari solusi tentang memposting ke Instagram menggunakan AWS lambda dan dalang ( chrome-aws-lambda ). Tercatat bahwa solusi ini memungkinkan Anda untuk memposting 1 foto untuk setiap posting saja . Jika Anda tidak menggunakan lambda, ganti saja chrome-aws-lambdadenganpuppeteer .

Untuk peluncuran pertama lambda, itu normal yang tidak akan berfungsi karena instagram mendeteksi "upaya login yang mencurigakan" . Cukup buka halaman instagram menggunakan PC Anda dan setujui , semuanya akan baik-baik saja.

Ini kode saya, silakan mengoptimalkannya:

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

itu harus jalur file lokal, jika itu url, unduh dulu ke folder / tmp .

Allen Wong
sumber