API를 사용하여 Instagram에 사진을 게시하는 방법


109

사용자가 업로드 한 사진을 인스 타 그램에 직접 게시해야하는 PHP 애플리케이션을 구축 중이지만 빠른 검색 후 API에 이러한 기능이 없음을 발견했습니다. (그리고 이상하게 느껴집니다 ... 그들이 제공해야하기 때문입니다. PHP를 사용하여 사진을 업로드하는 다른 방법 (Android 및 iOS 용 앱 제외)이 있는지 확실하지 않습니다. 가능성이 있으면 어떤 종류의 아이디어라도주세요.

나는 또한 이것을 읽었다,

PHP를 사용하여 Instagram과 링크 및 사진을 공유하려면 어떻게해야합니까?


2
API를 통해 Instagram에 사진을 게시 할 수 없습니다.
Amal Murali 2013 년

3
궁금 어떻게 - blog.hootsuite.com/schedule-instagram-posts-in-hootsuite 가 ... (블로그 발표 8 시간 전에 게시) 할 -
화성 로버트슨

1
@MichalStefanow 나도 좋은 질문이라고 생각했습니다. 이 블로그 발표에는 API 제한으로 인해 Instagram에 실제로 직접 게시 할 수 없으며 최종 게시는 Instagram에서 수행해야한다는 Hootsuite (기사 아래 댓글 섹션)의 의견도 있습니다.
thecommonthread 23:47에

2019 년 중반은 어떻습니까? 변경 사항이 있습니까?
userlond

답변:


81

공유 한 링크를 읽으면 허용되는 답변은 다음과 같습니다.

API를 통해 Instagram에 사진을 게시 할 수 없습니다.

그래도 PC에서 인스 타 그램을 모방 할 수있는 것 같습니다.

BlueStacks 는 PC / Mac 등에서 Android 앱을 실행할 수있는 에뮬레이터입니다.

그래도 얼마나 잘 작동하는지 잘 모르겠습니다.


58
글쎄, 그것을 할 방법이 없다면, 나는 '다른'방법이 있다고 생각하지 않습니다.
Albzi 2013 년

1
@Ritu 게시 당시 @bart, 그것은 인스 타 그램을했고 posts.so그렇지 않았습니다postso.com
Albzi

2
@usama 안타깝게도 공식적으로는 아니지만 웹 사이트로 이동하여 모바일보기로 축소하면 가능하다는 소문을 들었습니다. 하지 불구하고 그것을 자신을 시도
Albzi

1
@Albzi Google 크롬을 사용하는 경우; 인스 타 그램 웹 사이트에 가서 우클릭하고 "검사"를 사용하면 헤더 크기가 조정되고 모바일 브라우저 서명으로 변경됩니다. "Inspect"에서 Instagram 페이지를 한 번 새로 고침해야 할 수도 있지만 웹 사이트를 모바일로 사용할 수 있고 사진을 게시 할 수 있습니다. 하나; 이것은 API 질문에 도움이되지 않습니다. PHP에서 Instagram으로 우리 팀의 최종 점수를 보여주는 사진을 게시하고 싶습니다.
Dawson Irvine

1
공정한 포인트. @BrodaNoel, 아마도 나는 그것을 '공식적인'방식이 아닌 것으로 변경해야 할 것입니다.
Albzi

102

최신 정보:

Instagram은 이제이 방법에 따라 계정을 금지하고 이미지를 제거합니다. 주의해서 사용하십시오.


이 질문에 답한 모든 사람들 it can't be done이 다소 옳은 것 같습니다. 공식적으로는 API로 Instagram에 사진을 게시 할 수 없습니다. 그러나 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
전화를 사용하지 않고는 위의 코드를 사용하여 로그인 할 수 없습니다. 방금 PC를 사용하는 localhost에서 사용했는데 **** 로그인을 시도하는 동안 서버에서받은 빈 응답과 같은 오류 메시지가 나타납니다. *** 해당 오류를 해결하는 방법
Rabesh Lal Shrestha

1
이 코드로 만든 작동하는 .net 변형이 이미 있습니까? PHP로 작업 할 수 없으며이 코드의 .NET 버전이 정말 유용 할 것입니다!
Yosoyke 2015

1
새 Instagram 계정에서 스크립트를 성공적으로 실행할 수있었습니다.
loretoparisi

2
인 경우 status isnt okayCURL에 cookies.txt 파일을 만들 수있는 권한이 있는지 확인하십시오. chmod 777 /directory이 작업을 수행합니다 (주의). 스크립트에서 성공 메시지를 받았지만 게시물이 Instagram에 표시되지 않습니다. 여전히 작동합니까?
kmoney12

8
코드는 잘 작동하지만 guid 및 deviceid는 매번 변경되고 Instagram은 성공적인 단일 게시물 후 내 계정을 금지했습니다. 사진도 제거되었습니다.
Alp Altunel

27

업데이트 이제 가능합니다 :

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

Content Publishing API는 미디어 개체를 게시 할 수있는 Instagram Graph API 끝점의 하위 집합입니다. 이 API를 사용하여 미디어 개체를 게시하는 것은 2 단계 프로세스입니다. 먼저 미디어 개체 컨테이너를 만든 다음 비즈니스 계정에 컨테이너를 게시합니다.


22
"Content Publishing API는 Facebook 마케팅 파트너 및 Instagram 파트너에게만 비공개 베타 버전입니다. 현재 신규 지원자를받지 않습니다."
William Reed

비즈니스 계정에만 적용 되나요?
Suncatcher

이것은 어떻게 대답입니까? 불가능합니다.이 API는 파트너 전용입니다 ...
Matej J

1
페이지를 찾을 수 없습니다!
Mohamed Imran

12

이제 Instagram을 통해 기업은 새로운 Content Publishing Beta 엔드 포인트를 사용하여 게시물을 예약 할 수 있습니다.

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- 비공개 베타로 나열됩니다.

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

그러면 다음과 같이 / user / media_publish 에지를 사용하여 게시 할 컨테이너 ID (예 : 17889455560051444)가 반환됩니다.

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

문서 의이 예 .


감사합니다. Facebook 개발자 영역에서 Facebook 용 앱을 만들 수있는 것처럼이 앱을 만들 수 있습니다.
usama nov.

이 코드는 "애플리케이션에이 API를 호출 할 수있는 기능이 없습니다."라는 오류를 제공합니다. 이것은이 기술 회사들에게는 전혀 말도 안되는 일입니다. 그들은 우리 자신의 앱을 만들지 않고 선호하는 파트너를 통해 오도록 어떻게 요청할 수 있습니까?
Amit Khare

8

IFTTT와 다른 많은 서비스를 사용해 보았지만 모두 인스 타 그램에서 인스 타 그램이 아닌 다른 플랫폼으로 작업을하거나 게시했습니다. 나는 Instagram이 현재 그러한 API를 제공하지 않는다는 것을 더 많이 읽었습니다.

블루 스택을 사용하는 것은 다시 무거운 설치를 포함하고 수동으로 만 작업을 수행합니다.

그러나 데스크톱 버전에서 Google 크롬을 사용하여 Instagram에 게시물을 올릴 수 있습니다. 약간의 조정이 필요합니다.

  1. 크롬을 열고 Instagram.com을 검색합니다.
  2. 크롬을 마우스 오른쪽 버튼으로 클릭하여 검사 요소로 이동하십시오.
  3. 개발자 도구의 오른쪽 상단 코어 너 메뉴 드롭 다운에서 더 많은 도구를 선택합니다.
  4. 네트워크 조건을 추가로 선택하십시오.
  5. 네트워크 선택 섹션에서 사용자 에이전트라는 두 번째 섹션을 참조하십시오.
  6. 자동 선택을 선택 취소 하고 Android 용 Chrome을 선택합니다. 주어진 사용자 에이전트 목록에서 합니다.
  7. Instagram.com 페이지를 새로 고칩니다.

UI가 변경되고 Instagram에 게시물을 올리는 옵션이 표시됩니다. 당신의 삶은 이제 쉽습니다. 더 쉬운 방법이 있으면 알려주세요.

여기에 이미지 설명 입력

나는 그것에 대해 https://www.inteligentcomp.com/2018/11/how-to-upload-to-instagram-from-pc-mac.html 에 썼습니다 .

작동 스크린 샷

여기에 이미지 설명 입력


하지만 아무것도 게시 할 수 없습니다.
Aarvy

1
방금 같은 방법으로 게시했습니다. 정말 잘 작동합니다. 업데이트에서 스크린 샷을 참조하십시오.
Dheeraj Thedijje

5

이 질문을 찾은 사용자의 경우 iPhone 후크를 사용하여 iPhone의 Instagram 공유 흐름 (앱에서 필터 화면으로)에 사진을 전달할 수 있습니다. http://help.instagram.com/355896521173347 그 외에는 현재 없습니다. API의 버전 1에서.


1
@Ritu 흥미로운. 그렇다면 가능해야하지만 API가 허용하는 것 같지 않습니다. 공유 해주셔서 감사합니다. 조사 해보고 싶습니다.
Amru E.

1
나는 또한 그들이 그것을 어떻게하고 있는지 궁금합니다. 관련있는 것을 얻을 수 있다면 공유하십시오.
Ritu

2
대부분의 승인되지 않은 클라이언트는 앱에서 서버로의 SSL 트래픽을 해독하고 모니터링하여 API를 리버스 엔지니어링하는 것으로 보입니다. 적어도 Snapchat의 경우입니다. 여기서도 동일 할 수 있습니다.
Amru E. 2014

Mac 용 수로 앱 피드에 또한 게시물
Pendo - 여호수아

0

API를 사용하여 인스 타 그램에 사진을 게시하는 API는 없지만 Google 확장 프로그램 "사용자 에이전트"를 설치하면 브라우저를 안드로이드 모바일 크롬 버전으로 전환하는 간단한 방법이 있습니다. 다음은 확장 링크입니다 https://chrome.google.com/webstore/detail/user-agent-switcher/clddifkhlkcojbojppdojfeeikdkgiae?utm_source=chrome-ntp-icon

확장 아이콘을 클릭하고 Android 용 크롬을 선택하고 Instagram.com을 엽니 다.


0

UI가있는 경우 "API"가 있습니다. 다음 예제를 사용하겠습니다. 내가 만든 새 블로그 게시물에 사용하는 사진을 게시하고 싶습니다. Wordpress라고 가정 해 봅시다.

  1. RSS를 통해 블로그를 지속적으로 모니터링하는 서비스를 만드십시오.
  2. 새 블로그 게시물이 게시되면 사진을 다운로드하십시오.
  3. (선택 사항) 타사 API를 사용하여 일부 오버레이 및 기타 사항을 사진에 적용하십시오.
  4. PC 또는 서버의 잘 알려진 위치에 사진을 놓습니다.
  5. 브라우저를 모바일로 사용할 수 있도록 Chrome을 구성하십시오 (위 참조).
  6. Selenium (또는 다른 라이브러리)을 사용하여 Instagram에 게시하는 전체 프로세스를 시뮬레이션합니다.
  7. 끝난. 당신은 그것을 가져야합니다.

0

AWS lambdapuppeteer ( chrome-aws-lambda )를 사용하여 Instagram에 게시하는 방법에 대한 솔루션을 찾고있는 모든 사람을 위해 . 이 솔루션을 사용하면 각 게시물에 대해 1 개의 사진 만 게시 할 수 있습니다. 당신은 람다를 사용하지 않는 경우, 바로 교체 chrome-aws-lambda와 함께puppeteer .

람다를 처음 출시 할 때 Instagram이 "의심스러운 로그인 시도"를 감지하기 때문에 작동하지 않는 것은 정상입니다 . PC를 사용하여 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 폴더에 다운로드하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.