当我反向工程它的视频ID生成器时,我在youtube中发现了一些错误。如果我更改了视频ID的最后一个字符,它将重定向到同一视频。这怎么可能?
例:
https://www.youtube.com/watch?v=9bZkp7q19f0
https://www.youtube.com/watch?v=9bZkp7q19f1
https://www.youtube.com/watch?v=9bZkp7q19f2
https://www.youtube.com/watch?v=9bZkp7q19f3
但是此网址不起作用:
https://www.youtube.com/watch?v=9bZkp7q19f4
最佳答案
videoId是8字节(64位)base64编码的。从this post:
For the videoId, it is an 8-byte (64-bit) integer. Applying Base64-encoding to 8 bytes of data requires 11 characters. However, since each Base64 character conveys exactly 6 bits, this allocation could actually hold up to 11 × 6 = 66 bits--a surplus of 2 bits over what our payload needs. The excess bits are set to zero, which has the effect of excluding certain characters from ever appearing in the last position of the encoded string. In particular, the videoId will always end with one of the following: { A, E, I, M, Q, U, Y, c, g, k, o, s, w, 0, 4, 8 }
就您而言,您的videoId为
9bZkp7q19f0
:enc. | 9 b Z k p 7 q 1 9 f | 0
value | 61 27 25 36 41 59 42 53 61 31 | 52
bin. | 111101 011011 011001 100100 101001 111011 101010 110101 111101 011111 | 1101 00
如果您修改了最后一个字符,则如果修改了最高4位(MSB),则64位ID将发生变化:
9bZkp7q19f1:
enc. | 9 b Z k p 7 q 1 9 f | 1
value | 61 27 25 36 41 59 42 53 61 31 | 53
bin. | 111101 011011 011001 100100 101001 111011 101010 110101 111101 011111 | 1101 01
9bZkp7q19f2:
enc. | 9 b Z k p 7 q 1 9 f | 2
value | 61 27 25 36 41 59 42 53 61 31 | 54
bin. | 111101 011011 011001 100100 101001 111011 101010 110101 111101 011111 | 1101 10
9bZkp7q19f3:
enc. | 9 b Z k p 7 q 1 9 f | 3
value | 61 27 25 36 41 59 42 53 61 31 | 55
bin. | 111101 011011 011001 100100 101001 111011 101010 110101 111101 011111 | 1101 11
这将给出不同的视频ID(请注意,最后一个字节的4个MSB会从
1101
修改为1110
):enc. | 9 b Z k p 7 q 1 9 f | 4
value | 61 27 25 36 41 59 42 53 61 31 | 56
bin. | 111101 011011 011001 100100 101001 111011 101010 110101 111101 011111 | 1110 00
9bZkp7q19f4
将提供不同的64位ID。请注意,如果存在这样的id,9bZkp7q19f4
,9bZkp7q19f5
,9bZkp7q19f6
和9bZkp7q19f7
将给出相同的ID。您可以检查base64编码/值here
关于url - 不同的YouTube URL指向同一视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45403510/