我正在尝试使用pytchat库来获取关于我的慢速生活聊天的信息。我想要的两个主要信息是:消息文本(我可以可靠地获得)和注释id (显然不那么可靠)。pytchat库允许以各种不同的方式访问YouTube请求信息。所有这些似乎都给了我同样糟糕的输出。使用此代码:
from pytchat import CompatibleProcessor, create
import time, sys
chat_ = create(sys.argv[1], processor = CompatibleProcessor())
while chat_.is_alive():
try:
data = chat_.get()
polling = data['pollingIntervalMillis']/1000
for c in data['items']:
if c.get('snippet'):
print(c['snippet']['displayMessage'] + ' || ' + c['id'])
time.sleep(polling/len(data['items']))
except KeyboardInterrupt:
chat_.terminate()
我得到的每一个评论,因为它是由YouTube提供的。消息位很好。然而,C‘’id‘则是另一个故事。此元素存储的注释in通常以这种方式格式化:
LCC.CjkKGkNQRHhoYUNEdVBrQ0ZWRzE1UWNkdEhZQzlREhtDT0dDMFBYMXRfa0NGWTZUd2dFZDdkZ0Uydzk%3D
这不是一个实际的评论id。我知道的也很多,因为每当我在删除请求中将这个注释id传递给YouTube API时,我会得到以下内容:
{'error': {'code': 404, 'message': 'The liveChatMessage that you are trying to delete cannot be found.', 'errors': [{'message': 'The liveChatMessage that you are trying to delete cannot be found.', 'domain': 'youtube.liveChat', 'reason': 'liveChatMessageNotFound'}]}}
使用curl发出POST请求会产生一种不同风格的评论id:
LCC.CjgKDQoLQlRERDlEYVFZdHMqJwoYVUMxSE1UdDVjb0VWNi1tV1BhZEJRU0l3EgtCVEREOURhUVl0cxI5ChpDUER4aGFDRHVQa0NGVkcxNVFjZHRIWUM5URIbQ09HQzBQWDF0X2tDRlk2VHdnRWQ3ZGdFMnc5
我没有尝试用这种类型的注释id删除注释,但只要看一下它,我就会认为它比pytchat提供的任何内容都更有效。
这是pytchat的预期行为吗?我没见过其他人用这种方式使用图书馆。如果是这样的话,我如何才能得到实际的评论id?(最好不提供任何授权令牌)
编辑(例如c代码片段与关联的livestream视频ids):
xLsoN8z9xq:
{'kind': 'youtube#liveChatMessage', 'etag': '', 'id': 'LCC.CjoKGkNKSGVfTml5dXZrQ0Zjc1dyUVlkOUhNSnN3EhxDUFROd0txc3V2a0NGV1doMkFVZHNFY0l1ZzEw', 'snippet': {'type': 'textMessageEvent', 'liveChatId': '', 'authorChannelId': 'UCdyotM4u3QW4Nvqr-iZghyQ', 'publishedAt': '2022-08-09T18:33:27.877Z', 'hasDisplayContent': True, 'displayMessage': 'all hail for lord yacine', 'textMessageDetails': {'messageText': 'all hail for lord yacine'}}, 'authorDetails': {'channelId': 'UCdyotM4u3QW4Nvqr-iZghyQ', 'channelUrl': 'http://www.youtube.com/channel/UCdyotM4u3QW4Nvqr-iZghyQ', 'displayName': 'rahil', 'profileImageUrl': 'https://yt4.ggpht.com/ytc/AMLnZu_nFXi8dLoAOUeyiS0wcqLivdaFyTOc1yYQjbiOqg=s64-c-k-c0x00ffffff-no-rj', 'isVerified': False, 'isChatOwner': False, 'isChatSponsor': False, 'isChatModerator': False}}
mx9EqnEhg74:
{'kind': 'youtube#liveChatMessage', 'etag': '', 'id': 'LCC.CjsKGkNPdmprckt5dXZrQ0ZXS3Q1UWNkSWM4S0hnEh1DSm10azkydXV2a0NGYW9tZ3dvZDI5UUYzQS0xMw%3D%3D', 'snippet': {'type': 'textMessageEvent', 'liveChatId': '', 'authorChannelId': 'UCgkIDx-V7zMjnCrEtXaxUWQ', 'publishedAt': '2022-08-09T18:32:06.449Z', 'hasDisplayContent': True, 'displayMessage': 'yuck', 'textMessageDetails': {'messageText': 'yuck'}}, 'authorDetails': {'channelId': 'UCgkIDx-V7zMjnCrEtXaxUWQ', 'channelUrl': 'http://www.youtube.com/channel/UCgkIDx-V7zMjnCrEtXaxUWQ', 'displayName': 'grace', 'profileImageUrl': 'https://yt4.ggpht.com/nDFvN9uOZw7eP3-NQhIZZmXH-I5J30FEF629JjJ-NMpADvWLy3Q6BIkqtT-tX8drsVprLcNw=s64-c-k-c0x00ffffff-no-rj', 'isVerified': False, 'isChatOwner': False, 'isChatSponsor': False, 'isChatModerator': False}}
jfKfPfyJRdk:
{'kind': 'youtube#liveChatMessage', 'etag': '', 'id': 'LCC.CkUKGkNPcV9oWVd5dXZrQ0ZhTWlyUVlkSFJjSEVnEidDUDZYMDdxd3V2a0NGYy1JbFFJZHBxSUxRUTE2NjAwNjk4Mjk0Njk%3D', 'snippet': {'type': 'textMessageEvent', 'liveChatId': '', 'authorChannelId': 'UChOT0CZQ9ZwiwxNfkdI72tQ', 'publishedAt': '2022-08-09T18:30:31.860Z', 'hasDisplayContent': True, 'displayMessage': 'mds eu tô em um tédio absurdo KKKKKK', 'textMessageDetails': {'messageText': 'mds eu tô em um tédio absurdo KKKKKK'}}, 'authorDetails': {'channelId': 'UChOT0CZQ9ZwiwxNfkdI72tQ', 'channelUrl': 'http://www.youtube.com/channel/UChOT0CZQ9ZwiwxNfkdI72tQ', 'displayName': 'Ruth.', 'profileImageUrl': 'https://yt4.ggpht.com/ytc/AMLnZu-P2JRuFGU5ibeJiBIflPSkhUyS_0Zqz3w6CClZBg=s64-c-k-c0x00ffffff-no-rj', 'isVerified': False, 'isChatOwner': False, 'isChatSponsor': False, 'isChatModerator': False}}
还有一个编辑:我阅读了pytchat源代码,发现了这个可疑的代码片段(在__init__.py中):
from base64 import a85decode as dc
_sml = dc(b"BQS?8F#ks-GB\\6`H#IhIF^eo7@rH3;H#IhIF^eor06T''Ch\\'(?XmbXF>%9<FC/iuG%G#jBOQ!ICLqcS5tQB2;gCZ)?UdXC;f$GR3)MM2<(0>O7mh!,G@+K5?SO9T@okV").decode()
_smr = dc(b"BQS?8F#ks-GB\\6`H#IhIF^eo7@rH3;H#IhIF^eor06T''Ch\\'(?XmbXF>%9<FC/iuG%G#jBOQ!iEb03+@<k(QAU-F)8U=fDGsP557S5F7CiNH7;)D3N77^*B6YU@\\?WfBr0emZX=#^").decode()
这些是指向以API键作为参数的YouTube的链接。如果您查看YouTube自己的API文档(或者到其他地方查看),您很快就会发现YouTube/v1API不再受支持。事实上,我在任何地方都找不到旧API的文档。看来我已经到了死胡同。
发布于 2022-08-09 20:37:50
您在问题中提供的示例数据在liveChatId属性中没有值:
snippet.liveChatId
字符串 唯一标识与消息关联的实时聊天的ID。与广播关联的实时聊天ID将在snippet.liveChatId
资源的属性中返回。
这样,您应该检查LiveBroadcasts:列表端点,以便返回liveChatId
。
通过检查这张发行追踪器的票,我在YouTube Data正式文档中使用了liveChatId
;但是,我得到了这个(在本例中),实时聊天不再是活动的。
结果:
{
"error": {
"code": 403,
"message": "The live chat is no longer live.",
"errors": [
{
"message": "The live chat is no longer live.",
"domain": "youtube.liveChat",
"reason": "liveChatEnded"
}
]
}
}
在本例中,您可以看到,我使用liveChatId作为参数,但是,这个ID看起来与代码片段中显示的"id“非常不同.
在我看来,这就像API中的一个bug,但是,我承认我还没有尝试过LiveChatMessages
和LiveBroadcast
端点。
如果您认为这是一个bug,或者您需要进一步的帮助,请考虑检查问题跟踪器,看看是否有其他人发布了您的类似问题或在那里发布了该问题。
发布于 2022-08-10 04:48:29
这是一个备用答案,直到我能够提供一些代码片段,这将使一些事情清楚。首先,如果您想知道pytchat为什么不提供有效的实时聊天评论if,我不得不说我不确定。不过,到目前为止,我将给出我最好的猜测: YouTube使用的版本已经很老了。事实上,它可能早于删除实时聊天评论的能力(我希望的目标)。我上面引用的pytchat源代码帮助我实现了这个假设。_sml和_smr变量设置为:
'https://www.youtube.com/youtubei/v1/live_chat/get_live_chat_replay?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8'
以及:
'https://www.youtube.com/youtubei/v1/live_chat/get_live_chat?key=AIzaSyAO_FJ2SlqU8Q4STEHLGCilw_Y9_11qcW8'
分别使用。在通过httpx库发出的get请求中,在整个代码中都使用这些变量。
可能存在通过这个旧API删除YouTube实时聊天注释的方法,但是我还没有找到关于它的文档。
直到后来,PixelBlurb
https://stackoverflow.com/questions/73283681
复制相似问题