Проблема с использованием configparser для передачи учетных данных API - PullRequest
1 голос
/ 16 апреля 2020

У меня есть файл config.ini, который выглядит следующим образом

[REDDIT]
client_id = 'myclientid23jd934g'
client_secret = 'myclientsecretjf30gj5g'
password = 'mypassword'
user_agent = 'myuseragent'
username = 'myusername'

Когда я пытаюсь использовать API-интерфейс reddit следующим образом:

import configparser
import praw

class redditImageScraper:
    def __init__(self, sub, limit):
        config = configparser.ConfigParser()
        config.read('config.ini')
        self.sub = sub
        self.limit = limit
        self.reddit = praw.Reddit(client_id=config.get('REDDIT','client_id'),
                                  client_secret=config.get('REDDIT','client_secret'),
                                  password=config.get('REDDIT','password'),
                                  user_agent=config.get('REDDIT','user_agent'),
                                  username=config.get('REDDIT','username'))


    def get_content(self):
        submissions = self.reddit.subreddit(self.sub).hot(limit=self.limit)
        for submission in submissions:
            print(submission.id)

def main():
    scraper = redditImageScraper('aww', 25)
    scraper.get_content()

if __name__ == '__main__':
    main()

Я получаю эту трассировку

Traceback (most recent call last):
  File "config.py", line 30, in <module>
    main()
  File "config.py", line 27, in main
    scraper.get_content()
  File "config.py", line 22, in get_content
    for submission in submissions:
  File "C:\Users\Evan\Anaconda3\lib\site-packages\praw\models\listing\generator.py", line 61, in __next__
    self._next_batch()
  File "C:\Users\Evan\Anaconda3\lib\site-packages\praw\models\listing\generator.py", line 71, in _next_batch
    self._listing = self._reddit.get(self.url, params=self.params)
  File "C:\Users\Evan\Anaconda3\lib\site-packages\praw\reddit.py", line 454, in get
    data = self.request("GET", path, params=params)
  File "C:\Users\Evan\Anaconda3\lib\site-packages\praw\reddit.py", line 627, in request
    method, path, data=data, files=files, params=params
  File "C:\Users\Evan\Anaconda3\lib\site-packages\prawcore\sessions.py", line 185, in request
    params=params, url=url)
  File "C:\Users\Evan\Anaconda3\lib\site-packages\prawcore\sessions.py", line 116, in _request_with_retries
    data, files, json, method, params, retries, url)
  File "C:\Users\Evan\Anaconda3\lib\site-packages\prawcore\sessions.py", line 101, in _make_request
    params=params)
  File "C:\Users\Evan\Anaconda3\lib\site-packages\prawcore\rate_limit.py", line 35, in call
    kwargs['headers'] = set_header_callback()
  File "C:\Users\Evan\Anaconda3\lib\site-packages\prawcore\sessions.py", line 145, in _set_header_callback
    self._authorizer.refresh()
  File "C:\Users\Evan\Anaconda3\lib\site-packages\prawcore\auth.py", line 328, in refresh
    password=self._password)
  File "C:\Users\Evan\Anaconda3\lib\site-packages\prawcore\auth.py", line 138, in _request_token
    response = self._authenticator._post(url, **data)
  File "C:\Users\Evan\Anaconda3\lib\site-packages\prawcore\auth.py", line 31, in _post
    raise ResponseException(response)
prawcore.exceptions.ResponseException: received 401 HTTP response

Однако, когда я вручную вставляю учетные данные, мой код работает точно так, как ожидалось. Кроме того, если я запускаю строку

print(config.get('REDDIT', 'client_id'))

, я получаю вывод 'myclientid23jd934g', как и ожидалось.

Есть ли какая-то причина, по которой praw не позволяет мне передать мои учетные данные, используя configparser?

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Здесь вы слишком усложняете конфигурацию - PRAW позаботится об этом за вас.

Если вы переименуете config.ini в praw.ini, вы можете заменить всю вашу инициализацию просто

self.reddit = praw.Reddit('REDDIT')

Это потому, что PRAW ищет файл praw.ini и анализирует его для вас. Если вы хотите дать разделу более информативное имя, обязательно обновите его в praw.ini, а также в одиночном параметре, передаваемом в Reddit (который указывает секцию файла для использования).

См. https://praw.readthedocs.io/en/latest/getting_started/configuration/prawini.html.

Как отмечается на этой странице, такие значения, как имя пользователя и пароль, не должны заключаться в кавычки. Например,

password=mypassword

правильно, но

password="mypassword"

неверно.

1 голос
/ 16 апреля 2020

Дважды проверьте, какие ваши входные данные для praw.Reddit:

kwargs = dict(client_id=config.get('REDDIT','client_id'),
              client_secret=config.get('REDDIT','client_secret'),
              password=config.get('REDDIT','password'),
              user_agent=config.get('REDDIT','user_agent'),
              username=config.get('REDDIT','username'))) 
print(kwargs)
praw.Reddit(**kwargs)
...