Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
Instagram photo upload php
(2014) Main source ->
I just managed to sniff Instagram traffic and fixed the code
-- Have fun - - Batuhan Katırcı
--- for your questions, comment @
function SendRequest($url, $post, $post_data, $user_agent, $cookies) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, ''.$url);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
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);
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 GenerateSignature($data) {
return hash_hmac('sha256', $data, '25eace5393646842f0d0c3fb2ac7d3cfa15c052436ee86b5406a8433f54d24a5');
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 = '';
$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 = '400x400.jpg';
// Set the caption for the photo
$caption = "Testcaption";
// Define the user agent
$agent = 'Instagram 6.21.2 Android (19/4.4.2; 480dpi; 1152x1920; Meizu; MX4; mx4; mt6595; en_US)';
// 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=6';
$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";

amieiro commented Aug 26, 2015

I have forked this ( because there is a problem if the PHP version >= 5.6, because the default CURLOPT_SAFE_UPLOAD value in the curl_setopt() function has change from false to true.
Github doesn't support Gist pull requests. Can you change the Gist?
Thank you.

As of today, i have been able to make this work by updating CURLOPT_URL to:
curl_setopt($ch, CURLOPT_URL, ''.$url);

keep giving me this error
Parse error: syntax error, unexpected T_ELSE in instagram-photo-upload-batuhanorg.php on line 135

It works ))
Need to update url to i.instagram
@blackstalk Good job dude!

Good afternoon, I wonder if anyone post video on instagram

it gives success respond but no photo uploaded ?

Its workig thanks

ibasaw commented Apr 14, 2016

array(2) { [0]=> int(200) [1]=> string(84) "{"status":"ok","errors":{"error":["Sorry, there was a problem with your request."]}}" } Status isn't okay

kiwina commented Apr 30, 2016

'photo' => new CURLFile($filename) FOR php 5.6+

bladeism commented May 8, 2016

This is weird I always get Status isn't okay

But in my other account it is doing fine.

it shows answer that invalid domain! Does it work now?

For those of you using php version 5.6 or higher, you will need the following to make the uploader work.

curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);

This is because in versions 5.5 and lower, this is set to false by default... Hope it helps.

Hi, it's not working for me, it says "{"status": "fail", "message": "Please update your Instagram app to continue posting photos"}" } , it's failing in this line specifically $conf = SendRequest('media/configure/', true, $new_data, $agent, true);

what it could be?

Array ( [0] => 400 [1] => {"status": "fail", "message": "login_required"} ) Status isn't okay

am using php 7 and its not working for me I already change the CURLOPT_SAFE_UPLOAD to false but still not working it gives me these errors please help

Warning: curl_setopt(): Disabling safe uploads is no longer supported in D:\xammp\htdocs\instagram\index.php on line 19

Notice: Undefined variable: body in D:\xammp\htdocs\instagram\index.php on line 89
Could not decode the response:

mukeshmit commented Jan 14, 2017

i am using php 7 and in response getting ,
Array ( [0] => 400 [1] => {"message": "Your version of Instagram is out of date. Please upgrade your app to log in to Instagram.", "status": "fail", "error_type": "needs_upgrade"} )

what i should do for this,please suggest.

Array ( [0] => 400 [1] => {"status": "fail", "message": "login_required"} ) Status isn't okay

The same situation :(

Bahhous commented Jan 26, 2017

when i send the post all wath i got is : "Array ( [0] => 0 [1] => ) "
any help

I used the original code but the Instagram banned my account. If you want to use this code create a fake account and try. its best to save guid to a location and send it everytime you send the photo.

I've been using this for a while but recently it started failing with a "Status isn't okay" message. Any thoughts?

code give me Success but its not upload photo

golddave commented Jan 9, 2018

I've added some debug code to my PHP and I see where the error is now. When the script tries to log in I'm getting the following response from the API:
{"message": "checkpoint_required", "checkpoint_url": "", "lock": true, "status": "fail", "error_type": "checkpoint_challenge_required"}

I can get past this error by spoofing my IP address in the curl statement but then I get an empty response.

ZYSHAQ commented Feb 8, 2018

Any updates?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment