Цикл через Rocket.Chat API - PullRequest
       20

Цикл через Rocket.Chat API

0 голосов
/ 04 марта 2019

Python 3.7.2 PyCharm

Я довольно плохо знаком с Python и API-интерфейсом;Я пытаюсь перебрать API для Rocket Chat, в частности вытащить адрес электронной почты пользователя.В отличие от почти всех примеров, которые я могу найти, Rocket Chat не использует никаких конструкций, таких как «Next», - он использует счетчик и смещение, что, как я уже говорил, могло бы сделать это проще.Мне удалось получить первую часть этой работы, перебирая JSON и получая электронные письма.Что мне нужно сделать, так это циклически пройти через конечные точки API - вот с чем я столкнулся с некоторой проблемой.
Я посмотрел на этот ответ Невозможно просмотреть циклически обработанные ответы API с помощью 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-адрес, если бы не все переменные и конкатенации, выглядел бы примерно так:

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

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

1 Ответ

0 голосов
/ 06 марта 2019

Итак, после расспросов я обнаружил, что был на правильном пути, чтобы выяснить эту проблему, я просто попытался в неправильном месте.Вот что я получил в итоге:

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, чтобы другие могли его увидеть.

...