【问题标题】:Getting instagram post url from media id从媒体 ID 获取 Instagram 帖子网址
【发布时间】:2020-02-10 16:13:43
【问题描述】:

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

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

有没有办法在 Instagram 上做到这一点?拥有 media_id(和 user_id)在我手中,是否可以创建单个帖子 url?

【问题讨论】:

    标签: api instagram


    【解决方案1】:

    我必须实现客户端 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 数字不是精确表示的数字,也不会产生精确的结果。如果要处理超出该范围的数字,最好传入字符串。

    干杯!

    【讨论】:

      【解决方案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 + '/'
      

      【讨论】:

        【解决方案3】:

        您也可以通过算法计算出来。它可以用任何语言完成,但这里有一种通过 MySQL 函数的方法:

        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 ;
        

        【讨论】:

        • 您需要确保只提供 post_id 而不是 user_id。如果您按照 instagram 提供的默认方式存储 id,则它应该已经采用 'postId_userId' 的形式,这就是使用 SUBSTRING_INDEX(PID, "_", 1) 的原因。
        【解决方案4】:

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

        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 和 url 段之间的编码明细:http://carrot.is/coding/instagram-ids

        【讨论】:

          【解决方案5】:

          instagram API 返回一个“短代码”属性。像这样简单的东西可以为你工作。

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

          【讨论】:

            【解决方案6】:

            是的,这可以使用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

            【讨论】:

              【解决方案7】:

              我使用 Node.js 附带的 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;
              }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2018-09-18
                相关资源
                最近更新 更多