48
47

More than 5 years have passed since last update.

JavaScriptでInstagram投稿を取得(API不要)

Last updated at Posted at 2018-06-16

作成日 : 2018/06/16日
何とかJavaScriptを使って、APIを使わずInstagramの投稿を取得したのでここに書く

※Tag検索表示が出来たのでコメントに載せています。

まず最初に

Instagram APIは企業が取得しようとし
「申請が降りるまで2年たった...」
とまで言わしめたホラーゲームである。(大嘘)

僕も年始めに申請したが、結局現在も許可されるに至っていない。
めっちゃ鬼畜

そんな訳でInstagram APIを使わずインスタの投稿を取得します

下記に書す方法ではJavaScriptだけではなく、PHPとかでも可能だろう

ではquiitta初投稿汚い投稿を見ていってください。

※このプログラムを使用する場合は自己責任でお願いします。
たとえ何かしらの損害が生じても私に責任は無いものとします。

1. ソースを解析する

何とかしてInstagramの投稿を表示できないか考えた時、
「とりあえずソースコードを見ればいいんじゃね」
って事でソースの表示で見て見ました。

が、HTMLの肝心の画像のURLが何一つないのです。

全部をくまなく見て言ったところ、JSと思わしき記述がありました。
スクリーンショット 2018-06-16 19.58.04.png

「これ...Objectじゃね...?」
この中に投稿の画像のリンクが入ってました。大当たりです。

「それじゃあ ajaxでサイトのソース持って来ればいいんじゃないかな」
って事で jquery で 特定ユーザーのソースを引っ張ってきます。

jquery
const UserName = "darpakyokutyou";
$.ajax('https://www.instagram.com/' + UserName + '/', {
  timeout : 2000,
  datatype:'html'
}).then(function(data){
  // dataにはHTMLが入っている
});

これでJSのソースがあるHTMLを引っ張って来れました。
UserNameには取得したいユーザーの名前を入れてください。
@~~~~~ の部分です。

2. ソースからObjectを抜き取る

さて、ソースは抜けたのですが、このままでは使えません。
なのでHTMLからJSの代入を抜き取ります。

正規表現は苦手なのでクソみたいなソースになってます。
そこらへんは「こうしたらいいよ」って言える人は自分で改良してください。

※当初はevalを使ってましたが、流石に仕事で使えなかったので調べていたら
JSON.parse なるものがありました。もう可愛いですね

jquery
const UserName = "darpakyokutyou";
$.ajax('https://www.instagram.com/' + UserName + '/', {
  timeout : 2000,
  datatype:'html'
}).then(function(data){
  // dataにはHTMLが入っている
  // 代入しているobjectだけ切り取っている
  json_string = data.split("window._sharedData = ")[1];
  json_string = json_string.split("};</script>")[0] + "}";
  // stringのJSON を Object に変換する
  this.Arrya_data = JSON.parse(json_string);

});

はい。これでインスタの投稿データが this.Arrya_data の中にObjectとして入ってます。

投稿された画像のURLはこの中に入ってます。

jquery
let url = this.Arrya_data.entry_data.ProfilePage[0].graphql.user.edge_owner_to_timeline_media.edges[].node.display_url;

この前仕様変更され〜12件まで取得できるはずです。
前は9件まででした。

まとめ

jquery
$(function () {
    try {
        this.name = "darpakyokutyou";
        $.ajax('https://www.instagram.com/' + this.name + '/', {
            timeout: 2000,
            datatype: 'html'
        }).then(function (data) {
            json_string = data.split("window._sharedData = ")[1];
            json_string = json_string.split("};</script>")[0] + "}";
            this.Arrya_data = JSON.parse(json_string);
            let datas = this.Arrya_data.entry_data.ProfilePage[0].graphql.user.edge_owner_to_timeline_media.edges;
            for (i in datas) {
                url = datas[i].node.display_url;
                console.log(url);
            }
        });
    } catch (error) {
        alert(error);
    }
})

スクリーンショット 2018-06-16 21.14.12.png

1個目
2個目
3個目

2018/06/18日 追記

Bootstrap4を使えば綺麗にサイトに出力できます
スクリーンショット 2018-06-18 21.03.37.png

jquery
/* instagram */
$(function () {
    try {
        this.name = "bridalnewspaper";
        $.ajax('https://www.instagram.com/' + this.name + '/', {
            timeout: 2000,
            datatype: 'html'
        }).then(function (data) {
            json_string = data.split("window._sharedData = ")[1];
            json_string = json_string.split("};</script>")[0] + "}";
            this.Arrya_data = JSON.parse(json_string);
            let datas = this.Arrya_data.entry_data.ProfilePage[0].graphql.user.edge_owner_to_timeline_media.edges;
            for (i in datas) {
                url = datas[i].node.display_url;
                this.html = `
                <div class="card">
                    <img src="${url}" class="card-img-top" />
                </div>
                `;
                $(".insta-card").append(this.html);
            }
        });
    } catch (error) {
        alert(error);
    }
})
html
<div class="container">
    <div class="row">
        <div class="col-12">
            <div class="card-columns insta-card">
            </div>
        </div>
    </div>
</div>
48
47
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48
47