如何使用 API 发布图片到 Instagram

我正在构建一个 PHP 应用程序,它需要将用户上传的图片直接发布到 Instagram,但在快速搜索之后,我发现在 API 中没有这样的功能: (这感觉很奇怪... 因为他们应该提供一个。我不知道是否还有其他方法(除了 Android 和 iOS 的应用程序)来使用 php 上传图片。如果有可能的话,请告诉我一些情况。

我还看到了这个,

如何使用 PHP 与 Instagram 共享链接和照片

262169 次浏览

如果你阅读了你分享的链接,可以接受的答案是:

你不能通过 API 把照片发到 Instagram 上。

Instagram 现在表示:

现在您可以使用 Instagram 的 API (New)效果从 2021年1月26日!

Https://developers.facebook.com/blog/post/2021/01/26/introducing-instagram-content-publishing-api/

对于发现这个问题的用户,你可以使用 iPhone 挂钩将照片传递到 Instagram 分享流(从你的应用程序到过滤器屏幕) : http://help.instagram.com/355896521173347除此之外,目前在 API 的第一版中没有任何方法。

更新:

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

只要复制粘贴上面的代码在您的文本编辑器,改变相应的几个变量和 VOILA!我写了一个关于这个的 文章,我已经做过很多次了。请参见演示 给你

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-将其列为封闭测试版。

内容发布 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 (假设是1788945560051444) ,然后使用/user/media _ publications 边缘发布它,如下所示:

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

这个例子来自 医生

我尝试使用 IFTTT 和许多其他服务,但都是做事情或从 Instagram 发布到另一个平台,而不是 Instagram。我读了更多,发现 Instagram 目前还没有提供任何这样的 API。

使用蓝色堆栈还是需要大量的安装和手动操作。

但是,你可以使用桌面版的谷歌浏览器在 Instagram 上发帖。需要调整一下。

  1. 打开你的 Chrome 浏览 Instagram.com
  2. 通过右键单击 chrome 来检查元素。
  3. 从右上角的开发工具菜单下拉,选择更多的工具。
  4. 进一步选择网络条件。
  5. 在网络选择部分中,请参见第二部分中命名为用户代理的部分。
  6. 取消选中 自动选择,并从给定的用户代理列表中选择 安卓的 chrome
  7. 刷新你的 Instagram 网页。

你会注意到用户界面的变化,以及在 Instagram 上发布文章的选项。 你的生活现在很轻松。 如果你能找到的话,告诉我一个简单的方法。

enter image description here

我在 https://www.inteligentcomp.com/2018/11/how-to-upload-to-instagram-from-pc-mac.html上写过。

工作截图

enter image description here

没有 API 来张贴照片到 Instagram 使用 API,但有一个简单的方法是,安装谷歌扩展“用户代理”它将隐藏你的浏览器安卓移动铬版本。这是扩展链接 https://chrome.google.com/webstore/detail/user-agent-switcher/clddifkhlkcojbojppdojfeeikdkgiae?utm_source=chrome-ntp-icon

只需点击扩展图标,选择安卓的 chrome,然后打开 Instagram.com

如果它有一个 UI,那么它就有一个“ API”。让我们使用以下示例: 我想发布我在创建的任何新博客文章中使用的图片。我们假设是 WordPress。

  1. 创建一个通过 RSS 持续监控你的博客的服务。
  2. 当一篇新的博文发布后,下载图片。
  3. (可选)使用第三方 API 应用一些覆盖和诸如此类的图片。
  4. 将照片放置在您的电脑或服务器上的一个已知位置。
  5. 配置 Chrome (如上所述) ,以便您可以将浏览器作为移动设备使用。
  6. 使用 Selenium (或任何其他库) ,模拟在 Instagram 上发帖的整个过程。
  7. 成交,你应该收下。

对于任何人谁正在寻找一个解决方案张贴到 Instagram 使用 AWS Lambda木偶师(Chrome-aws-lambda)。注意这个解决方案 只允许你为每个帖子发布一张照片。如果不使用 lambda,只需用 puppeteer替换 chrome-aws-lambda

对于 lambda 的第一次启动,由于 instagram 检测到 “可疑登入尝试”,所以不能正常工作。只要用你的电脑和 批准进入 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 文件夹

更新:

Instagram 现在屏蔽了所有可疑的登录尝试,除非你在每次执行时手动批准。为了解决这个问题,最好将 cookie 保存为 json 并导入到木偶师中。