【问题标题】:Looping through Rocket.Chat API循环通过 Rocket.Chat API
【发布时间】:2019-03-04 14:00:22
【问题描述】:

Python 3.7.2 PyCharm

我对 Python 和 API 交互还很陌生;我正在尝试遍历 Rocket Chat 的 API,特别是提取用户电子邮件地址。 与我能找到的几乎所有示例不同,Rocket Chat 不使用任何类型的构造,如“Next”——它使用计数和偏移量,我实际上有 虽然可能会使这更容易。 我已经设法完成了这项工作的第一部分, 遍历 JSON 并获取电子邮件。我需要做的是遍历 API 端点——这是我遇到的一些问题。
我看过这个答案Unable to loop through paged API responses with Python 因为它似乎非常接近我想要的,但我无法让它正常工作。

下面的代码,就是我现在所拥有的;显然这还没有通过 API 端点进行任何循环,它只是在返回的 json 上循环。

import os
import csv
import requests
import json

url = "https://rocketchat.internal.net"
login = "/api/v1/login"
rocketchatusers = "/api/v1/users.list"
#offset = "?count=500&offset=0"


class API:

    def userlist(self, userid, token):
        headers = {'X-Auth-Token': token, 'X-User-Id': userid}
        rocketusers = requests.get(url + rocketchatusers, headers=headers, verify=False)
        print('Status Code:' + str(rocketusers.status_code))
        print('Content Type:' + rocketusers.headers['content-type'])
        userlist = json.loads(rocketusers.text)
        x = 0
        y = 0
        emails = open('emails', 'w')
        while y == 0:
            try:
                for i in userlist:
                    print(userlist['users'][x]['emails'][0]['address'], file=emails)
                    # print(userlist['users'][x]['emails'][0]['address'])
                    x += 1
            except KeyError:
                print("This user has no email address", file=emails)
                x += 1
            except IndexError:
                print("End of List")
                emails.close()
                y += 1

我尝试过的以及我想做的事情是类似于简单的 FOR 循环。实际上可能有很多方法可以做我所追求的,我只是不知道它们。

类似这样的:

import os
import csv
import requests
import json

url = "https://rocketchat.internal.net"
login = "/api/v1/login"
rocketchatusers = "/api/v1/users.list"
offset = "?count=500&offset="+p
p = 0

class API:

    def userlist(self, userid, token):
        headers = {'X-Auth-Token': token, 'X-User-Id': userid}
        rocketusers = requests.get(url + rocketchatusers+offset, headers=headers, verify=False)

        for r in rocketusers:
            print('Status Code:' + str(rocketusers.status_code))
            print('Content Type:' + rocketusers.headers['content-type'])
            userlist = json.loads(rocketusers.text)
            x = 0
            y = 0
            emails = open('emails', 'w')
            while y == 0:
                try:
                    for i in userlist:
                        print(userlist['users'][x]['emails'][0]['address'], file=emails)
                        # print(userlist['users'][x]['emails'][0]['address'])
                        x += 1
                except KeyError:
                    print("This user has no email address", file=emails)
                    x += 1
                except IndexError:
                    print("End of List")
                    emails.close()
                    y += 1
        p += 500

现在,显然这不起作用,或者我不会发布,但为什么它不起作用是问题所在。 得到报告的错误是我无法连接一个 INT,而需要一个 STR。好的。当我尝试这样的事情时:

str(p = 0) 我收到类型错误。我也尝试了很多其他的东西,其中很多都是愚蠢的,例如 p = []、p = {} 和其他更激进的想法。

如果不是所有变量和连接的 URL,该 URL 将如下所示:

https://rocketchat.internal.net/api/v1/users.list?count=500&offset=0
https://rocketchat.internal.net/api/v1/users.list?count=500&offset=500
https://rocketchat.internal.net/api/v1/users.list?count=500&offset=1000
https://rocketchat.internal.net/api/v1/users.list?count=500&offset=1500

我觉得我缺少一些非常简单的东西。我有理由确定答案是对我列出的帖子的回复,但我无法让它发挥作用。

【问题讨论】:

    标签: python python-3.x api rocket.chat


    【解决方案1】:

    所以,在四处询问之后,我发现我一直在解决这个问题的正确道路上,我只是在错误的地方尝试。这是我最终得到的结果:

    def userlist(self, userid, token):
        p = 0
        while p <= 7500:
            if not os.path.exists('./emails'):
                headers = {'X-Auth-Token': token, 'X-User-Id': userid}
                rocketusers = requests.get(url + rocketchatusers + offset + str(p), headers=headers, verify=False)
                print('Status Code:' + str(rocketusers.status_code))
                print('Content Type:' + rocketusers.headers['content-type'])
                print('Creating the file "emails" to use to compare against list of regulated users.')
                print(url + rocketchatusers + offset + str(p))
                userlist = json.loads(rocketusers.text)
                x = 0
                y = 0
                emails = open('emails', 'a+')
                while y == 0:
                    try:
                        for i in userlist:
                            #print(userlist['users'][x]['emails'][0]['address'], file=emails)
                            print(userlist['users'][x]['ldap'], file=emails)
                            print(userlist['users'][x]['username'], file=emails)
                            x += 1
                    except KeyError:
                        x += 1
                    except IndexError:
                        print("End of List")
                        emails.close()
                        p += 50
                        y += 1
            else:
                headers = {'X-Auth-Token': token, 'X-User-Id': userid}
                rocketusers = requests.get(url + rocketchatusers + offset + str(p), headers=headers, verify=False)
                print('Status Code:' + str(rocketusers.status_code))
                print('Content Type:' + rocketusers.headers['content-type'])
                print('Populating file "emails" - this takes a few moments, please be patient.')
                print(url + rocketchatusers + offset + str(p))
                userlist = json.loads(rocketusers.text)
                x = 0
                z = 0
                emails = open('emails', 'a+')
                while z == 0:
                    try:
                        for i in userlist:
                            #print(userlist['users'][x]['emails'][0]['address'], file=emails)
                            print(userlist['users'][x]['ldap'], file=emails)
                            print(userlist['users'][x]['username'], file=emails)
                            x += 1
                    except KeyError:
                        x += 1
                    except IndexError:
                        print("End of List")
                        emails.close()
                        p += 50
                        z += 1
    

    这仍在进行中,不幸的是,这不是合作的途径,稍后我可能会将其发布到 GitHub 以便其他人可以看到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 2013-08-20
      • 1970-01-01
      相关资源
      最近更新 更多