๐Ÿฅน(์ดˆ๋ณด)Canvas LMS API ๋ถ„์„ํ•˜๊ธฐ (๋Œ€ํ•™ ๊ฐ•์˜ ์‚ฌ์ดํŠธ)

rethinkingยท2023๋…„ 8์›” 29์ผ
2
post-thumbnail

โš ๏ธ๊ณต์‚ฌ์ค‘, ์„ค๋ช…์ด ์ค‘๊ตฌ๋‚œ๋ฐฉ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
์–ธ์  ๊ฐ€.. ๊ธ€ ์ž˜์“ฐ๊ฒŒ ๋˜๋ฉด ๋‹ค๋“ฌ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค

๐Ÿ™‚์•Œ์•„๋ณด๊ธฐ

API ์ฐพ๊ธฐ ์œ„ํ•œ ๊ณผ์ •

์ฒ˜์Œ์—” api๋ฅผ ๊ฒ€์ƒ‰ํ•ด๋ดค์ง€๋งŒ, ๋„์ €ํžˆ ๋‚ด ๋Œ€ํ•™๊ต๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ๊ณผ ๊ฐ™์€ api ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜์˜€๋‹ค
ํ˜„์žฌ ๋Œ€ํ•™๊ต์—์„œ ์‚ฌ์šฉ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ
์ง€๊ธˆ ๋ณด๋‹ˆ Extended๋ผ ์ ํ˜€์žˆ๋Š”๋ฐ ์˜์–ด๋ฅผ ๋ชปํ•œ๊ฑฐ์˜€๋„ค์š”
๊ทธ๋ž˜์„œ ๋˜ ์—ด์–ด์„œ ์Šคํฌ๋ž˜ํ•‘ ํ•ด์•ผ ํ•˜๋Š”๊ฑด๊ฐ€? ๋กœ๊ทธ์ธ์€ ์–ด๋–ป๊ฒŒ ํ•˜์ง€? ํ•˜๋Š” ์žก์ƒ๊ฐ์ด ๋“ค์–ด์„œ ๋จธ๋ฆฌ๊ฐ€ ์–ด์ง€๋Ÿฌ์›Œ์งˆ๋•Œ์ฏค
์ต๋ช…๊ฐœ๋ฐœ์นดํ†ก

๊ณต์‹ Canvas API ๋ฌธ์„œ

๋ˆ„๊ฐ€ API๋ฅผ ์ฐพ์•„์ฃผ์…จ๋‹ค ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

โญpython ๋™์ž‘

์ดˆ๋ณด๋ผ? REST? ํ• ์ค„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค

๋ˆ„๊ฐ€ ์ด๋ฏธ python์œผ๋กœ ๋งŒ๋“ค์–ด ๋†“์ง€ ์•Š์•˜์„๊นŒ ์ƒ๊ฐํ•ด์„œ ์ฐพ์•„๋ดค๋‹ค.
ucfopen/canvasapi
์ด๋ฏธ ์žˆ์–ด์„œ ๊ฐ„ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋งค์šฐ ๊ณ ๋งˆ์šฐ๋‹ˆ star ๋ˆ„๋ฅด๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ

ucfopen/canvasapi
๊ทธ๋ฆฌ๊ณ  docs๊ฐ€ ๊น”๋”ํ•˜์ง„ ์•Š์ง€๋งŒ ์žˆ๋Š”๊ฑฐ๋กœ ๋งŒ์กฑํ•ด์š”

๐Ÿ”์‚ดํŽด๋ณด๊ธฐ

๋ญ˜ ์ฐพ์•„์•ผ ํ•˜๋Š”๊ฐ€?

์ผ๋‹จ ํ•™๊ต์—์„œ ์‚ฌ์šฉ์ค‘์ธ ํƒญ์„ ์‚ดํŽด๋ณด์ž

๊น”๋”ํ•˜๊ฒŒ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„ ๋ณด์ด์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ๊ฐ•์˜ ์ปจํ…์ธ ํƒญ์€ ์‹คํ–‰ ์†๋„๊ฐ€ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ , ๊ณผ์ œ ๋ฐ ํ‰๊ฐ€์—๋Š” ๊ณผ์ œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ณต์ง€๊นŒ์ง€ ํ‘œ์‹œ๊ฐ€ ๋˜๋Š” ๋“ฑ ์—ฌ๋Ÿฌ๋ฏ€๋กœ ๋ถ„๋ฆฌ๊ฐ€ ์ž˜ ์•ˆ๋˜์–ด์žˆ๋‹ค.

์ง€๊ธˆ ์ถ”์ธกํ•˜๊ฑด๋ฐ, ์•„๋งˆ ๊ธฐ์กด Canvas LMS๋ฅผ ์“ฐ์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•จ์— ๋”ฐ๋ผ ๋‚˜์˜จ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹Œ๊ฐ€ ์‹ถ๋‹ค.

์ด๋Ÿฐ ์ถ”์ธก์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š”๊ฒŒ, ๋ฌธ์˜๊ฒŒ์‹œํŒ ๋ถ€ํ„ฐ ๊ฐ•์˜์ž๋ฃŒ์‹ค ๋“ฑ์˜ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํƒญ์˜ ๋งํฌ๊ฐ€ external_tools๋กœ ๋Œ€์ถฉ ์ •๋ฆฌ๊ฐ€ ๋˜์–ด์žˆ๋‹ค

์•„๋ฌดํŠผ ์šฐ๋ฆฌ๋Š” ๊ฐ•์˜ ์ •๋ณด์™€ ๊ณผ์ œ, ์ปจํ…์ธ , ๊ณต์ง€๋ฅผ api๋ฅผ ํ†ตํ•ด ์ฐพ์•„์•ผ ํ•œ๋‹ค

์ž˜ ์ž‘๋™ํ•˜๋Š”๊ฐ€?

ํŒจ์บ์ง€์— ๋‚˜์™€์žˆ๋Š” ๋Œ€๋กœ ์ผ๋‹จ ๋”ฐ๋ผ๊ฐ€ ๋ณด์ž, canvas ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ์œ„ํ•ด์„œ๋Š” API_URL (๋ณดํ†ต์€ ๋Œ€ํ•™๊ต LMS ์ฃผ์†Œ์ด๋‹ค), token(LMS ๋กœ๊ทธ์ธ ํ›„ ์„ค์ •๋ž€์—์„œ token์„ ๋ฐ›์•„์˜ฌ ์ˆ˜ ์žˆ๋‹ค)์ด ํ•„์š”ํ•˜๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์–ป์–ด์™€์•ผ ํ•  ์ •๋ณด๋Š” Course ๊ฐ•์˜ ์ •๋ณด์ด๋‹ค
๊ฐ•์˜ ์ •๋ณด๋ฅผ ์ž˜ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์žˆ๋Š”์ง€ ์ฒดํฌํ•ด๋ณด์ž

import canvasapi
canvas = canvasapi.Canvas(API_URL, TOKEN)
for course in canvas.get_courses():
    try:
        print(course)
    except AttributeError:
        pass

AttributeError ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ์ด์œ ๋Š” course ๋ฐ์ดํ„ฐ ์ค‘์— ๊ถŒํ•œ์ด ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜ ๋น„์–ด์žˆ๋Š” course๊ฐ€ ์กด์žฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.. ์•„๋งˆ ์ „ํ•™๊ธฐ์— ๋“ค์—ˆ๋˜ ๊ฐ•์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋˜์–ด์žˆ๋Š”๊ฒŒ ์•„๋‹๊นŒ ์ถ”์ธกํ•ด๋ณด๋ฉฐ, ํ˜„์žฌ ๊ฐ•์˜ ์ •๋ณด๋งŒ ์ž˜ ๊ฑธ๋Ÿฌ๋‚ด์ž.

๐Ÿค” PaginatedList๊ฐ€ ๋ญ์ฃ ?

Canvas.get_courses() ํ•จ์ˆ˜ ์„ค๋ช…๋ฌธ

๐Ÿ”๋”ฐ๋กœ ๋ถ„์„ํ•ด๋ณด์•˜๋‹ค!๐Ÿ”

๊ถŒํ•œ์ด ๋ถ€์กฑํ•˜์ง€๋งŒ ์ƒ๊ด€์ด ์—†์–ด์š”

๊ฐ€๋”์”ฉ ๊ถŒํ•œ์ด ๋ถ€์กฑํ•˜๋‹ค๋Š” ๋ฉ”์„ธ์ง€์™€ ํ•จ๊ป˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ๋‚ด๋ฟœ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์‹ฌ์ง€์–ด ๊ถŒํ•œ์ด ๋ถ€์กฑํ•˜์ง€๋„ ์•Š์€๋ฐ ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„์„œ (api์—๋Š” ์„ ํƒ์ ์œผ๋กœ ์กด์žฌํ•œ๋‹ค๊ณ  ํ‘œ์‹œ ๋˜์–ด์žˆ๋‹ค) ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ด๋ฅผ ์กฐ์‹ฌํ•˜๋ฉฐ ๊ธฐ๋กํ•ด๋‚˜๊ฐ€๋ฉด์„œ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€๋ณด์ž.

๐Ÿ˜Š ๊ตฌ์กฐ ๋ถ„์„ & ์ž๋ฃŒ ์ •๋ฆฌ

์žฌ๋ฏธ๋กœ ๋œฏ์–ด๋ณธ๊ฑด ์•„๋‹ˆ๊ณ  ํ•˜๋„ ์›ํ•˜๋Š” ์ •๋ณด๊ฐ€ ์•ˆ๋‚˜์™€์„œ ๋ถ„์„ํ•œ ๊ฒฐ๊ณผ์ด๋‹ค

๊ณต์‚ฌ์ค‘, ์กฐ๊ธˆ๋” ๋‚ด์šฉ์„ ๋„ฃ์„ ์˜ˆ์ •์ž…๋‹ˆ๋‹ค!

  • Course : ๊ฐ•์˜ ๊ฐ์ฒด์ด๋‹ค. ํ˜„์žฌ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š” ๊ฐ•์˜์ธ์ง€ ์ž˜ ์‚ดํŽด๋ด์•ผ ํ•œ๋‹ค. get_courses()๋ฅผ ํ†ตํ•ด Canvas ํด๋ž˜์Šค์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
    • id : ๊ฐ•์˜์˜ ๊ณ ์œ  id ๊ฐ’์ด๋‹ค.
    • name : ๊ฐ•์˜์˜ ์ด๋ฆ„ ๊ฐ’์ด๋‹ค.
  • Assignment : ๊ณผ์ œ(๋ผ๊ณ  ๋ถ€๋ฅด์ง€๋งŒ ์ปจํ…์ธ  ์žกํƒ•) ๊ฐ์ฒด์ด๋‹ค. get_assignments()๋ฅผ ํ†ตํ•ด Course ํด๋ž˜์Šค์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
    • id : ๊ณผ์ œ์˜ ๊ณ ์œ  id ๊ฐ’์ด๋‹ค.
    • workflow_state : ํ˜„์žฌ ๊ณผ์ œ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ณผ์ œ์˜ ์ข…๋ฅ˜๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค..
  • Module : ๋ชจ๋“ˆ์ด๋ผ ๋˜์–ด์žˆ์ง€๋งŒ, ๋ฌถ์Œ ์ด๋ผ ์ƒ๊ฐํ•˜๋Š”๊ฒŒ ํŽธํ•˜๋‹ค. get_modules()๋ฅผ ํ†ตํ•ด Course ํด๋ž˜์Šค์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

    TODO : ๋” ์ž‘์„ฑํ•  ๊ฒƒ (์กธ๋ ค์ž‰)

๋œฏ์–ด๋ณด๋ฉฐ ์ •๋ฆฌํ•œ ์ž๋ฃŒ (๋งˆํฌ๋‹ค์šด)

๐Ÿ“‘ํ•ด์•ผ ํ•  ๊ฒƒ (OAuth)

์ดˆ๋ฐ˜์— ๋งŒ๋“ค ๋•Œ์—๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ง์ ‘ ๋‚ด ๋ฐ์ดํ„ฐ ์ •๋ณด๋ฅผ ํ† ํฐ์„ ๋งŒ๋“ค์–ด์„œ ๋ฐ›์•„์™€์•ผ ํ–ˆ๋‹ค.
๋Œ€ํ•™๊ต ์•ˆ ์ธ์ฆ ํ† ํฐ

๋Œ€ํ•™ ์‚ฌ์ดํŠธ๋ฅผ ๊ฐ€์ ธ์˜ฌ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์—ˆ์œผ๋‹ˆ, ์ด์ œ ์‚ฌ์šฉ์ž๊ฐ€ ์ด ํ”„๋กœ๊ทธ๋žจ์„ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ์‚ฌ์šฉ์ž์˜ LMS ์‚ฌ์šฉ ์š”์ฒญ์„ ๋ฐ›๋Š” OAuth๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค

๊ทธ๋Ÿฐ๋ฐ..

์ฐธ๊ณ : ๊ฐœ๋ฐœ์ž ํ‚ค๋Š” ๊ณ„์ • ๊ถŒํ•œ์ž…๋‹ˆ๋‹ค. ๊ณ„์ • ํƒ์ƒ‰์—์„œ ๊ฐœ๋ฐœ์ž ํ‚ค ๋งํฌ๋ฅผ ๋ณผ ์ˆ˜ ์—†๋‹ค๋ฉด ํ•ด๋‹น ์‚ฌ์šฉ์ž ๊ณ„์ •์— ๋Œ€ํ•ด ์ด ๊ถŒํ•œ์ด ํ™œ์„ฑํ™”๋˜์ง€ ์•Š์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

โ˜น๏ธ

๊ณ ๋‚œ์ด ์˜ˆ์ƒ๋œ๋‹ค!

profile
๐Ÿต ๋– ์˜ค๋ฅด๋Š”๊ฑด ๋งŽ์€๋ฐ ๊ท€์ฐฎ์•„์š” ์กธ๋ ค์š”

1๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2024๋…„ 9์›” 17์ผ

์•ˆ๋…•ํ•˜์„ธ์š”! ๋น„์Šทํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ์ƒ์ค‘์ธ๋ฐ ์ฒ˜์Œ์œผ๋กœ ํ•œ๊ธ€๋กœ ์ •๋ฆฌ๋œ ๊ธ€์„ ์ฐพ์•˜๋„ค์š”!
'๋œฏ์–ด๋ณด๋ฉฐ ์ •๋ฆฌํ•œ ์ž๋ฃŒ (๋งˆํฌ๋‹ค์šด)' ํ•ด๋‹น ๋งํฌ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์•„์„œ ํ˜น์‹œ ์ž๋ฃŒ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•˜์‹œ๋‹ค๋ฉด ๋ถ€ํƒ๋“œ๋ ค๋„ ๋ ๊นŒ์š”?

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ