Невозможно получить случайный пост из некоторых субреддитов с PRAW - PullRequest
2 голосов
/ 14 февраля 2020

я пытаюсь заставить бота диссонанса отправлять изображения из reddit с этим кодом (просто чтобы не отправлять)

def random_post(subreddit):
while True:
    post = reddit.subreddit(subreddit).random()
    if not post.stickied:
        return post

обычно работает нормально, но время от времени я получаю эту ошибку

AttributeError: 'NoneType' object has no attribute 'stickied'

это происходит только с определенными подредактами, например, это никогда не случалось с r / memes, но происходит каждый раз, когда я пытаюсь использовать r / thighdeology (nsfw)

1 Ответ

2 голосов
/ 14 февраля 2020

Это известная проблема в конце Reddit.

Некоторые поддредакторы откажутся предоставить вам произвольную отправку. Смотрите praw-dev / praw # 885 на GitHub.

По этому вопросу я углубленно изучил причину . Мои выводы были следующими: Когда модераторы субредита снимают флажок «разрешить показ этого субредита пользователям в параметрах / r / all, / r / популярный, список по умолчанию и тренды» в их настройках субредита, он запрещает субреддиту возможность предоставить случайную отправку. Например, на момент написания этой статьи https://reddit.com/r/wallpapers/random просто перенаправляет на https://www.reddit.com/r/wallpapers/ вместо какой-либо отправки.

По моему личному мнению, это ошибка Reddit, вызванная путаницей между /r/random (которая перенаправляет на случайный subreddit) и /r/{subreddit}/random (который перенаправляет на случайную передачу в subreddit). Как таковой, этот флажок влияет на обе настройки, когда, на мой взгляд, имеет смысл только повлиять на /r/random.

В той же проблеме GitHub разработчик Reddit вмешался, чтобы подтвердить, что " два поведения связаны " и говорят, что это поведение " не является ошибкой само по себе . " Это было более двух лет go и ничего не изменилось Конец Reddit с тех пор.


Так что это значит для вас?

К сожалению, нет хорошего способа обойти это. Как вы обнаружили, для некоторых подредактов subreddit.random() возвращает None. Это отмечено в документации метода . В вашем коде вы должны убедиться, что post не None. В случае, если это None, вам решать, как с этим справиться. Вы можете просто вернуть None, или, возможно, вы можете использовать альтернативный метод для получения случайной отправки, такой как (например) получение 25 заявок из горячего списка и использование random.choice() для выбора.

...