API kullanarak instagrama nasıl resim gönderilir


109

Kullanıcının yüklediği resmi doğrudan Instagram'a göndermesi gereken bir php uygulaması oluşturuyorum, ancak hızlı bir aramadan sonra API'de böyle bir işlev olmadığını buldum :( ve bu garip geliyor ... çünkü bir tane sağlamaları gerekiyor. php kullanarak resim yüklemenin başka bir yolu (android ve iOS uygulamaları hariç) olup olmadığından emin değilim. Herhangi bir olasılık varsa lütfen bana herhangi bir fikir verin.

Bunu da okudum

PHP kullanarak Instagram ile nasıl bağlantı ve fotoğraf paylaşırım


2
API üzerinden Instagram'a resim göndermek mümkün değildir.
Amal Murali

3
Nasıl olduklarını merak ediyorum - blog.hootsuite.com/schedule-instagram-posts- in - hootsuite - yapıyor ... (blog duyurusu 8 saat önce yayınlandı)
Mars Robertson

1
@MichalStefanow Ben de bunun iyi bir soru olduğunu düşündüm. Bu blog duyurusunda ayrıca Hootsuite'den (makalenin altındaki yorumlar bölümünde) API sınırları nedeniyle Instagram'da gerçek bir doğrudan gönderi bulunmadığına ve son gönderimin Instagram'da yapılması gerektiğine dair bir yorumu var.
thecommonthread

Peki 2019 ortası? Herhangi bir değişiklik var mı?
userlond

Yanıtlar:


81

Paylaştığınız bağlantıyı okursanız, kabul edilen cevap şudur:

API aracılığıyla Instagram'a resim gönderemezsiniz.

Görünüşe göre PC'de instagram'ı taklit edebilirsiniz.

Bluestacks , Android uygulamalarını PC'nizde / Mac'inizde vb. Çalıştırmanıza izin veren bir emülatördür.

Yine de ne kadar iyi çalıştığından emin değilim.


58
Eğer bunu yapmanın HİÇBİR yolu yoksa, o zaman 'başka' bir yol olduğunu sanmıyorum.
Albzi

1
@Ritu gönderimi sırasında @bart, instagram yapıyordu ve posts.sodeğildipostso.com
Albzi

2
@usama maalesef resmi olarak değil, ancak web sitelerine gidip bunu mobil görünüme indirirseniz yapabileceğiniz söylentileri duydum. Kendim de denemedim
Albzi

1
@Albzi Google Chrome kullanıyorsanız; Instagram web sitesine gidin ve sağ tıklayın ve "İncele" yi kullanın, başlığı yeniden boyutlandıracak ve bir mobil tarayıcı imzasına izin verecek şekilde değiştirecektir. Instagram sayfasını "İncele" de bir kez yenilemeniz gerekebilir, ancak bu web sitesini mobil olarak kullanmanıza ve fotoğraf ve neyi gönderememenize izin verecektir. Ancak; bu API sorusuna yardımcı olmaz. Ekibimizin final skorunu gösteren bir fotoğrafı PHP'den Instagram'a göndermeyi çok isterim.
Dawson Irvine

1
Doğru tespit. @BrodaNoel, belki bunu 'resmi' olmayan bir şekilde değiştirmeliyim.
Albzi

102

Güncelleme:

Instagram artık hesapları yasaklıyor ve görüntüleri bu yöntemle kaldırıyor. Lütfen dikkatli kullanın.


Görünüşe göre bu soruyu cevaplayan herkes bir it can't be doneşekilde doğru. Resmi olarak, API'leri ile Instagram'a bir fotoğraf gönderemezsiniz. Ancak, API'ye ters mühendislik uygularsanız bunu yapabilirsiniz.

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

Yukarıdaki kodu metin düzenleyicinize kopyalayıp yapıştırın, birkaç değişkeni buna göre değiştirin ve VOILA! Bununla ilgili bir makale yazdım ve bunu defalarca yaptım. Burada bir demo izleyin .


1
Telefon kullanmadan yukarıdaki kodu kullanarak giriş yapılamıyor. Sadece localhost'ta PC kullanarak kullandım ve şu şekilde bir Hata mesajı aldım: **** Giriş yapmaya çalışırken sunucudan boş yanıt alındı ​​*** bu hatayı nasıl çözebilirim
Rabesh Lal Shrestha

1
Bu koddan yapılmış çalışan bir .net çeşidi var mı? PHP ile çalışamıyorum ve bu kodun .NET sürümü gerçekten işe yarar!
Yosoyke

1
Komut dosyasını yeni bir Instagram hesabında başarıyla çalıştırabildim.
loretoparisi

2
Eğer alıyorsanız status isnt okay, emin CURL bir cookies.txt dosyası yapma izni olan olun. chmod 777 /directorybunu yapacak (dikkatli ol). Senaryonuzdan bir başarı mesajı alıyorum ama gönderi instagramda gösterilmiyor. Bu hala çalışıyor mu?
kmoney12

8
Kod iyi çalışıyor ancak kılavuz ve cihaz kimliği her seferinde değişiyor ve instagram, tek bir başarılı gönderiden sonra hesabımı BANNED. fotoğraf da kaldırıldı.
Alp Altunel

27

GÜNCELLEME Artık mümkün:

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

Content Publishing API, medya nesnelerini yayınlamanıza izin veren Instagram Graph API uç noktalarının bir alt kümesidir. Medya nesnelerini bu API ile yayınlamak iki adımlı bir işlemdir - önce bir medya nesnesi kapsayıcısı oluşturursunuz, ardından kapsayıcıyı İşletme Hesabınızda yayınlarsınız.


22
"Content Publishing API, yalnızca Facebook Pazarlama Ortakları ve Instagram Ortakları ile kapalı beta sürümünde. Şu anda yeni başvuruları kabul etmiyoruz."
William Reed

Bu yalnızca İşletme hesapları için geçerli mi?
Suncatcher

Bu nasıl bir cevap? Mümkün değil, bu API yalnızca iş ortakları içindir ...
Matej J

1
Sayfa bulunamadı diyor!
Mohamed İmran

12

Instagram artık işletmelerin yeni İçerik Yayınlama Beta uç noktalarını kullanarak gönderilerini planlamalarına izin veriyor.

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

Ancak bu blog gönderisi - https://business.instagram.com/blog/instagram-api-features-updates - bu API'yi yalnızca Facebook Pazarlama Ortaklarına veya Instagram Ortaklarına açtıklarını açıkça ortaya koyuyor.

Gönderi planlamaya başlamak için lütfen Facebook Pazarlama Ortaklarımızdan veya Instagram Ortaklarımızdan biriyle çalışın.

Facebook'tan gelen bu bağlantı - https://developers.facebook.com/docs/instagram-api/content-publishing - onu kapalı beta olarak listeliyor.

Content Publishing API, yalnızca Facebook Pazarlama Ortakları ve Instagram Ortakları ile kapalı beta sürümündedir. Şu anda yeni başvuru kabul etmiyoruz.

Ama bunu böyle yaparsın:

Şurada bir fotoğrafınız var ...

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

"#BronzFonz" hashtag'iyle yayınlamak istiyorsunuz.

/user/mediaKabı şu şekilde oluşturmak için kenarı kullanabilirsiniz :

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

Bu, daha sonra / user / media_publish kenarını kullanarak yayınlayacağınız bir kapsayıcı kimliği (diyelim ki 17889455560051444) döndürecektir:

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

Dokümanlardan bu örnek .


Teşekkürler ama bunun için uygulamayı oluşturabileceğim yerde facebook geliştirici alanında facebook için uygulama oluşturabiliriz.
usama

Bu kod bir hata veriyor - "Uygulamanın bu API çağrısını yapma özelliği yok." Bu teknoloji şirketlerinden bu tamamen anlamsız. Bazı tercih edilen ortaklar aracılığıyla gelip kendi Uygulamamızı yapmamayı nasıl isteyebilirler?
Amit Khare

8

IFTTT ve diğer birçok hizmeti kullanmayı denedim, ancak hepsi Instagram'dan Instagram'a değil başka bir platforma bir şeyler yapıyor ya da gönderiyorlardı. Daha fazla okuduğum için Instagram şu an itibariyle böyle bir API sağlamıyor.

Mavi yığının kullanılması yine ağır kurulum ve işleri yalnızca manuel olarak yapmayı gerektirir.

Ancak Instagram'da gönderi yapmak için Google Chrome'unuzu masaüstü sürümünde kullanabilirsiniz. Biraz ince ayar gerekiyor.

  1. Chrome'unuzu açın ve Instagram.com'a göz atın
  2. Kroma sağ tıklayarak öğeyi incelemeye gidin.
  3. Geliştirici araçlarının sağ üst kısmındaki açılır menüden daha fazla araç seçin.
  4. Daha fazla seçin ağ koşulları.
  5. Ağ seçimi bölümünde, kullanıcı aracısı adlı ikinci bölüme bakın.
  6. Otomatik olarak seç seçeneğinin işaretini kaldırın ve verilen kullanıcı aracısı listesinden Android için Chrome'u seçin .
  7. Instagram.com sayfanızı yenileyin.

Kullanıcı arayüzünde bir değişiklik ve Instagram'da bir gönderi yapma seçeneği fark edeceksiniz. Hayatın artık çok kolay. Bulabilirseniz bana daha kolay bir yol bildirin.

görüntü açıklamasını buraya girin

Bunun hakkında https://www.inteligentcomp.com/2018/11/how-to-upload-to-instagram-from-pc-mac.html üzerine yazdım .

Çalışma Ekran Görüntüsü

görüntü açıklamasını buraya girin


Ama hiçbir şey gönderemezsin.
Aarvy

1
Aynı yöntemi kullanarak gönderdim. Kesinlikle iyi çalışıyor. Güncellemedeki ekran görüntüsüne bakın.
Dheeraj Thedijje

5

Bu soruyu bulan kullanıcılar için iPhone kancalarını kullanarak fotoğrafları instagram paylaşım akışına (uygulamanızdan filtreler ekranına) iPhone üzerinden iletebilirsiniz: http://help.instagram.com/355896521173347 Bunun dışında, şu anda hiçbir API'nin 1. sürümünde yol.


1
@Ritu ilginç. O zaman mümkün olmalı, ancak API buna izin veriyor gibi görünmüyor. Paylaştığınız için teşekkürler, onu araştırmak istiyorum.
Amru E.

1
Ayrıca nasıl yaptıklarını merak ediyordum, lütfen alakalı bir şey alırsanız paylaşın.
Ritu

2
Çoğu yetkisiz istemcinin, uygulamadan sunucuya SSL trafiğinin şifresini çözerek ve izleyerek API'ye ters mühendislik uyguladığı görülmektedir. En azından Snapchat için durum bu. Burada aynı olabilir.
Amru E.

Flume App for Mac, yayınınıza da
gönderiyor


0

Bir kullanıcı arayüzü varsa, bir "API" ye sahiptir. Şu örneği kullanalım: Yarattığım her yeni blog gönderisinde kullandığım resmi yayınlamak istiyorum. Wordpress olduğunu varsayalım.

  1. Blogunuzu RSS yoluyla sürekli izleyen bir hizmet oluşturun.
  2. Yeni bir blog yazısı yayınlandığında, resmi indirin.
  3. (İsteğe bağlı) Resminize bazı kaplamalar ve başka şeyler uygulamak için üçüncü taraf bir API kullanın.
  4. Fotoğrafı PC'nizde veya sunucunuzda iyi bilinen bir yere yerleştirin.
  5. Tarayıcıyı bir mobil cihaz olarak kullanabilmek için Chrome'u yapılandırın (yukarıda okuyun).
  6. Selenium'u (veya bu kitaplıklardan herhangi birini) kullanarak, Instagram'da yayınlama sürecinin tamamını simüle edin.
  7. Bitti. Ona sahip olmalısın.

0

AWS lambda ve puppeteer ( chrome-aws-lambda ) kullanarak Instagram'a gönderi göndermeyle ilgili bir çözüm arayan herkes için . Bu çözümün yalnızca her gönderi için 1 fotoğraf göndermenize izin verdiğini kaydetti . Eğer lambda kullanmıyorsanız, sadece değiştirmek chrome-aws-lambdailepuppeteer .

Lambda'nın ilk lansmanı için, instagram'ın "Şüpheli oturum açma denemesi" algılaması nedeniyle bunun çalışmaması normaldir . Sadece bilgisayarınızı kullanarak instagram sayfasına gidin ve onaylayın , her şey yoluna girmeli.

İşte kodum, optimize etmekten çekinmeyin:

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

yerel dosya yolu olmalı, url ise, önce / tmp klasörüne indirin .


Bu oldukça düzgün bir çözüm :) Teşekkürler.
Kristoffer Berg - EcodeAS
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.