我有一个使用 ImgurPython 库的应用程序来帮助我批量上传相册,并且比 Web UI 带来的麻烦更少。它对我来说已经工作了几周,但最近停止了。上传失败,但其他 API 调用似乎正常。我自己没有任何改变(据我所知),并且我尝试过的各种方法都没有找到原因,所以我不知所措。
我已经能够在 Python 命令行中重现失败:
>>> import os, sys, re, time
>>> from imgurpython import ImgurClient
>>> sys.version
'3.12.0 (tags/v3.12.0:0fb18b0, Oct 2 2023, 13:03:39) [MSC v.1935 64 bit (AMD64)]'
>>> client_id = "..."
>>> client_secret = "..."
>>> access_token = "..."
>>> refresh_token = "..."
>>> client = ImgurClient(client_id, client_secret, access_token, refresh_token)
>>> client.get_credits()
{'UserLimit': 500, 'UserRemaining': 500, 'UserReset': 1712002684, 'ClientLimit': 12500, 'ClientRemaining': 12499}
>>> fpath = '...'
>>> fd = open(fpath, 'rb')
>>> res = client.upload(fd, anon=False)
urllib3.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:2406)
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "C:\Users\MyUserName\AppData\Local\Programs\Python\Python312\Lib\site-packages\requests\adapters.py", line 486, in send
resp = conn.urlopen(
^^^^^^^^^^^^^
File "C:\Users\MyUserName\AppData\Local\Programs\Python\Python312\Lib\site-packages\urllib3\connectionpool.py", line 847, in urlopen
retries = retries.increment(
^^^^^^^^^^^^^^^^^^
File "C:\Users\MyUserName\AppData\Local\Programs\Python\Python312\Lib\site-packages\urllib3\util\retry.py", line 515, in increment
raise MaxRetryError(_pool, url, reason) from reason # type: ignore[arg-type]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='api.imgur.com', port=443): Max retries exceeded with url: /3/upload (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:2406)')))
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Users\MyUserName\AppData\Local\Programs\Python\Python312\Lib\site-packages\imgurpython-1.1.7-py3.12.egg\imgurpython\client.py", line 598, in upload
File "C:\Users\MyUserName\AppData\Local\Programs\Python\Python312\Lib\site-packages\imgurpython-1.1.7-py3.12.egg\imgurpython\client.py", line 133, in make_request
File "C:\Users\MyUserName\AppData\Local\Programs\Python\Python312\Lib\site-packages\requests\api.py", line 115, in post
return request("post", url, data=data, json=json, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\MyUserName\AppData\Local\Programs\Python\Python312\Lib\site-packages\requests\api.py", line 59, in request
return session.request(method=method, url=url, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\MyUserName\AppData\Local\Programs\Python\Python312\Lib\site-packages\requests\sessions.py", line 589, in request
resp = self.send(prep, **send_kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\MyUserName\AppData\Local\Programs\Python\Python312\Lib\site-packages\requests\sessions.py", line 703, in send
r = adapter.send(request, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\MyUserName\AppData\Local\Programs\Python\Python312\Lib\site-packages\requests\adapters.py", line 517, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='api.imgur.com', port=443): Max retries exceeded with url: /3/upload (Caused by SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:2406)')))
似乎不是问题:我似乎没有超出我的使用限制。我可以连接并检查积分,并看到所有内容都表明我已获得全额配额或非常接近配额。我可以进行 GET 调用(例如检查相册的内容)和 POST 调用(例如创建相册)。似乎只是专门上传导致了问题。
它似乎不会影响一个特定的图像文件,并且我尝试上传的文件与过去运行良好的文件没有明显不同(上面的重现使用了它已经可以使用的文件) .
我可以切换到不同的 VPN 端点或关闭我的 VPN,这没有什么区别。我等了一天多才重试,仍然失败。我今天等待新的一个月开始,以防万一这是一个因素,但仍然失败了。 (API 文档说“如果一个月内达到每日限制五次,那么该应用程序将被阻止在该月的剩余时间内”,所以我希望这可能是原因,并且可能意味着其余的时间calendar 月而不是接下来的三十天 - 但要么是我运气不好,要么是 only 上传失败意味着应用程序毕竟没有被阻止。)我尝试获取不同的应用程序 ID/秘密并使用它 - 同样的问题。
我在这里和其他地方发现了各种关于看起来相似的失败的问题,但似乎没有一个是完全相同的。一个答案建议在请求库调用中使用会话,但 ImgurPython 似乎已经在这样做了。
我也有类似的经历。我停止使用该库,只是使用
requests
直接与 API 对话。这是上传图像的示例。也请参考此处的文档https://apidocs.imgur.com/#c85c9dfc-7487-4de2-9ecd-66f727cf3139。
import requests
from os import path
clientID = '..'
headers = {'Authorization': 'Client-ID ' + clientID}
url = 'https://api.imgur.com/3/upload'
with open(path.realpath('./original.png'), 'rb') as img:
payload = {'image': img}
response = requests.post(url, headers=headers, files=payload)
imageLink = response.json()['data']['link']
return imageLink