我在哪里可以找到图像的Instagram媒体ID

时间:2013-05-26 10:28:46

标签: instagram instagram-api

我正在寻找已上传的Instagram图片的MediaID。它应该看起来像

  

1234567894561231236_33215652

我发现最后一组整数是usersID

例如:这是图片的直接链接,但我看不到格式正确的mediaID

http://distilleryimage11.ak.instagram.com/d33aafc8b55d11e2a66b22000a9f09de_7.jpg

虽然这是链接

http://instagram.com/p/Y7GF-5vftL/

我不希望使用API​​,因为我需要所选图像中的MediaID。

16 个答案:

答案 0 :(得分:78)

这是一个更好的方法:

http://api.instagram.com/oembed?url=http://instagram.com/p/Y7GF-5vftL/

渲染为json对象,您可以轻松地从中提取媒体ID ---

例如,在PHP中

$api = file_get_contents("http://api.instagram.com/oembed?url=http://instagram.com/p/Y7‌​GF-5vftL/");      
$apiObj = json_decode($api,true);      
$media_id = $apiObj['media_id'];

例如,在JS

$.ajax({     
    type: 'GET',     
    url: 'http://api.instagram.com/oembed?callback=&url=http://instagram.com/p/Y7GF-5vftL‌​/',     
    cache: false,     
    dataType: 'jsonp',     
    success: function(data) {           
        try{              
            var media_id = data[0].media_id;          
        }catch(err){}   
    } 
});

答案 1 :(得分:15)

所以最受欢迎的" Better Way" 有点折旧,所以这是我的编辑和其他解决方案:

Javascript + jQuery

$.ajax({
    type: 'GET',
    url: 'http://api.instagram.com/oembed?callback=&url='+Url, //You must define 'Url' for yourself
    cache: false,
    dataType: 'json',
    jsonp: false,
    success: function (data) {
       var MediaID = data.media_id;
   }
});

<强> PHP

$your_url = "" //Input your url
$api = file_get_contents("http://api.instagram.com/oembed?callback=&url=" . your_url);      
$media_id = json_decode($api,true)['media_id'];

所以,这只是@ George代码的更新版本,目前正在运行。但是,我做了其他解决方案,有些甚至避免了ajax请求:

对Ajax解决方案进行短代码

某些Instagram网址使用缩短的网址语法。如果请求正确,客户端只需使用短代码代替媒体ID。

示例短代码网址如下所示:https://www.instagram.com/p/Y7GF-5vftL/

Y7GF-5vftL是图片的短代码。

使用Regexp:

var url = "https://www.instagram.com/p/Y7GF-5vftL/"; //Define this yourself
var Key = /p\/(.*?)\/$/.exec(url)[1];

在同一范围内,Key将包含您的短代码。现在请使用此短代码请求低分辨率图片,您可以执行以下操作:

    $.ajax({
        type: "GET",
        dataType: "json",
        url: "https://api.instagram.com/v1/media/shortcode/" + Key + "?access_token=" + access_token, //Define your 'access_token'
        success: function (RawData) {
            var LowResURL = RawData.data.images.low_resolution.url;
        }
    });

返回的RawData结构中还有许多其他有用的信息,包括媒体ID。记录它或查看api文档以查看。

短代码转换解决方案

您可以相当轻松地将短代码转换为ID!这是在javascript中执行此操作的简单方法:

function shortcodeToInstaID(Shortcode) {
      var char;
      var id = 0;
      var alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
      for (var i = 0; i < Shortcode.length; i++) {
          char = Shortcode[i];
          id = (id * 64) + alphabet.indexOf(char);
      }
      return id;
  }

注意:如果您想要一个更强大的node.js解决方案,或者想要了解如何将其转换回来,请查看@Slang&#39; module on npm

整页解决方案

那么,如果您拥有完整Instagram页面的URL,例如:https://www.instagram.com/p/BAYYJBwi0Tssh605CJP2bmSuRpm_Jt7V_S8q9A0/

,那该怎么办?

好吧,您实际上可以阅读HTML以查找包含媒体ID的元属性。您还可以在URL本身上执行其他几种算法来获取它,但我认为这需要付出太多努力,因此我们会保持简单。 query the meta tag al:ios:url或迭代html。由于阅读元标记已全部发布,我将向您展示如何迭代。

注意:这有点不稳定,容易被修补。此方法不适用于使用预览框的页面。因此,如果您在某个人的个人资料中点击图片时给它当前的HTML,这将会中断并返回错误的媒体ID。

function getMediaId(HTML_String) {
  var MediaID = "";
  var e = HTML_String.indexOf("al:ios:url") + 42; //HTML_String is a variable that contains all of the HTML text as a string for the current document. There are many different ways to retrieve this so look one up. 
  for (var i = e; i <= e + 100; i++) { //100 should never come close to being reached
      if (request.source.charAt(i) == "\"")
         break;
      MediaID += request.source.charAt(i);
  }
  return MediaID;
}

然后你去了,使用Instagram的api获取媒体ID的一系列不同方法。希望能解决你的困境。

答案 2 :(得分:13)

这是甚至更好的方法:

没有API调用!我将media_id转换为shortcode作为额外奖励。

基于slang's amazing work来确定转换。 Nathan's work将base10转换为php中的base64。并rgbflawed's work将其转换回另一种方式(使用修改过的字母表)。 #teameffort

function mediaid_to_shortcode($mediaid){

    if(strpos($mediaid, '_') !== false){
        $pieces = explode('_', $mediaid);
        $mediaid = $pieces[0];
        $userid = $pieces[1];
    }

    $alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
    $shortcode = '';
    while($mediaid > 0){
        $remainder = $mediaid % 64;
        $mediaid = ($mediaid-$remainder) / 64;
        $shortcode = $alphabet{$remainder} . $shortcode;
    };

    return $shortcode;

}

function shortcode_to_mediaid($shortcode){

    $alphabet='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';

    $mediaid = 0;

    foreach(str_split($shortcode) as $letter) {
        $mediaid = ($mediaid*64) + strpos($alphabet, $letter);
    }

    return $mediaid;

}

答案 3 :(得分:11)

您实际上可以使用我在此处编写的方法http://carrot.is/coding/instagram-ids从算法上从链接的最后一段派生MediaId。它通过按字符代码映射URL段来实现。将id转换为base 64号码。

例如,根据您提到的链接(http://instagram.com/p/Y7GF-5vftL),我们会得到最后一段(Y7GF-5vftL),然后使用base64 url-safe alphabet将其映射为字符代码(24:59:6:5:62:57:47:31:45:11_64 })。接下来,我们将此base64数字转换为base10(448979387270691659)。

如果您在_之后附加userId,则会在您指定的表单中获得完整ID,但由于MediaId在没有userId的情况下是唯一的,因此您实际上可以从大多数请求中省略userId。

最后,我创建了一个名为instagram-id-to-url-segment的Node.js模块来自动执行此转换:

convert = require('instagram-id-to-url-segment');
instagramIdToUrlSegment = convert.instagramIdToUrlSegment;
urlSegmentToInstagramId = convert.urlSegmentToInstagramId;

instagramIdToUrlSegment('448979387270691659'); // Y7GF-5vftL
urlSegmentToInstagramId('Y7GF-5vftL'); // 448979387270691659

答案 4 :(得分:8)

尝试此问题的解决方案: How can I get an direct Instagram link from a twitter entity?

  

您可以通过将/ media /附加到网址来获取图片。使用

     
    

您甚至可以指定尺寸

  
     

t(缩略图),m(中),l(大)中的一个。默认为m。

     

所以对于缩略图:http://instagr.am/p/QC8hWKL_4K/media/?size=t

答案 5 :(得分:6)

您的媒体ID是:448979387270691659_45818965 这是如何获得它。

  1. 转到instgram.com/username。
  2. 点击您想要ID的照片。
  3. (Chrome说明)右键点击照片(应该是弹出图片)
  4. 检查元素
  5. 搜索所选文字,您会看到类似photo448979387270691659_45818965
  6. 的内容

    应该有你的带照片的身份证明。

    出于某种原因,这似乎只适用于弹出窗口,而不是实际的图片网址。

答案 6 :(得分:4)

这是python解决方案,无需api调用即可完成此操作。

def media_id_to_code(media_id):
    alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'
    short_code = ''
    while media_id > 0:
        remainder = media_id % 64
        media_id = (media_id-remainder)/64
        short_code = alphabet[remainder] + short_code
    return short_code


def code_to_media_id(short_code):
    alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'
    media_id = 0;
    for letter in short_code:
        media_id = (media_id*64) + alphabet.index(letter)

    return media_id

答案 7 :(得分:3)

在纯JS中(假设您的浏览器可以处理XHR,每个主要浏览器[包括IE&gt; 6]都可以):

function igurlretrieve(url) {

  var urldsrc = "http://api.instagram.com/oembed?url=" + url;

  //fetch data from URL data source
  var x = new XMLHttpRequest();
  x.open('GET', urldsrc, true);
  x.send();

  //load resulting JSON data as JS object
  var urldata = JSON.parse(x.responseText);

  //reconstruct data as "instagram://" URL that can be opened in iOS app
  var reconsturl = "instagram://media?id=" + urldata.media_id;
  return reconsturl;

}

如果这是你的目标 - 只需打开Instagram iOS应用程序中的页面,这正是它的意义 - 这应该做,特别是如果你不想忍受许可费用。

答案 8 :(得分:2)

如果在Instagram公共URL的末尾添加 ?__a=1 ,则会以JSON格式获取公共URL的数据。

对于帖子URL中图像的media ID,只需在帖子URL中添加JSON请求代码:

http://instagram.com/p/Y7GF-5vftL/?__a=1

响应如下所示。您可以通过回复中的"id"参数轻松恢复图像ID ...

{
"graphql": {
"shortcode_media": {
"__typename": "GraphImage",
"id": "448979387270691659",
"shortcode": "Y7GF-5vftL",
"dimensions": {
"height": 612,
"width": 612
},
"gating_info": null,
"fact_check_information": null,
"media_preview": null,
"display_url": "https://scontent-cdt1-1.cdninstagram.com/vp/6d4156d11e92ea1731377ef53324ce28/5E4D451A/t51.2885-15/e15/11324452_400723196800905_116356150_n.jpg?_nc_ht=scontent-cdt1-1.cdninstagram.com&_nc_cat=109",
"display_resources": [

答案 9 :(得分:0)

您可以使用Instagram中的短代码媒体API。如果你使用php,你可以使用以下代码从图像的URL获取短代码:

$matches = [];

preg_match('/instagram\.com\/p\/([^\/]*)/i', $url, $matches);

if (count($matches) > 1) {
    $shortcode = $matches[1];
}

然后使用您的访问令牌向API发送请求(将ACCESS-TOKEN替换为您的令牌)

$apiUrl = sprintf("https://api.instagram.com/v1/media/shortcode/%s?access_token=ACCESS-TOKEN", $shortcode);

答案 10 :(得分:0)

修改

iOS Instagram应用程序现已注册在Instagram应用程序中打开的常规http链接,不再需要这种深层链接方法。

<强>旧

Swift 4短代码解析解决方案

private static func instagramDeepLinkFromHTTPLink(_ link: String) -> String? {
    guard let shortcode = link.components(separatedBy: "/").last else { return nil }

    // algorithm from https://stackoverflow.com/a/37246231/337934
    let alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
    var mediaId: Int = 0
    for (_, char) in shortcode.enumerated() {
        guard let index = alphabet.index(of: char) else { continue }
        mediaId = (mediaId * 64) + index.encodedOffset
    }

    return "instagram://media?id=\(mediaId)"
}

答案 11 :(得分:0)

您可以在Python中实现的相同内容

import requests,json

def get_media_id(media_url):
   url = 'https://api.instagram.com/oembed/?callback=&url=' + media_url
   response = requests.get(url).json()
   print(response['media_id'])

get_media_id('MEDIA_URL')

答案 12 :(得分:0)

一段时间以来,我不得不经常自己提取Media ID,因此我编写了自己的脚本(很可能是基于此处的一些示例)。与我经常使用的其他小脚本一起,我开始将它们上传到www.findinstaid.com,以方便自己访问。

我添加了以下选项:输入用户名以获取最近12条帖子的媒体ID,或输入URL以获取特定帖子的媒体ID。

如果方便的话,每个人都可以使用该链接(我在网站上没有任何添加或任何其他货币利益-我在“审核”标签上仅具有指向www.auditninja.io的推荐链接既拥有,但在此网站上,没有任何利益或金钱利益-只是爱好项目)。

答案 13 :(得分:0)

Instagram已在2019年末弃用其旧版API以支持Basic Display API

基本显示API 中,您应该使用以下API端点来获取媒体ID 。您需要提供有效的访问令牌

https://graph.instagram.com/me/media?fields=id,caption&access_token={access-token}

您可以在此处阅读如何配置测试帐户并在Facebook developer portal上生成访问令牌

Here是另一篇文章,还介绍了如何获取访问令牌。

答案 14 :(得分:0)

<块引用>
  1. Instagram 媒体 ID 到简码

  2. Instagram 短代码到媒体 ID

var bigint = require( 'big-integer' )

var lower = 'abcdefghijklmnopqrstuvwxyz';
var upper = lower.toUpperCase();
var numbers = '0123456789'
var ig_alphabet =  upper + lower + numbers + '-_'
var bigint_alphabet = numbers + lower

function toShortcode( longid )
{
var o = bigint( longid ).toString( 64 )
return o.replace(/<(\d+)>|(\w)/g, (m,m1,m2) =>
{
    return ig_alphabet.charAt( ( m1 )
      ? parseInt( m1 ) 
      : bigint_alphabet.indexOf( m2 ) )
    });
}

function fromShortcode( shortcode )
{
    var o = shortcode.replace( /\S/g, m =>
    {
    var c = ig_alphabet.indexOf( m )
    var b = bigint_alphabet.charAt( c ) 
    return ( b != "" ) ? b : `<${c}>`
    } ) 
    return bigint( o, 64 ).toString( 10 )
}
toShortcode(  '908540701891980503' ) // s.b. 'ybyPRoQWzX'
fromShortcode( 'ybyPRoQWzX' ) // s.b. '908540701891980503'

答案 15 :(得分:-2)

右键单击照片,然后在新选项卡/窗口中打开。右键单击inspect element。搜索:

  

的Instagram://介质ID =

这会给你:

  

instagram:// media?id = ############# /// ID

来自

的完整id构造

photoID_userID

要获取用户ID,请搜索:

  

instapp:owner_user_id 将在content =