从媒体ID获取Instagram帖子网址

时间:2014-06-26 18:38:54

标签: api instagram

我手中有 media_id 帖子,我想知道是否有办法从中创建有效的网址。

例如,如果你手上有一个Facebook帖子ID(xxxx_yyyy),你可以从中创建以下网址(http://facebook.com/ xxxx / posts / yyyy < / strong>)并直接访问原始帖子。

有没有办法在Instagram上这样做?掌握了media_id(和user_id),是否可以创建一个帖子网址?

7 个答案:

答案 0 :(得分:4)

我必须实现客户端javascript来解决这个问题,Seano的答案非常宝贵,我很高兴他们提到了BigInteger库的使用,但是我想提供一个使用BigInteger库的完整实现,因为它证明是非常必要的。

我从https://www.npmjs.com/package/big-integer下载了BigInteger库。

这是适合我的功能。

function getInstagramUrlFromMediaId(media_id) {
    var alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
    var shortenedId = '';
    media_id = media_id.substring(0, media_id.indexOf('_'));

    while (media_id > 0) {
        var remainder = bigInt(media_id).mod(64);
        media_id = bigInt(media_id).minus(remainder).divide(64).toString();
        shortenedId = alphabet.charAt(remainder) + shortenedId;
    }

    return 'https://www.instagram.com/p/' + shortenedId + '/';
}

我只想指出在分配重新计算的media_id时使用toString()是非常重要的,值仍然是一个字符串,以确保使用整个数字(在我的情况下,media_id是19个字符长) 。 BigInteger文档还说明了这一点......

  

请注意,大于9007199254740992且小于-9007199254740992的Javascript编号不是精确表示的数字,不会产生精确的结果。如果您正在处理该范围之外的数字,最好传入字符串。

干杯!

答案 1 :(得分:2)

我偶然发现了这个问题,所有的解决方案都很棒,但是没有一个是我经常使用的语言,所以运行代码对我来说是个痛苦。

看到Python无处不在,我移植了@ seano的答案:

def getInstagramUrlFromMediaId(media_id):
    alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'
    shortened_id = ''

    while media_id > 0:
        remainder = media_id % 64
        # dual conversion sign gets the right ID for new posts
        media_id = (media_id - remainder) // 64;
        # remainder should be casted as an integer to avoid a type error. 
        shortened_id = alphabet[int(remainder)] + shortened_id

    return 'https://instagram.com/p/' + shortened_id + '/'

答案 2 :(得分:1)

是的,可以使用media endpoints中的以下端点:

这是一个小型的PHP脚本,它将根据media_iduser_id获取链接:

$media_id = 'media_id';
$user_id = 'user_id';
$client_id = 'instagram_client_id';
$client_secret = 'instagram_client_secret';
$url = "https://api.instagram.com/v1/media/{$media_id}_{$user_id}?client_id=$client_id&client_secret=$client_secret";
$response = file_get_contents($url);
$response = json_decode($response);
if (is_object($response)) {
  $link_to_media = $response->data->link;
}

在上面的示例中,您应该将media_iduser_idclient_idclient_secret替换为适当的值。您还应该能够使用access_token代替client_idclient_secret,如本例所示。

<强>参考

Media Endpoints

答案 3 :(得分:1)

You can also figure it out algorithmically. It can be done in any language, but here is a way via MySQL function:

DROP FUNCTION IF EXISTS url_fragment

DELIMITER |

CREATE FUNCTION url_fragment(PID BIGINT) 
RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN

DECLARE ALPHA CHAR(64);
DECLARE SHORTCODE VARCHAR(255) DEFAULT "";
DECLARE MEDIAID BIGINT;
DECLARE REMAINDER INT;

SET ALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
SET MEDIAID = SUBSTRING_INDEX(PID, "_", 1);


WHILE MEDIAID > 0 DO
    SET REMAINDER = MOD(MEDIAID, 64);
    SET MEDIAID = (MEDIAID - REMAINDER) / 64;
    SET SHORTCODE = CONCAT(SUBSTRING(ALPHA, (REMAINDER + 1), 1), SHORTCODE);
END WHILE;

RETURN SHORTCODE;

END
|
DELIMITER ;

答案 4 :(得分:1)

以下是使用JavaScript从媒体ID派生网址片段的方法:

function getInstagramUrlFromMediaId(media_id) {
    media_id = parseInt(media_id.substring(0, media_id.indexOf('_')));
    var alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
    var shortenedId = '';
    while (media_id > 0) {
        var remainder = modulo(media_id % 64);
        media_id = (media_id - remainder) / 64;
        shortenedId = alphabet.charAt(remainder) + shortenedId;
    }
    return 'https://www.instagram.com/p/' + shortenedId + '/';
}

根据Instagram帖子的年龄,您可能需要使用BigInteger之类的库来处理较大的ID。

您可以在此处找到媒体ID和网址片段之间的编码细分:http://carrot.is/coding/instagram-ids

答案 5 :(得分:0)

instagram API返回“短代码”属性。像这样简单的东西可能适合你。

post.Link = "https://www.instagram.com/p/" + media.shortcode;

答案 6 :(得分:0)

我使用Node附带的BigInt来让Nick的答案。我也避免返回完整的URL,只返回短代码。

function getInstagramShortcodeFromId(media_id) {
  const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
  let shortenedId = '';

  while (media_id > 0) {
    const remainder = BigInt(media_id) % BigInt(64);
    media_id = ((BigInt(media_id) - BigInt(remainder)) / BigInt(64)).toString();
    shortenedId = alphabet.charAt(Number(remainder)) + shortenedId;
  }

  return shortenedId;
}