我正在尝试在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

最佳答案

我在PRAW中编写了图像提交功能。如the documentation中所述,当通过API提交图像或视频时,Reddit API使用websocket。这与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本身在),所以连接失败。

我为您提供了一些解决方案,以下是我认为最理想的解决方案:


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

关于python - 尝试在pythonanywhere上使用praw提交图像时出现WebSocketProxyException 403,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57134898/

10-11 21:04