【问题标题】:WebSocketProxyException 403 when trying to submit image with praw on pythonanywhere尝试在 pythonanywhere 上使用 praw 提交图像时出现 WebSocketProxyException 403
【发布时间】:2019-07-21 16:13:15
【问题描述】:

我正在尝试在 pythonanywhere 上使用 praw 将图像本地上传到 reddit。

praw.models.Subreddit.submit_image(title, image_path)

这在我的计算机上运行良好,但在 pythonanywhere 上会引发 403 错误。 (图片仍然会被上传。)

我看到on pythonanywhere's website 403 错误是由于它们的代理白名单造成的,但 reddit 是列入白名单的网站之一,praw 使用requests,pythonanywhere 说它是一个兼容库。常规的submit 也可以正常工作。

File "/home/ibid/.local/lib/python3.7/site-packages/praw/models/reddit/subreddit.py", line 780, in submit_image
    return self._submit_media(data, timeout)
File "/home/ibid/.local/lib/python3.7/site-packages/praw/models/reddit/subreddit.py", line 494, in _submit_media
    response["json"]["data"]["websocket_url"], timeout=timeout
File "/home/ibid/.local/lib/python3.7/site-packages/websocket/_core.py", line 514, in create_connection
    websock.connect(url, **options)
File "/home/ibid/.local/lib/python3.7/site-packages/websocket/_core.py", line 223, in connect
    options.pop('socket', None))
File "/home/ibid/.local/lib/python3.7/site-packages/websocket/_http.py", line 122, in connect
    sock = _tunnel(sock, hostname, port, auth)
File "/home/ibid/.local/lib/python3.7/site-packages/websocket/_http.py", line 293, in _tunnel
    "failed CONNECT via proxy status: %r" % status)
websocket._exceptions.WebSocketProxyException: failed CONNECT via proxy status: 403

【问题讨论】:

  • 您应该使用 Python 调试器来更好地递归到问题中。
  • PythonAnywhere 在这里开发。这很有趣——看起来 praw 正在使用 WebSocket 连接来上传图像,这很不寻常。不过,我们使用的代理确实支持 websocket,所以我认为这本身不是问题。也许他们用于 websockets 的服务器是我们没有列入白名单的新服务器。您能否尝试在 /home/ibid/.local/lib/python3.7/site-packages/praw/models/reddit/subreddit.py 中的第 493 行的“websocket.create_connection”调用上方添加此内容: print(response[ "json"]["data"]["websocket_url"]) ...让我们知道它打印出什么?
  • @GilesThomas - 我用 pdb 在那里设置了一个断点并运行了 print 语句。它返回了wss://ws-034ba158e876c2f4d.wss.redditmedia.com/rte_images/l5xwil1zcpb31?m=AQAAgrU0XXD2NGkZxPDPL3IGEISdU36B0eDHNZHzL-uXEQgL7vCQ 我猜问题是“redditmedia.com”没有被列入白名单?
  • 谢谢!我们已将相应的服务器列入白名单,如果您还有任何问题,请通过电子邮件告知我们。
  • @GilesThomas - 谢谢,现在一切正常。

标签: python python-3.x websocket pythonanywhere praw


【解决方案1】:

我在 PRAW 中编写了图像提交功能。正如the documentation 中所述,Reddit API 在通过 API 提交图像或视频时使用 websockets。这与 API 用于文本或链接提交的方式不同,后者直接返回创建的帖子的 URL。当涉及到图像和视频时,响应类似于

{'json': {'data': {'user_submitted_page': 'https://www.reddit.com/user/username/submitted/',
                   'websocket_url': 'wss://ws-05ba9e4989f78959d.wss.redditmedia.com/rte_images/z4a98g21vsb31?m=AQAAHFs1XR-NRjAq9D4PPYA6SuDvFIMUGGv2Vpv5ePM2bLV6wf5o'},
          'errors': []}}

然后我们必须监听 websocket URL 以最终获取创建的帖子的 url。如果有兴趣,相关代码是here


如您所见,websocket URL(至少在此答案时)往往是*.wss.redditmedia.com 的子域。 redditmedia.com 不在the PythonAnywhere whitelist 上(虽然reddit.com 本身在),所以连接失败。

我为您看到了一些解决方案,这里先给出我认为最理想的解决方案:

  1. 从 PythonAnywhere 获取 Giles Thomas(留下评论的人)或其他人将 wss.redditmedia.com 的子域列入白名单。
  2. 在 PRAW >=6.5.0 中,传递参数without_websockets=True 以禁用 websockets。如the documentation of submit_image 中所述,将其设置为True 意味着您根本不会获得返回值。
  3. 在 PRAW submit_image 时都使用 try-except 块。正如您所发现的,帖子仍将被创建。但是,您不会收到 Submission 对象作为返回值,因为 websocket 将失败。
  4. 付费升级到 PythonAnywhere 的非白名单版本。

【讨论】:

  • 太棒了,感谢您提供的详细信息!现在已列入白名单。
猜你喜欢
  • 1970-01-01
  • 2014-05-22
  • 2021-02-27
  • 2017-04-25
  • 2020-10-01
  • 2013-09-26
  • 2016-03-22
  • 2017-02-11
  • 1970-01-01
相关资源
最近更新 更多