我今天回来了一个用于通过SSL登录Gmail的旧脚本。上次我运行它(几个月前)时脚本工作正常,但现在它立即死了:
<urlopen error The read operation timed out>
如果我设置超时(无论多长时间),它会立即死亡:
<urlopen error The connect operation timed out>
后者可以重现:
import socket
socket.setdefaulttimeout(30000)
sock = socket.socket()
sock.connect(('www.google.com', 443))
ssl = socket.ssl(sock)
返回:
socket.sslerror: The connect operation timed out
但我似乎无法重现前者,并且在通过代码进行了大量步骤后,我不知道是什么导致了这一点。
答案 0 :(得分:1)
import socket
socket.setdefaulttimeout(30000)
sock = socket.socket()
sock.connect(('www.google.com', 443))
ssl = socket.ssl(sock)
ssl.server()
--> '/C=US/ST=California/L=Mountain View/O=Google Inc/CN=www.google.com'
它运作得很好。我无法重现您的错误。
答案 1 :(得分:0)
无法通过HTTPS访问www.google.com。它重定向到不安全的HTTP。要获得邮件,您应该去https://mail.google.com
答案 2 :(得分:0)
我要检查的第一件事是你是否需要通过HTTP代理进行连接(在这种情况下,绕过代理的直接连接可能会超时)。运行Wireshark,看看会发生什么。
答案 3 :(得分:0)
连接到 www.google.com
没有超时,但 Python 3.x 现在提供了 ssl
模块,因此 OP 的示例代码将不起作用。
以下是适用于当前 Python 版本的类似内容:
import ssl
import socket
from pprint import pprint
hostname = 'www.google.org'
context = ssl.create_default_context()
with socket.create_connection((hostname, 443)) as sock:
with context.wrap_socket(sock, server_hostname=hostname) as ssock:
pprint(ssock.getpeercert()['subject'])
产生:
((('countryName', 'US'),),
(('stateOrProvinceName', 'California'),),
(('localityName', 'Mountain View'),),
(('organizationName', 'Google LLC'),),
(('commonName', 'misc.google.com'),))
在此处阅读有关 ssl 模块的更多信息:https://docs.python.org/3/library/ssl.html