Как получить множественный API пагинации в скрипте Python? - PullRequest
0 голосов
/ 03 января 2019

Я изучаю Python и хочу использовать API.Я делаю небольшие программы для получения информации и блокирую свою следующую программу.Я хочу создать программу для удаления всех учеников из моего школьного API.Проблема заключается в ограничении нумерации страниц, я получаю 15 пользователей, но не всех.

Я ищу документацию по использованию.Я пытаюсь получить информацию с помощью цикла «for» и конкретных параметров API:

Заголовок ответа HTTP Link содержит данные разбиения на страницы со ссылками на первую, предыдущую, следующую и последнюю необработанные страницы, когда они доступны, в разделеформат

ссылка: http://xxx.intra.xxx.fr/v2/{Resource}?page=X+1; rel = "next", http://xxx.intra.xxx.fr/v2/{Resource}?page=X-1; rel = "prev", http://xxx.intra.xxx.fr/v2/{Resource}?page=1; rel = "first", http://xxx.intra.xxx.fr/v2/{Resource}?page=X+n; rel = "last"

Проблема, я не знаю, чтобы удалить всю информацию на всех страницах, не только на первой странице.Код моей программы:

import requests
import json
import sys
from sys import argv
from operator import itemgetter, attrgetter
import json  
import os


UID = 'REDACTED_USER_ID'
SECRET = 'REDACTED_SECRET_KEY'

class CONST(object):
   try:
      campus = sys.argv[1]
      month = sys.argv[2]
      year = sys.argv[3]
  except:
     print("Error : aucun argument")
     print('Usage: "campus_id" (EX:1) "month" (july) "year" (2016)')
     exit()

  d = {'grant_type': 'client_credentials', 'client_id': UID, 'client_secret': SECRET}
  r = requests.post("https://api.intra.xxx.fr/oauth/token", data=d)
  token = r.json()['access_token']
  print(token)
  h = {'Authorization': 'Bearer ' + token}
  get_students = requests.get('https://api.intra.xxx.fr/v2/cursus/1/users?filter[primary_campus_id]=' + campus + '&filter[pool_month]=' + month + '&filter[pool_year]=' + year + '&sort=login', headers=h)

def __setattr__(self, *_):
    pass

CONST = CONST()

def campus_id(CAMPUS, MONTH, YEAR, *args):
    campus = CAMPUS
    if str.isnumeric(campus):
        return(campus)
    else:
        print("Error : campus_id requiert un chiffre")
        print('Usage: "campus_id" (EX:1) "month" (july) "year" (2016)')
        exit()

def pool_month(CAMPUS, MONTH, YEAR, *args):
    month = MONTH
    if str.isalpha(month):
        return(month)
    else:
        print("Error : pool_month requiert un mois en lettre")
        print('Usage: "campus_id" (EX:1) "month" (july) "year" (2016)')
        exit()

def pool_year(CAMPUS, MONTH, YEAR, *args):
    year = YEAR
    if str.isnumeric(year):
        return(year)
    else:
        print("Error : pool_year requiert au moins un chiffre")
        print('Usage: "campus_id" (EX:1) "month" (july) "year" (2016)')
        exit()

def get_infos(CAMPUS, MONTH, YEAR, *args):
    if len(argv) != 4:
        print('Wrongs arguments !')
        print('Usage: "campus_id" (EX:1) "month" (july) "year" (2016)')
        exit()

    campus = campus_id(*argv[1:], *argv[2:], *argv[3:])
    month = pool_month(*argv[1:], *argv[2:], *argv[3:])
    year = pool_year(*argv[1:], *argv[2:], *argv[3:])
    get_level = CONST.get_students
#  print(json.dumps(get_level.json(),indent=4))
    level = get_level.json()
    tab = []
    for item in level:
        tab.append(item['login'])
    chain = ' \n'.join(tab)
    fichier = open("test.out", "w")
    fichier = open("test.out", "a")
    fichier.write(chain + "\n")
    fichier.close()

if __name__ == '__main__':
    test = get_infos(*argv[1:], *argv[2:], *argv[3:])
    print(test)

код:

for item in level:
    tab.append(item['login'])

- это мой список массивов с логинами, которые я нашел (например: на данный момент у меня есть "a" "b" "c"" d "), и я хочу получить всех пользователей

пример консоли:

> api-test python3 api-test3.py "1" "september" "2017"
> api-test 
> cat test.out
aaiche
abaille
abezanni
abouquet
acourtin
adfourca
adpusel

1 Ответ

0 голосов
/ 03 января 2019

С помощью функции requests.get вы должны передать параметры запроса в аргументе ключевого слова params.

Так что вы хотели бы что-то вроде

# ... earlier stuff
h = {'Authorization': 'Bearer ' + token}
params = {
    'filter[primary_campus_id]': campus,
    'filter[pool_month]': month,
    'filter[pool_year]': year,
    'sort': 'login'
}
get_students = requests.get('https://api.intra.xxx.fr/v2/cursus/1/users', params=params, headers=h)

# and so on ...

Чтобы ответить, в частности, на вопрос о разбиении на страницы, вы хотите добавить дополнительный параметр page в словарь params. Таким образом, вы можете добавить цикл

params = { ... }  # as before
for page_idx in range(number_of_pages):
    params['page'] = page_idx
    get_students_page = requests.get(...)
    # combine the outputs somehow, but that depends on the response
# and so on...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...