You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
5.1 KiB

  1. #!/usr/bin/env python
  2. # encoding: utf-8
  3. # Generate youtube signature algorithm from test cases
  4. import sys
  5. tests = [
  6. # 93 - vfl79wBKW 2013/07/20
  7. (u"qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[]}|:;?/>.<'`~\"",
  8. u".>/?;:|}][{=+-_)(*&^%$#@!MNBVCXZASDFGHJKLPOIUYTREWQ098765'321mnbvcxzasdfghjklpoiu"),
  9. # 92 - vflQw-fB4 2013/07/17
  10. ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[]}|:;?/>.<'`~\"",
  11. "mrtyuioplkjhgfdsazxcvbnq1234567890QWERTY}IOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[]\"|:;"),
  12. # 91 - vfl79wBKW 2013/07/20 (sporadic)
  13. ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[]}|:;?/>.<'`~",
  14. "/?;:|}][{=+-_)(*&^%$#@!MNBVCXZASDFGHJKLPOIUYTREWQ09876543.1mnbvcxzasdfghjklpoiu"),
  15. # 90
  16. ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[]}|:;?/>.<'`",
  17. "mrtyuioplkjhgfdsazxcvbne1234567890QWER[YUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={`]}|"),
  18. # 89
  19. ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[]}|:;?/>.<'",
  20. "/?;:|}<[{=+-_)(*&^%$#@!MqBVCXZASDFGHJKLPOIUYTREWQ0987654321mnbvcxzasdfghjklpoiuyt"),
  21. # 88 - vflapUV9V 2013/08/28
  22. ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[]}|:;?/>.<",
  23. "ioplkjhgfdsazxcvbnm12<4567890QWERTYUIOZLKJHGFDSAeXCVBNM!@#$%^&*()_-+={[]}|:;?/>.3"),
  24. # 87
  25. ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$^&*()_-+={[]}|:;?/>.<",
  26. "uioplkjhgfdsazxcvbnm1t34567890QWE2TYUIOPLKJHGFDSAZXCVeNM!@#$^&*()_-+={[]}|:;?/>.<"),
  27. # 86 - vfluy6kdb 2013/09/06
  28. ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[|};?/>.<",
  29. "yuioplkjhgfdsazxcvbnm12345678q0QWrRTYUIOELKJHGFD-AZXCVBNM!@#$%^&*()_<+={[|};?/>.S"),
  30. # 85 - vflkuzxcs 2013/09/11
  31. ('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[',
  32. '3456789a0cdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRS[UVWXYZ!"#$%&\'()*+,-./:;<=>?@'),
  33. # 84 - vflg0g8PQ 2013/08/29 (sporadic)
  34. ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[};?>.<",
  35. ">?;}[{=+-_)(*&^%$#@!MNBVCXZASDFGHJKLPOIUYTREWq0987654321mnbvcxzasdfghjklpoiuytr"),
  36. # 83
  37. ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!#$%^&*()_+={[};?/>.<",
  38. ".>/?;}[{=+_)(*&^%<#!MNBVCXZASPFGHJKLwOIUYTREWQ0987654321mnbvcxzasdfghjklpoiuytreq"),
  39. # 82 - vflGNjMhJ 2013/09/12
  40. ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKHGFDSAZXCVBNM!@#$%^&*(-+={[};?/>.<",
  41. ".>/?;}[<=+-(*&^%$#@!MNBVCXeASDFGHKLPOqUYTREWQ0987654321mnbvcxzasdfghjklpoiuytrIwZ"),
  42. # 81 - vflLC8JvQ 2013/07/25
  43. ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKHGFDSAZXCVBNM!@#$%^&*(-+={[};?/>.",
  44. "C>/?;}[{=+-(*&^%$#@!MNBVYXZASDFGHKLPOIU.TREWQ0q87659321mnbvcxzasdfghjkl4oiuytrewp"),
  45. # 80 - vflZK4ZYR 2013/08/23 (sporadic)
  46. ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKHGFDSAZXCVBNM!@#$%^&*(-+={[};?/>",
  47. "wertyuioplkjhgfdsaqxcvbnm1234567890QWERTYUIOPLKHGFDSAZXCVBNM!@#$%^&z(-+={[};?/>"),
  48. # 79 - vflLC8JvQ 2013/07/25 (sporadic)
  49. ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKHGFDSAZXCVBNM!@#$%^&*(-+={[};?/",
  50. "Z?;}[{=+-(*&^%$#@!MNBVCXRASDFGHKLPOIUYT/EWQ0q87659321mnbvcxzasdfghjkl4oiuytrewp"),
  51. ]
  52. tests_age_gate = [
  53. # 86 - vflqinMWD
  54. ("qwertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!@#$%^&*()_-+={[|};?/>.<",
  55. "ertyuioplkjhgfdsazxcvbnm1234567890QWERTYUIOPLKJHGFDSAZXCVBNM!/#$%^&*()_-+={[|};?@"),
  56. ]
  57. def find_matching(wrong, right):
  58. idxs = [wrong.index(c) for c in right]
  59. return compress(idxs)
  60. return ('s[%d]' % i for i in idxs)
  61. def compress(idxs):
  62. def _genslice(start, end, step):
  63. starts = '' if start == 0 else str(start)
  64. ends = ':%d' % (end+step)
  65. steps = '' if step == 1 else (':%d' % step)
  66. return 's[%s%s%s]' % (starts, ends, steps)
  67. step = None
  68. for i, prev in zip(idxs[1:], idxs[:-1]):
  69. if step is not None:
  70. if i - prev == step:
  71. continue
  72. yield _genslice(start, prev, step)
  73. step = None
  74. continue
  75. if i - prev in [-1, 1]:
  76. step = i - prev
  77. start = prev
  78. continue
  79. else:
  80. yield 's[%d]' % prev
  81. if step is None:
  82. yield 's[%d]' % i
  83. else:
  84. yield _genslice(start, i, step)
  85. def _assert_compress(inp, exp):
  86. res = list(compress(inp))
  87. if res != exp:
  88. print('Got %r, expected %r' % (res, exp))
  89. assert res == exp
  90. _assert_compress([0,2,4,6], ['s[0]', 's[2]', 's[4]', 's[6]'])
  91. _assert_compress([0,1,2,4,6,7], ['s[:3]', 's[4]', 's[6:8]'])
  92. _assert_compress([8,0,1,2,4,7,6,9], ['s[8]', 's[:3]', 's[4]', 's[7:5:-1]', 's[9]'])
  93. def gen(wrong, right, indent):
  94. code = ' + '.join(find_matching(wrong, right))
  95. return 'if len(s) == %d:\n%s return %s\n' % (len(wrong), indent, code)
  96. def genall(tests):
  97. indent = ' ' * 8
  98. return indent + (indent + 'el').join(gen(wrong, right, indent) for wrong,right in tests)
  99. def main():
  100. print(genall(tests))
  101. print(u' Age gate:')
  102. print(genall(tests_age_gate))
  103. if __name__ == '__main__':
  104. main()