【发布时间】:2020-02-10 16:13:43
【问题描述】:
我手中有帖子 media_id,我想知道是否有办法从中创建有效的网址。
例如,如果您手上有一个 Facebook 帖子 ID (xxxx_yyyy),您可以从中创建以下网址 (http://facebook.com/xxxx/posts/yyyy) 并直接访问原始帖子。
有没有办法在 Instagram 上做到这一点?拥有 media_id(和 user_id)在我手中,是否可以创建单个帖子 url?
【问题讨论】:
我手中有帖子 media_id,我想知道是否有办法从中创建有效的网址。
例如,如果您手上有一个 Facebook 帖子 ID (xxxx_yyyy),您可以从中创建以下网址 (http://facebook.com/xxxx/posts/yyyy) 并直接访问原始帖子。
有没有办法在 Instagram 上做到这一点?拥有 media_id(和 user_id)在我手中,是否可以创建单个帖子 url?
【问题讨论】:
我必须实现客户端 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 数字不是精确表示的数字,也不会产生精确的结果。如果要处理超出该范围的数字,最好传入字符串。
干杯!
【讨论】:
我只是偶然发现了这个问题,所有的解决方案都很棒,但没有一个是我经常使用的语言,所以运行代码对我来说会很痛苦。
看到 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 + '/'
【讨论】:
您也可以通过算法计算出来。它可以用任何语言完成,但这里有一种通过 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 ;
【讨论】:
以下是使用 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
【讨论】:
instagram API 返回一个“短代码”属性。像这样简单的东西可以为你工作。
post.Link = "https://www.instagram.com/p/" + media.shortcode;
【讨论】:
是的,这可以使用media endpoints 之一的以下端点:
这是一个小的 php 脚本,它将根据 media_id 和 user_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_id、user_id、client_id、client_secret 替换为相应的值。您还应该能够使用access_token 代替client_id 和client_secret,如本例所示。
参考文献
【讨论】:
我使用 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;
}
【讨论】: