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