APIを使用してInstagramに写真を投稿する方法


108

ユーザーがアップロードした写真をInstagramに直接投稿する必要のあるphpアプリケーションを構築していますが、簡単な検索の結果、APIにそのような関数がないことがわかりました:(そしてそれは奇妙に感じます... phpを使用して画像をアップロードする他の方法(androidとiOSのアプリを除く)があるかどうかはわかりませんが、可能であれば、どんな種類のアイデアでも教えてください。

私もこれを読みました、

PHPを使用してInstagramとリンクや写真を共有するには


2
API経由でInstagramに写真を投稿することはできません。
Amal Murali 2013

3
私は彼らがどのように-blog.hootsuite.com/schedule-instagram-posts-in-hootsuite-do it ...(ブログの発表は8時間前に投稿されました)
Mars Robertson

1
@MichalStefanow私もいい質問だと思いました。そのブログの発表には、Hootsuite(記事の下のコメントセクション)からのコメントもあります。APIの制限により、実際のInstagramへの直接投稿はなく、最後の投稿はInstagramで行う必要があります。
thecommonthread 2016年

2019年半ばはどうですか?何か変化はありますか?
userlond

回答:


81

共有したリンクを読んだ場合、受け入れられる答えは次のとおりです。

API経由でInstagramに写真を投稿することはできません。

PCでInstagramをエミュレートできるようです。

Bluestacksは、PC / MacなどでAndroidアプリを実行できるエミュレータです。

それがどれだけうまく機能するかはわかりません。


58
まあ、それを行う方法がない場合、私は「別の」方法があるとは思いません。
Albzi 2013

1
@Ritu投稿時の@bartは、Instagramを実行しましたが、そうではありposts.soませんでしたpostso.com
Albzi

2
@usamaは残念ながら公式には公開されていませんが、彼らのウェブサイトにアクセスしてモバイルビューに縮小すればできるという噂を聞いたことがあります。自分で試してみませんでした
Albzi 2017

1
@Albzi Google Chromeを使用している場合; InstagramのWebサイトにアクセスし、右クリックして「Inspect」を使用すると、ヘッダーのサイズが変更され、モバイルブラウザの署名が許可されます。「Inspect」で一度Instagramページを更新する必要があるかもしれませんが、それはあなたがモバイルとしてウェブサイトを使用することを可能にし、写真などを投稿することができます。しかしながら; これはAPIの質問には役立ちません。私のチームの最終スコアを示す写真をPHPからInstagramに投稿できるようになりたいです。
ドーソンアーバイン

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

上記のコードをコピーしてテキストエディターに貼り付け、それに応じていくつかの変数を変更してください。私はこれについて記事を書いて、それを何度もやった。こちらのデモをご覧ください


1
電話を使用せずに上記のコードを使用してログインできません。ログインしようとしながら****空の応答をサーバから受信などのように、そのエラーを解決する方法***私はPCを使用してローカルホストで使用され、私はエラーメッセージが表示されました
Rabeshラル・シュレスタ

1
このコードで作られた動作する.netバリアントはすでにありますか?私はPHPを操作できません。このコードの.NETバージョンは本当に便利です。
Yosoyke、2015

1
新しいInstagramアカウントでスクリプトを正常に実行できました。
loretoparisi

2
を取得している場合はstatus isnt okay、CURLにcookies.txtファイルを作成する権限があることを確認してください。chmod 777 /directoryこれを行います(注意してください)。スクリプトから成功メッセージを受け取りましたが、投稿がInstagramに表示されていません。これはまだ機能しますか?
kmoney12

8
コードは正常に動作しますが、GUIDとデバイスIDは毎回変更され、1回の投稿が成功した後、Instagramが私のアカウントを禁止しました。写真も削除されました。
Alp Altunel 2017

27

更新 今では可能です:

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

Content Publishing APIは、メディアオブジェクトを公開できるInstagram Graph APIエンドポイントのサブセットです。このAPIを使用したメディアオブジェクトの公開は、2つのステップのプロセスです。最初にメディアオブジェクトコンテナーを作成し、次にコンテナーをビジネスアカウントに公開します。


22
「Content Publishing APIは、FacebookマーケティングパートナーとInstagramパートナーのみとのクローズドベータ版です。現在、新しい申請者は受け付けていません。」
ウィリアムリード

これはビジネスアカウントにのみ適用されますか?
サンキャッチャー、

これはどのように答えますか?不可能です。このAPIはパートナー専用です...
Matej J

1
ページが見つかりませんでした!
モハメドイムラン

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-は、FacebookマーケティングパートナーまたはInstagramパートナーに対してのみそのAPIを開いていることを明らかにしています。

投稿のスケジュールを開始するには、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

これはコンテナID(17889455560051444としましょう)を返し、次のように/ user / media_publishエッジを使用して発行します。

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

docsからのこの例。


ありがとうございますが、facebook開発者エリアでfacebook用のアプリを作成できるように、このアプリを作成できるところです。
usama

このコードはエラーを出します-「アプリケーションにはこのAPI呼び出しを行う機能がありません。」?これは、これらのテクノロジー企業にとってまったくナンセンスです。自分のアプリを作成せずに、一部の優先パートナー経由で使用するように依頼する方法を教えてください。
アミットカレ

8

私はIFTTTや他の多くのサービスを使用してみましたが、すべてがInstagramから別のプラットフォームにInstagramから何かを投稿したり投稿したりしていました。Instagramが現時点でそのようなAPIを提供していないことを確認しました。

ブルースタックを使用する場合も、重いインストールと手動でのみ行う必要があります。

ただし、デスクトップ版のGoogle Chromeを使用してInstagramに投稿することができます。少し調整が必要です。

  1. Chromeを開き、Instagram.comを閲覧します
  2. クロムを右クリックして要素を検査します。
  3. 右上のコアナーメニュードロップダウンから開発者ツールを選択し、他のツールを選択します。
  4. さらにネットワーク条件を選択します。
  5. ネットワーク選択セクションで、ユーザーエージェントという2番目のセクションを参照してください。
  6. [自動的選択する]チェックボックスをオフにして、指定されたユーザーエージェントのリストから[ Chrome for Android]を選択します。
  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

Flume App for Macもフィードに投稿します
Joshua-Pendo

0

APIを使用してInstagramに写真を投稿するためのAPIはありませんが、Google拡張機能「ユーザーエージェント」をインストールして、ブラウザーをAndroidモバイルクロムバージョンに変換するという簡単な方法があります。拡張リンクはこちらhttps://chrome.google.com/webstore/detail/user-agent-switcher/clddifkhlkcojbojppdojfeeikdkgiae?utm_source=chrome-ntp-icon

拡張機能アイコンをクリックし、AndroidのChromeを選択してInstagram.comを開くだけです


0

UIがある場合は、「API」があります。次の例を使用してみましょう。自分が作成した新しいブログ投稿で使用する写真を公開します。Wordpressだとしましょう。

  1. RSS経由でブログを常に監視するサービスを作成します。
  2. 新しいブログ投稿が投稿されたら、画像をダウンロードします。
  3. (オプション)サードパーティのAPIを使用して、オーバーレイなどを写真に適用します。
  4. PCまたはサーバーのよく知られた場所に写真を配置します。
  5. ブラウザをモバイルとして使用できるようにChrome(上記を参照)を構成します。
  6. Selenium(またはその他のライブラリ)を使用して、Instagramへの投稿プロセス全体をシミュレートします。
  7. できました。あなたはそれを持っている必要があります。

0

AWS lambdapuppeteerchrome-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.