这个python片段:
from datetime import datetime
from googleapiclient.discovery import build
import googleapiclient
import socket
with open("secret_youtube_api_key", "r") as api_key_file:
api_key = api_key_file.read()
socket.setdefaulttimeout(30000)
youtube : googleapiclient.discovery.Resource = build('youtube', 'v3', developerKey=api_key)
print("youtube type " + str(type(youtube)))
request : googleapiclient.http.HttpRequest = youtube.channels().list(
part='statistics',
forUsername='PewDiePie'
)
print("request type " + str(type(request)))
print("\n" + str(datetime.now()) + " request.execute() start")
response = request.execute()
print("response type " + str(type(response)))
print(str(datetime.now()) + "\n request.execute() end")
print(response)给出以下输出:
youtube type <class 'googleapiclient.discovery.Resource'>
request type <class 'googleapiclient.http.HttpRequest'>
2022-04-20 03:22:35.541216 request.execute() start
response type <class 'dict'>
2022-04-20 03:24:46.061762
request.execute() end
{'kind': 'youtube#channelListResponse', 'etag': '01QNwqKcy80m97clcBBjfozMTV0', 'pageInfo': {'totalResults': 1, 'resultsPerPage': 5}, 'items': [{'kind': 'youtube#channel', 'etag': 'O5elmeewmtTIKBg8LuPaid7kDFs', 'id': 'UC-lHJZR3Gqxm24_Vd_AJ5Yw', 'statistics': {'viewCount': '28262284610', 'subscriberCount': '111000000', 'hiddenSubscriberCount': False, 'videoCount': '4472'}}]}实际调用执行的时间戳定期间隔130秒。我使用wget的控制命令提供了一个提示。
wget --timeout=300000 "https://www.googleapis.com/youtube/v3/channels?key=$APP_KEY&forUsername=PewDiePie&part=statistics"
--2022-04-20 03:24:44-- https://www.googleapis.com/youtube/v3/channels?key=REDACTED&forUsername=PewDiePie&part=statistics
Resolving www.googleapis.com (www.googleapis.com)... 2a00:1450:4001:810::200a, 2a00:1450:4001:811::200a, 2a00:1450:4001:80e::200a, ...
Connecting to www.googleapis.com (www.googleapis.com)|2a00:1450:4001:810::200a|:443... failed: Connection timed out.
Connecting to www.googleapis.com (www.googleapis.com)|2a00:1450:4001:811::200a|:443... failed: Connection timed out.
Connecting to www.googleapis.com (www.googleapis.com)|2a00:1450:4001:80e::200a|:443... failed: Connection timed out.
Connecting to www.googleapis.com (www.googleapis.com)|2a00:1450:4001:80f::200a|:443... failed: Connection timed out.
Connecting to www.googleapis.com (www.googleapis.com)|142.250.185.170|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [application/json]
Saving to: ‘channels?key=REDACTED&forUsername=PewDiePie&part=statistics’
channels?key=REDACTED [ <=> ] 476 --.-KB/s in 0s
2022-04-20 03:33:28 (18,7 MB/s) - ‘channels?key=REDACTED&forUsername=PewDiePie&part=statistics’ saved [476]如果没有明确的解决办法,这似乎是一个常见的问题。有一些相关的问题(link)没有得到回答。
看起来IPv6通常只是失败了。我这边有什么不对的。我将如何解决我的IPV6问题?考虑到我的结果可能是不可修复的--我需要如何修改我的python代码来排除IPV6呢?
强制wget上的ipv4立即返回:wget -4 --timeout=300000 "https://www.googleapis.com/youtube/v3/channels?key=$APP_KEY&forUsername=PewDiePie&part=statistics"
发布于 2022-04-20 12:08:29
对于一个措辞不同的问题,This answer适用于以下内容:
它回答了如何强制ipv4,而不是如何修复ipv6。
from datetime import datetime
from googleapiclient.discovery import build
import googleapiclient
import socket
with open("secret_youtube_api_key", "r") as api_key_file:
api_key = api_key_file.read()
#https://stackoverflow.com/a/50044152/536874
import socket
getaddrinfo_original = socket.getaddrinfo
def getaddrinfo_decorated(*args, **kwargs):
# filter responses that are not ipv4
return [response for response in getaddrinfo_original(*args, **kwargs) if response[0] == socket.AF_INET]
socket.getaddrinfo = getaddrinfo_decorated
youtube : googleapiclient.discovery.Resource = build('youtube', 'v3', developerKey=api_key)
print("youtube type " + str(type(youtube)))
request : googleapiclient.http.HttpRequest = youtube.channels().list(
part='statistics',
forUsername='PewDiePie'
)
print("request type " + str(type(request)))
print("\n" + str(datetime.now()) + " request.execute() start")
response = request.execute()
print("response type " + str(type(response)))
print(str(datetime.now()) + "\n request.execute() end")
print(response)更新后的代码现在输出:
youtube type <class 'googleapiclient.discovery.Resource'>
request type <class 'googleapiclient.http.HttpRequest'>
2022-04-20 14:06:27.311410 request.execute() start
response type <class 'dict'>
2022-04-20 14:06:27.503453
request.execute() end
{'kind': 'youtube#channelListResponse', 'etag': '_EY8e-LjjUX00BenLPIGIts8iS0', 'pageInfo': {'totalResults': 1, 'resultsPerPage': 5}, 'items': [{'kind': 'youtube#channel', 'etag': 'QmXjB1Hz-b5QX1ahMELzX1BTl6I', 'id': 'UC-lHJZR3Gqxm24_Vd_AJ5Yw', 'statistics': {'viewCount': '28263689871', 'subscriberCount': '111000000', 'hiddenSubscriberCount': False, 'videoCount': '4472'}}]}这是一个200毫秒的调用,应该是。一个更好的答案将包括如何查找和修复我的网络上的ipv6的任何问题。
https://stackoverflow.com/questions/71933184
复制相似问题