我手中有 media_id 帖子,我想知道是否有办法从中创建有效的网址。
例如,如果你手上有一个Facebook帖子ID(xxxx_yyyy),你可以从中创建以下网址(http://facebook.com/ xxxx / posts / yyyy < / strong>)并直接访问原始帖子。
有没有办法在Instagram上这样做?掌握了media_id(和user_id),是否可以创建一个帖子网址?
答案 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_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
,如本例所示。
<强>参考强>
答案 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;
}