解码Instagram媒体ID?

时间:2015-05-04 18:03:26

标签: instagram instagram-api

有关媒体项目ID的问题。 ID是这种形式:

198319604945554515_31149514

_之后的数字是多少?我可以假设_之前的部分是唯一的吗?

显然只使用GetMedia查询的第一部分。

2 个答案:

答案 0 :(得分:2)

首先你问:

  

_之后的数字是什么?

这是相关媒体ID的用户ID。

  

我可以假设_之前的部分是唯一的吗?

是和否。

我自己一直在尝试使用Instagram API,并对媒体ID格式感到好奇,因此对此问题感到兴奋,并发布了一个答案,以扩展已经发表的评论。

基本上,_之前的部分基于与媒体项本身相关的时间戳;上传或创作我假设。这是基于johnnyg17’s comment - 这是对字符串格式的正确评估 - 并且可以很容易地转换为Unix日期格式。

也就是说,ID唯一真正的“唯一性”来自于_之前的部分以及之后的用户ID。

由于第一部分显然来自时间戳,并且数百万用户一直使用Instagram,因此多个用户上传具有相同时间戳的图像的可能性非常高。它本身不能被认为是“唯一的”,因为只使用该数字用于ID目的可能会遇到ID冲突,这绝对是一个扩展问题。

所以Instagram媒体ID通过将_之前的基于时间戳的项目与其后面的唯一用户ID相结合来解决此问题。该组合是使媒体ID独特的原因。

要证明ID的第一部分确实基于Unix时间戳 - 正如johnnyg17’s comment所解释的那样 - 我使用一些我有权访问的媒体ID在PHP中掀起了这个问题。 “用户ID”当然已更改为123456789以保护隐私。

$test_array = array();

$test_array[] = "1388611234533808001_123456789";
$test_array[] = "1389294690389553994_123456789";
$test_array[] = "1390349053757443491_123456789";
$test_array[] = "1391541737234771515_123456789";
$test_array[] = "1392560455737690245_123456789";
$test_array[] = "1392592260868093320_123456789";

foreach ($test_array as $test_value) {
  $split_string = mb_split('_', $test_value);
  $unix_time = round(($split_string[0]/1000000000000 + 11024476.583915909500)/0.008388608000);
  echo date("F j, Y, h:i:s a", $unix_time);
  echo ' | ';
  echo '<b>Instagram ID String</b>: ' . $split_string[0] . ' | <b>User ID</b>: ' . $split_string[1] . '<br />';
}

运行它会产生以下输出:

November 21, 2016, 02:09:40 pm | Instagram ID String: 1388611234533808001 | User ID: 123456789
November 22, 2016, 12:47:34 pm | Instagram ID String: 1389294690389553994 | User ID: 123456789
November 23, 2016, 11:42:24 pm | Instagram ID String: 1390349053757443491 | User ID: 123456789
November 25, 2016, 03:12:03 pm | Instagram ID String: 1391541737234771515 | User ID: 123456789
November 27, 2016, 12:56:04 am | Instagram ID String: 1392560455737690245 | User ID: 123456789
November 27, 2016, 01:59:15 am | Instagram ID String: 1392592260868093320 | User ID: 123456789

答案 1 :(得分:2)

我认为ID的第一部分是唯一的,除非Instagram决定更改其生成URL的方式,否则ID可能会保持唯一。 Instagram对ID的第一部分进行编码,以确定他们将其称为媒体短代码。然后将其用于任何公共媒体网址的最后一部分:

https://www.instagram.com/p/BkvTIkEDkXs/

以下方法可用于将id的第一部分以64为基数编码为简码。上面媒体的ID为:

1814753326215874028

以下代码:

function idToShortCode($id)
{
  $char_map = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
  $base = strlen($char_map);
  $short = '';
  while($id) {
    $id = ($id - ($r = $id % $base)) / $base;
    $short = $char_map{$r} . $short;
  };
  return $short;
}

时间戳只是他们创建ID的第一部分。当前的ID以五百亿为单位。我的数学可能已经过时,但是我很确定他们可以以每秒10亿的速度创建id,然后再遇到生成id的问题。

因此,除非所有10亿用户都可以同时拍照,否则他们应该很棒!