Skip to content

Instantly share code, notes, and snippets.

@BatuhanK
Created May 20, 2015 10:23
Show Gist options
  • Star 22 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
  • Save BatuhanK/b71d67c5faf1620ea107 to your computer and use it in GitHub Desktop.
Save BatuhanK/b71d67c5faf1620ea107 to your computer and use it in GitHub Desktop.
Instagram photo upload php
<?php
/*
(2014) Main source -> http://lancenewman.me/posting-a-photo-to-instagram-without-a-phone/
I just managed to sniff Instagram traffic and fixed the code
-- Have fun - batuhan.org - Batuhan Katırcı
--- for your questions, comment @ http://batuhan.org/instagram-photo-upload-with-php/
*/
function SendRequest($url, $post, $post_data, $user_agent, $cookies) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://instagram.com/api/v1/'.$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);
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 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";
}
}
}
}
}
}
@kiwina
Copy link

kiwina commented Apr 30, 2016

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

@bladeism
Copy link

bladeism commented May 8, 2016

This is weird I always get Status isn't okay

But in my other account it is doing fine.

@Camerton
Copy link

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

@Aylshamjake
Copy link

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.

@pablodalma93
Copy link

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?

@bazingarj
Copy link

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

@Istanbouly
Copy link

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
Copy link

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.

@ruslanbakanov
Copy link

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

The same situation :(

@Bahhous
Copy link

Bahhous commented Jan 26, 2017

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

@alpaltunel
Copy link

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.

@golddave
Copy link

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

@HusseinAhmed2018
Copy link

code give me Success but its not upload photo

@golddave
Copy link

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": "https://i.instagram.com/challenge/2157728006/2TQPdErb7M/", "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
Copy link

ZYSHAQ commented Feb 8, 2018

Any updates?

@spjoshis
Copy link

Good example! But what if i do not want to use username and password to upload photo? Can i use access token for this?

@enggaraziz
Copy link

any path parameter for upload has change?
i got success but, i'm check on instagram wasn't uploaded.

@mattwood1
Copy link

Is it possible for multiple images at all?

@somosdigitalmentegsm
Copy link

somosdigitalmentegsm commented Jun 29, 2018

Hola amigo quedo excelente jajajajaja https://amistadigital.com/

@ahmedsalahos
Copy link

Good example! But what if i do not want to use username and password to upload photo? Can i use access token for this?

@555STi
Copy link

555STi commented Jan 11, 2019

What about multiple images?

@dagenius007
Copy link

Returns success but does not upload to instagram.

@mattiachiabrando
Copy link

I'm getting the error "CSRF token missing or incorrect"

@inazeem
Copy link

inazeem commented Jun 7, 2020

Good example! But what if i do not want to use username and password to upload photo? Can i use access token for this?

Have you find any solution to that. I am looking for the same thing. With access token.

@stackprogramer
Copy link

This work yet? for me i couldn't login to instagram

@ankitapandey123
Copy link

ankitapandey123 commented Jan 16, 2021

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

this error i am getting when trying to run this program

please help me how can i resolve this

@hosseinkhalili1989
Copy link

The code can log in but
{"logged_in_user":{"pk":47870071423,"username":"******","full_name":"","is_private":false,"profile_pic_url":"https://instagram.fdtb1-1.fna.fbcdn.net/v/t51.2885-19/4434343435656884218_3457882519_2446069589734326272_n.jpg?_nc_ht=instagram.fdtb1-1.fna.fbcdn.net\u0026_nc_cat=1\u0026_nc_ohc=3-IomJ49GywAX-ISCK3\u0026edm=AL4D0a4BAAAA\u0026ccb=7-4\u0026oh=e1feab6628bc1f793fdfge410333ff61c0190\u0026oe=60B4EF4F\u0026_nc_sid=712cc3\u0026ig_cache_key=YW5vbnltb3VzX3Byb2ZpbGVfcGlj.2-ccb7-4","is_verified":false,"has_anonymous_prof'...

does it work in 2021?

@BatuhanK
Copy link
Author

@my21century2002 probably no, this code snippet is 7 years old :D

Copy link

ghost commented Aug 3, 2021

@HyperEek
Copy link

HyperEek commented Aug 8, 2021

Could not decode the response:
How to fix this error

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