Pytube出现错误:签名= cipher.get_signature(js,stream ['s'])KeyError:'s'

时间:2019-05-30 16:42:43

标签: urllib2 pytube

运行Pytube脚本时出现此错误:

     signature = cipher.get_signature(js, stream['s'])
     KeyError: 's'

我的代码是这样的:

    url = 'https://www.youtube.com/watch?v='
    train_List = []
    i = 0
    while i < len(my_list):
        if len(my_list[i]) > 6:
            urls = url + my_list[i]
            train_List.append(urls)
            yt=YouTube(train_List[i])
            t=yt.streams.filter(only_audio=True).all()
            t[0].download('/pathtofolder')
            i+=1

我也尝试过:

    t=yt.streams.filter(file_extension='mp4').all()

我根据此处的建议更改了cipher.py和helper.py文件:https://github.com/nficano/pytube/issues/353#issuecomment-455116197

但是它没有解决问题。进行更改后,我得到了上面指出的错误。

接下来,我根据其他一些建议运行了“ pip install pytube --upgrade”。下载一些音频文件后仍会收到KeyError。

根据github问题,我还在mixins.py中实现了这一点:

    if ('signature=' in url) or ('&sig=' in url) or ('&lsig=' in url):

但是现在它在3次上传后挂起。

有人为此解决吗?

6 个答案:

答案 0 :(得分:1)

我通过将mixins.py中的第49行更改为此问题(至少对我来说):

Enum

代替

instance (Enum a, Bounded a) => Foldable (Relation a) (Ord ⊢ (->)) Hask where
  foldMap (ConstrainedMorphism f) = ConstrainedMorphism $ \case
    Fin g -> Prelude.foldMap (Prelude.foldMap f) g
    Inf g -> Prelude.foldMap (Prelude.foldMap f . g) [minBound .. maxBound]

然后将第55-63行更改为

signature = cipher.get_signature(js, stream['url'])

答案 1 :(得分:0)

有同样的问题。如果我第二次尝试,大多数情况下都可以使用...

url = 'https://www.youtube.com/watch?v=gQrkvZeE3Uc'
yt = YouTube(url)
yt.streams.filter(progressive=True, subtype='mp4').order_by('resolution').desc().last().download()

感谢您的帮助

答案 2 :(得分:0)

您必须修复lib / python3.6 / site-packages / pytube中的cipher.py文件:

在cipher.py中,将模式从第38行开始更改为:

pattern = [
    r'(["\'])signature\1\s*,\s*(?P<sig>[a-zA-Z0-9$]+)\(',
    r'\.sig\|\|(?P<sig>[a-zA-Z0-9$]+)\(',
    r'yt\.akamaized\.net/\)\s*\|\|\s*.*?\s*c\s*&&\s*d\.set\([^,]+\s*,\s*(?:encodeURIComponent\s*\()?(?P<sig>[a-zA-Z0-9$]+)\(',
    r'\bc\s*&&\s*d\.set\([^,]+\s*,\s*(?:encodeURIComponent\s*\()?\s*(?P<sig>[a-zA-Z0-9$]+)\(',
    r'\bc\s*&&\s*d\.set\([^,]+\s*,\s*\([^)]*\)\s*\(\s*(?P<sig>[a-zA-Z0-9$]+)\(',
]

答案 3 :(得分:0)

解决问题的方法之一:pip install git+https://github.com/nficano/pytube.git

除此之外,请选中此thread

答案 4 :(得分:0)

我做了pip uninstall pytube

python --version检查了我的python版本,原来是Anaconda 3.6.8版本。

所以我相信pip3 install pytubepip3是为Python 3设计的。

现在没有问题。

答案 5 :(得分:0)

根据从源头安装它的其他答案,

遇到了同样的问题,只是检查了我当前的pytube版本是9.5.0,看到上一个版本是9.5.2,所以我只运行pip install --upgrade pytube并效果很好