ユーザーがアップロードした写真をInstagramに直接投稿する必要のあるphpアプリケーションを構築していますが、簡単な検索の結果、APIにそのような関数がないことがわかりました:(そしてそれは奇妙に感じます... phpを使用して画像をアップロードする他の方法(androidとiOSのアプリを除く)があるかどうかはわかりませんが、可能であれば、どんな種類のアイデアでも教えてください。
私もこれを読みました、
ユーザーがアップロードした写真をInstagramに直接投稿する必要のあるphpアプリケーションを構築していますが、簡単な検索の結果、APIにそのような関数がないことがわかりました:(そしてそれは奇妙に感じます... phpを使用して画像をアップロードする他の方法(androidとiOSのアプリを除く)があるかどうかはわかりませんが、可能であれば、どんな種類のアイデアでも教えてください。
私もこれを読みました、
回答:
共有したリンクを読んだ場合、受け入れられる答えは次のとおりです。
API経由でInstagramに写真を投稿することはできません。
PCでInstagramをエミュレートできるようです。
Bluestacksは、PC / MacなどでAndroidアプリを実行できるエミュレータです。
それがどれだけうまく機能するかはわかりません。
posts.so
ませんでしたpostso.com
更新:
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";
}
}
}
}
}
}
上記のコードをコピーしてテキストエディターに貼り付け、それに応じていくつかの変数を変更してください。私はこれについて記事を書いて、それを何度もやった。こちらのデモをご覧ください。
status isnt okay
、CURLにcookies.txtファイルを作成する権限があることを確認してください。chmod 777 /directory
これを行います(注意してください)。スクリプトから成功メッセージを受け取りましたが、投稿がInstagramに表示されていません。これはまだ機能しますか?
更新 今では可能です:
https://developers.facebook.com/docs/instagram-api/content-publishing
Content Publishing APIは、メディアオブジェクトを公開できるInstagram Graph APIエンドポイントのサブセットです。このAPIを使用したメディアオブジェクトの公開は、2つのステップのプロセスです。最初にメディアオブジェクトコンテナーを作成し、次にコンテナーをビジネスアカウントに公開します。
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からのこの例。
私はIFTTTや他の多くのサービスを使用してみましたが、すべてがInstagramから別のプラットフォームにInstagramから何かを投稿したり投稿したりしていました。Instagramが現時点でそのようなAPIを提供していないことを確認しました。
ブルースタックを使用する場合も、重いインストールと手動でのみ行う必要があります。
ただし、デスクトップ版のGoogle Chromeを使用してInstagramに投稿することができます。少し調整が必要です。
UIが変更され、Instagramに投稿するオプションが表示されます。あなたの人生は今簡単です。見つけられるなら、もっと簡単な方法を教えてください。
私はそれについてhttps://www.inteligentcomp.com/2018/11/how-to-upload-to-instagram-from-pc-mac.htmlに書いた。
作業中のスクリーンショット
この質問を見つけるユーザーのために、あなたはiPhoneを使ってiPhone上で(あなたのアプリからフィルタ画面へ)Instagramの共有流れに写真を渡すことができますフック:http://help.instagram.com/355896521173347はそれ以外、何も今のところありませんAPIのバージョン1の方法。
APIを使用してInstagramに写真を投稿するためのAPIはありませんが、Google拡張機能「ユーザーエージェント」をインストールして、ブラウザーをAndroidモバイルクロムバージョンに変換するという簡単な方法があります。拡張リンクはこちらhttps://chrome.google.com/webstore/detail/user-agent-switcher/clddifkhlkcojbojppdojfeeikdkgiae?utm_source=chrome-ntp-icon
拡張機能アイコンをクリックし、AndroidのChromeを選択してInstagram.comを開くだけです
UIがある場合は、「API」があります。次の例を使用してみましょう。自分が作成した新しいブログ投稿で使用する写真を公開します。Wordpressだとしましょう。
AWS lambdaとpuppeteer(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フォルダにダウンロードしてください。