web-dev-qa-db-ja.com

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

私はユーザーがアップロードした画像をInstagramに直接投稿する必要があるPHPアプリケーションを構築していますが、クイック検索の後、APIにそのような機能がないことがわかりました:( phpを使用して写真をアップロードする他の方法(AndroidおよびiOS用のアプリを除く)があるかどうかはわかりません。

私もこれを読んで、

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

ありがとうございました

86
Altaf Hussain

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

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

ただし、PCでinstagramをエミュレートできるようです。

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

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

69
Albzi

更新:

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

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

91
Lance

UPDATE可能になりました:

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

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

9
Tom Roggero

この質問を見つけたユーザーについては、iPhoneフックを使用して、iPhoneのinstagram共有フロー(アプリからフィルター画面)に写真を渡すことができます。 http://help.instagram.com/355896521173347 Otherそれよりも、現在、APIのバージョン1には方法がありません。

5
Amru E.

Instagramは、企業が新しいコンテンツ公開ベータエンドポイントを使用して投稿をスケジュールできるようになりました。

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 Edgeを使用して、次のようなコンテナを作成できます。

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 Edgeを使用して公開します。

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

docs からのこの例。

4
Joshua Dance

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

ブルースタックの使用には、重いインストールが必要であり、手動でのみ行う必要があります。

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

  1. chromeを開き、Instagram.comを閲覧します
  2. クロムを右クリックして、要素を検査します。
  3. 開発者ツールの右上のコアナーメニューのドロップダウンから、さらにツールを選択します。
  4. さらにネットワーク条件を選択します。
  5. ネットワーク選択セクションで、ユーザーエージェントという名前の2番目のセクションを参照してください。
  6. 自動的に選択のチェックを外し、指定されたリストからAndroid用クロムを選択しますユーザーエージェント。
  7. Instagram.comページを更新します。

UIの変更と、Instagramに投稿するオプションが表示されます。あなたの人生は今簡単です。見つけられるならもっと簡単な方法を教えてください。

enter image description here

https://www.inteligentcomp.com/2018/11/how-to-upload-to-instagram-from-pc-mac.html について書いた。

2

Concrete Social API を使用している場合はさらに簡単です。画像とビデオの両方を公開できることに注意してください(meda_typeは「image」または「video」のいずれかです)。

curl --request POST \
  --url https://concretesocial.io/1.0/publish \
  --data '{ "caption":"Wonderful",
            "media_type" : "image",
            "media_url" : "https://cdn.pixabay.com/photo/2018/10/28/16/11/landscape-3779159_1280.jpg", 
            "profiles" : ['5c21013a8c93b0050877659d']"}'                    

完全な開示-このAPIを作成しました:)

1
Chris Bovan

APIを使用して写真をinstagramに投稿するAPIはありませんが、Google拡張機能「User Agent」をインストールすると、ブラウザがAndroid mobile chrome versionに変換されます。ここに拡張リンクがあります https://chrome.google.com/webstore/detail/user-agent-switcher/clddifkhlkcojbojppdojfeeikdkgiae?utm_source=chrome-ntp-icon

拡張機能アイコンをクリックし、chromeのAndroidを選択して、Instagram.comを開きます。

0
Waheed Sabir