解码 Instagram 媒体 ID?
Decoding Instagram media IDs?
有关媒体项目 ID 的问题。 ID 的格式为:
198319604945554515_31149514
_
后面的数字是多少?我可以假设 _
之前的部分是唯一的吗?
显然仅使用 GetMedia 查询中的第一部分即可。
首先你问:
What is the number after the _
?
这是相关媒体 ID 的用户 ID。
And can I assume that the part before the _
is unique?
是也不是。
我自己一直在试用 Instagram API 并且对媒体 ID 格式很好奇,所以偶然发现了这个问题并发布了一个答案以扩展已经发表的评论。
基本上,_
之前的部分是基于与媒体项本身相关的时间戳;上传或创建我假设。这是基于——这是对字符串格式的正确评估——并且可以很容易地转换为Unix日期格式。
也就是说,ID唯一真正的“唯一性”来自_
之前的部分以及之后的用户ID的组合。
由于第一部分显然来自时间戳,并且数百万用户一直在使用 Instagram,因此多个用户上传具有相同时间戳的图像的可能性很高。它本身不能被认为是“唯一的”,因为仅将该数字用于 ID 目的可能会遇到 ID 冲突,这绝对是一个缩放问题。
因此,Instagram 媒体 ID 通过将 _
之前基于时间戳的项目与其后的唯一用户 ID 相结合来解决这个问题。该组合使媒体 ID 独一无二。
为了证明 ID 的第一部分确实基于 Unix 时间戳——正如 解释的那样——我在 PHP 中使用了一些我有权访问的媒体 ID 来制作它; “用户 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
我相信 ID 的第一部分是唯一的,并且可能会保持唯一,除非 Instagram 决定更改它们生成 URL 的方式。 Instagram 对 id 的第一部分进行编码以确定他们所谓的媒体短代码。然后在任何 public 媒体的 URL 的最后部分使用:
https://www.instagram.com/p/BkvTIkEDkXs/
以下方法可用于将 id 的第一部分进行 base 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 在 quintillions 中。我的数学可能不对,但我很确定他们可以在 运行 陷入生成 ID 的问题之前以每秒 10 亿个的速度创建 ID。
因此,除非他们的所有 10 亿用户同时都有要拍照的东西,否则他们应该不错!
有关媒体项目 ID 的问题。 ID 的格式为:
198319604945554515_31149514
_
后面的数字是多少?我可以假设 _
之前的部分是唯一的吗?
显然仅使用 GetMedia 查询中的第一部分即可。
首先你问:
What is the number after the
_
?
这是相关媒体 ID 的用户 ID。
And can I assume that the part before the
_
is unique?
是也不是。
我自己一直在试用 Instagram API 并且对媒体 ID 格式很好奇,所以偶然发现了这个问题并发布了一个答案以扩展已经发表的评论。
基本上,_
之前的部分是基于与媒体项本身相关的时间戳;上传或创建我假设。这是基于
也就是说,ID唯一真正的“唯一性”来自_
之前的部分以及之后的用户ID的组合。
由于第一部分显然来自时间戳,并且数百万用户一直在使用 Instagram,因此多个用户上传具有相同时间戳的图像的可能性很高。它本身不能被认为是“唯一的”,因为仅将该数字用于 ID 目的可能会遇到 ID 冲突,这绝对是一个缩放问题。
因此,Instagram 媒体 ID 通过将 _
之前基于时间戳的项目与其后的唯一用户 ID 相结合来解决这个问题。该组合使媒体 ID 独一无二。
为了证明 ID 的第一部分确实基于 Unix 时间戳——正如 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
我相信 ID 的第一部分是唯一的,并且可能会保持唯一,除非 Instagram 决定更改它们生成 URL 的方式。 Instagram 对 id 的第一部分进行编码以确定他们所谓的媒体短代码。然后在任何 public 媒体的 URL 的最后部分使用:
https://www.instagram.com/p/BkvTIkEDkXs/
以下方法可用于将 id 的第一部分进行 base 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 在 quintillions 中。我的数学可能不对,但我很确定他们可以在 运行 陷入生成 ID 的问题之前以每秒 10 亿个的速度创建 ID。
因此,除非他们的所有 10 亿用户同时都有要拍照的东西,否则他们应该不错!