【问题标题】:Trouble using configparser to pass API credentials使用 configparser 传递 API 凭据时遇到问题
【发布时间】:2020-07-29 07:25:58
【问题描述】:

我有一个如下所示的 config.ini 文件

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

当我尝试像这样使用 reddit 的 API praw 时:

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 传递我的凭据?

【问题讨论】:

  • 仔细检查您放入的内容,例如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)
  • @Macattack 谢谢!以这种方式检查它表明它在每个凭证周围都有一组额外的引用。 ini 文件不需要引号,因为所有内容都被解释为字符串。现在一切正常!随意添加您的评论作为解决方案,我会选择它。

标签: python ini configparser praw


【解决方案1】:

仔细检查您对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)

【讨论】:

    【解决方案2】:

    您在这里的配置过于复杂 - PRAW 会为您解决这个问题。

    如果您将 config.ini 重命名为 praw.ini,则可以将整个初始化替换为 just

    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"
    

    不正确。

    【讨论】:

    • 快速提问。我想将 praw.ini 文件保存在与脚本本身不同的目录中。我正在使用 Windows,我在文档中看到它说它将找到“在 APPDATA 环境变量 (Windows) 指定的目录中”的文件。我有一个指向 ..\AppData\Local\Temp 的 TEMP 环境变量。我是否需要创建一个名为 APPDATA 的新变量并将其指向包含我的 praw.ini 的文件夹?
    • 我不熟悉 Windows 的细节,但是是的,您似乎必须设置 APPDATA 环境变量并将其指向包含您的 praw.ini 的文件夹。
    猜你喜欢
    • 2013-04-15
    • 1970-01-01
    • 2019-11-16
    • 2014-02-23
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 2023-02-13
    • 2019-09-02
    相关资源
    最近更新 更多