Cách đăng ảnh lên instagram bằng API


108

Tôi đang xây dựng một ứng dụng php cần đăng trực tiếp hình ảnh đã tải lên của người dùng lên Instagram, nhưng sau khi tìm kiếm nhanh, tôi thấy rằng không có chức năng nào như vậy trong API :( và cảm thấy kỳ lạ ... vì họ nên cung cấp một chức năng. Tôi không chắc liệu có cách nào khác (ngoại trừ các ứng dụng cho android và iOS) để tải ảnh lên bằng php hay không. Vui lòng cho tôi bất kỳ ý kiến ​​nào nếu có khả năng.

Tôi cũng đọc cái này,

Làm cách nào để chia sẻ liên kết và ảnh với Instagram bằng PHP


2
Không thể đăng ảnh lên Instagram thông qua API.
Amal Murali

3
Tôi tự hỏi làm thế nào họ - blog.hootsuite.com/schedule-instagram-posts-in-hootsuite - làm điều đó ... (thông báo blog đã được đăng 8 giờ trước)
Mars Robertson

1
@MichalStefanow Tôi cũng nghĩ đây là một câu hỏi hay. Thông báo trên blog đó cũng có một bình luận từ Hootsuite (trong phần bình luận bên dưới bài viết) rằng không có bài đăng trực tiếp thực sự lên Instagram do giới hạn API và bài đăng cuối cùng không phải được thực hiện trên Instagram.
thecommonthread

Còn giữa năm 2019 thì sao? Có thay đổi nào không?
userlond

Câu trả lời:


81

Nếu bạn đọc liên kết bạn đã chia sẻ, câu trả lời được chấp nhận là:

Bạn không thể đăng ảnh lên Instagram thông qua API.

Có vẻ như bạn có thể mô phỏng instagram trên PC.

Bluestacks là một trình giả lập cho phép bạn chạy các ứng dụng Android trên PC / Mac, v.v.

Tôi không chắc nó hoạt động tốt như thế nào.


58
Chà nếu KHÔNG có cách nào để làm điều đó, thì tôi không cho rằng có một cách 'khác'.
Albzi

1
@bart tại thời điểm đăng @Ritu, nó đã làm được trên instagram và thì posts.sokhôngpostso.com
Albzi

2
@usama rất tiếc không phải là chính thức nhưng tôi đã nghe tin đồn rằng nếu bạn truy cập trang web của họ và chia tỷ lệ nó xuống chế độ xem trên thiết bị di động thì bạn có thể. Tuy nhiên, không tự mình thử
Albzi

1
@Albzi Nếu bạn sử dụng Google Chrome; vào trang web Instagram và nhấp chuột phải và sử dụng "Kiểm tra", nó sẽ thay đổi kích thước và thay đổi tiêu đề thành chữ ký trình duyệt di động cho phép. Bạn có thể phải làm mới trang Instagram một lần trong "Kiểm tra" nhưng nó sẽ cho phép bạn sử dụng trang web như một thiết bị di động và có thể đăng ảnh và những gì không. Tuy nhiên; điều này không giúp ích cho câu hỏi API. Tôi rất muốn có thể đăng một bức ảnh từ PHP lên Instagram cho thấy điểm số chung cuộc của các đội.
Dawson Irvine

1
Điểm công bằng. @BrodaNoel, có lẽ tôi nên thay đổi điều đó thành không có cách 'chính thức'.
Albzi

102

Cập nhật:

Instagram hiện đang cấm các tài khoản và xóa các hình ảnh dựa trên phương pháp này. Vui lòng sử dụng một cách thận trọng.


Có vẻ như tất cả những người đã trả lời câu hỏi này với một cái gì đó dọc theo dòng it can't be donelà phần nào chính xác. Chính thức, bạn không thể đăng ảnh lên Instagram bằng API của họ. Tuy nhiên, nếu bạn thiết kế ngược API, bạn có thể.

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

Chỉ cần sao chép và dán đoạn mã trên vào trình soạn thảo văn bản của bạn, thay đổi một số biến cho phù hợp và VOILA! Tôi đã viết một bài báo về điều này và tôi đã làm điều đó nhiều lần. Xem bản demo tại đây .


1
Không thể đăng nhập bằng mã trên mà không sử dụng điện thoại. Tôi chỉ sử dụng trong localhost sử dụng máy tính và tôi chỉ nhận được Thông báo lỗi như như **** phản hồi trống đã nhận từ máy chủ trong khi cố gắng đăng nhập *** làm thế nào để giải quyết rằng lỗi
Rabesh Lal Shrestha

1
Đã có một biến thể .net hoạt động được làm bằng mã này chưa? Tôi không thể làm việc với PHP và phiên bản .NET của mã này sẽ thực sự hữu ích!
Yosoyke

1
Tôi đã có thể chạy tập lệnh thành công trên tài khoản Instagram mới.
loretoparisi

2
Nếu bạn nhận được status isnt okay, hãy đảm bảo CURL có quyền tạo tệp cookies.txt. chmod 777 /directorysẽ làm điều này (hãy cẩn thận). Tôi nhận được thông báo thành công từ kịch bản của bạn, nhưng bài đăng không hiển thị trên instagram. Điều này vẫn hoạt động?
kmoney 12

8
Code hoạt động tốt nhưng hướng dẫn và deviceid luôn thay đổi và instagram đã CẤM tài khoản của tôi sau một bài đăng thành công. bức ảnh cũng đã bị xóa.
Alp Altunel

27

CẬP NHẬT Hiện có thể:

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

Content Publishing API là một tập hợp con của các điểm cuối API Đồ thị Instagram cho phép bạn xuất bản các đối tượng phương tiện. Xuất bản đối tượng phương tiện với API này là một quy trình gồm hai bước - trước tiên bạn tạo vùng chứa đối tượng phương tiện, sau đó xuất bản vùng chứa trên Tài khoản doanh nghiệp của bạn.


22
Cần lưu ý rằng "API xuất bản nội dung chỉ đang trong giai đoạn thử nghiệm đóng với Đối tác tiếp thị của Facebook và Đối tác Instagram. Chúng tôi không chấp nhận những người đăng ký mới tại thời điểm này."
William Reed

Điều này có chỉ áp dụng cho tài khoản Doanh nghiệp không?
Suncatcher

Đây là một câu trả lời như thế nào? Không thể, API này chỉ dành cho các đối tác ...
Matej J

1
Nó nói không tìm thấy trang!
Mohamed Imran

12

Instagram hiện cho phép các doanh nghiệp lên lịch cho các bài đăng của họ, sử dụng các điểm cuối mới của Content Publishing Beta.

https://developers.facebook.com/blog/post/2018/01/30/instagram-graph-api-updates/

Tuy nhiên, bài đăng trên blog này - https://business.instagram.com/blog/instagram-api-features-updates - nói rõ rằng họ chỉ mở API đó cho Đối tác tiếp thị Facebook hoặc Đối tác Instagram của họ.

Để bắt đầu lên lịch đăng bài, vui lòng làm việc với một trong các Đối tác tiếp thị trên Facebook hoặc Đối tác Instagram của chúng tôi.

Liên kết này từ Facebook - https://developers.facebook.com/docs/instagram-api/content-publishing - liệt kê nó là bản beta đã đóng.

API xuất bản nội dung chỉ ở phiên bản beta kín với Đối tác tiếp thị của Facebook và Đối tác Instagram. Chúng tôi không chấp nhận ứng viên mới vào lúc này.

Nhưng đây là cách bạn sẽ làm điều đó:

Bạn có một bức ảnh tại ...

https://www.example.com/images/bronz-fonz.jpg

Bạn muốn xuất bản nó với hashtag "#BronzFonz".

Bạn có thể sử dụng /user/mediacạnh để tạo vùng chứa như sau:

POST graph.facebook.com 
  /17841400008460056/media?
    image_url=https%3A%2F%2Fwww.example.com%2Fimages%2Fbronz-fonz.jpg&
    caption=%23BronzFonz

Điều này sẽ trả về một ID vùng chứa (giả sử 17889455560051444), sau đó bạn sẽ xuất bản ID này bằng cách sử dụng cạnh / user / media_publish, như thế này:

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

Ví dụ này từ tài liệu .


Cảm ơn nhưng nơi tôi có thể tạo ứng dụng cho cái này, chúng tôi có thể tạo ứng dụng cho facebook trong khu vực nhà phát triển facebook.
usama

Mã này báo lỗi - "Ứng dụng không có khả năng thực hiện lệnh gọi API này."? Điều này là hoàn toàn phi nghĩa đối với các công ty công nghệ này. Làm thế nào họ có thể yêu cầu sử dụng đến thông qua một số đối tác ưu tiên và không tạo Ứng dụng của riêng chúng tôi.
Amit Khare

8

Tôi đã thử sử dụng IFTTT và nhiều dịch vụ khác nhưng tất cả đều đang thực hiện hoặc đăng từ Instagram sang nền tảng khác không phải Instagram. Tôi đọc thêm thì thấy rằng Instagram hiện không cung cấp bất kỳ API nào như vậy.

Sử dụng ngăn xếp màu xanh một lần nữa liên quan đến việc cài đặt nặng và chỉ làm mọi thứ theo cách thủ công.

Tuy nhiên, bạn có thể sử dụng Google Chrome trên phiên bản dành cho máy tính để bàn để đăng bài trên Instagram. Nó cần một chút tinh chỉnh.

  1. Mở chrome của bạn và duyệt qua Instagram.com
  2. Đi đến phần tử kiểm tra bằng cách nhấp chuột phải vào chrome.
  3. Từ menu corener trên cùng bên phải, thả xuống các công cụ dành cho nhà phát triển, hãy chọn thêm công cụ.
  4. Chọn thêm các điều kiện mạng.
  5. Trong phần lựa chọn mạng, hãy xem phần thứ hai có tên tác nhân người dùng.
  6. Bỏ chọn tự động chọn và chọn chrome cho Android từ danh sách tác nhân người dùng nhất định.
  7. Làm mới trang Instagram.com của bạn.

Bạn sẽ nhận thấy sự thay đổi về giao diện người dùng và tùy chọn đăng bài trên Instagram. Cuộc sống của bạn bây giờ thật dễ dàng. Hãy cho tôi biết một cách dễ dàng hơn nếu bạn có thể tìm thấy bất kỳ điều gì.

nhập mô tả hình ảnh ở đây

Tôi đã viết trên https://www.inteligentcomp.com/2018/11/how-to-upload-to-instagram-from-pc-mac.html về nó.

Ảnh chụp màn hình làm việc

nhập mô tả hình ảnh ở đây


Nhưng bạn không thể đăng bất cứ điều gì.
Aarvy

1
Tôi vừa đăng bằng cách sử dụng cùng một phương pháp. Nó hoạt động hoàn toàn tốt. Xem ảnh chụp màn hình trong bản cập nhật.
Dheeraj Thedijje

5

Đối với những người dùng tìm thấy câu hỏi này, bạn có thể chuyển ảnh vào luồng chia sẻ instagram (từ ứng dụng của bạn đến màn hình bộ lọc) trên iPhone bằng cách sử dụng móc nối iPhone: http://help.instagram.com/355896521173347 Ngoài ra, hiện không có trong phiên bản 1 của api.


1
@Ritu thú vị. Khi đó chắc hẳn là có thể, nhưng có vẻ như API không cho phép điều đó. Cảm ơn vì đã chia sẻ, tôi muốn xem xét nó.
Amru E.

1
Tôi cũng tự hỏi họ đang làm như thế nào, hãy chia sẻ nếu bạn nhận được điều gì đó phù hợp.
Ritu

2
Có vẻ như hầu hết các ứng dụng khách trái phép đang thiết kế ngược API bằng cách giải mã và giám sát lưu lượng SSL từ ứng dụng đến máy chủ. Đây là trường hợp của Snapchat, ít nhất. Có thể giống nhau ở đây.
Amru E.

Máng App cho Mac cũng viết để thức ăn của bạn
Joshua - Pendo

0

Không có API để đăng ảnh lên instagram bằng API, Nhưng có một cách đơn giản là cài đặt tiện ích mở rộng google "User Agent" nó sẽ đưa trình duyệt của bạn chuyển sang phiên bản chrome dành cho thiết bị di động android. Đây là liên kết tiện ích mở rộng https://chrome.google.com/webstore/detail/user-agent-switcher/clddifkhlkcojbojppdojfeeikdkgiae?utm_source=chrome-ntp-icon

chỉ cần nhấp vào biểu tượng tiện ích mở rộng và chọn chrome cho android và mở Instagram.com


0

Nếu nó có giao diện người dùng, nó có "API". Hãy sử dụng ví dụ sau: Tôi muốn xuất bản ảnh tôi sử dụng trong bất kỳ bài đăng blog mới nào mà tôi tạo. Hãy giả sử là Wordpress.

  1. Tạo một dịch vụ liên tục theo dõi blog của bạn qua RSS.
  2. Khi một bài đăng blog mới được đăng, hãy tải xuống hình ảnh.
  3. (Tùy chọn) Sử dụng API của bên thứ ba để áp dụng một số lớp phủ và nội dung không có cho ảnh của bạn.
  4. Đặt ảnh ở một vị trí nổi tiếng trên PC hoặc máy chủ của bạn.
  5. Định cấu hình Chrome (đọc ở trên) để bạn có thể sử dụng trình duyệt này như một thiết bị di động.
  6. Sử dụng Selenium (hoặc bất kỳ thư viện nào khác trong số đó), mô phỏng toàn bộ quá trình đăng bài trên Instagram.
  7. Làm xong. Bạn nên có nó.

0

Đối với bất kỳ ai đang tìm kiếm giải pháp về việc đăng lên Instagram bằng AWS lambdapuppeteer ( chrome-aws-lambda ). Lưu ý rằng giải pháp này chỉ cho phép bạn đăng 1 ảnh cho mỗi bài đăng . Nếu bạn không sử dụng lambda, chỉ cần thay thế chrome-aws-lambdabằng puppeteer.

Đối với lần khởi chạy lambda đầu tiên, thông thường nó sẽ không hoạt động vì instagram phát hiện "Nỗ lực đăng nhập đáng ngờ" . Chỉ cần truy cập trang instagram bằng PC của bạn và phê duyệt nó , mọi thứ sẽ ổn.

Đây là mã của tôi, vui lòng tối ưu hóa nó:

// 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');

nó phải là đường dẫn tệp cục bộ, nếu là url, hãy tải nó xuống thư mục / tmp trước .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.