如何在Google Sheets中登录需鉴权网站抓取Canvas成绩数据
解决方法
你使用的IMPORTXML是Google Sheets内置的无状态抓取函数,不会携带Canvas平台的登录身份凭证,因此请求成绩页时会被重定向到登录页面,无法抓取到目标成绩数据。
方案1:使用Canvas官方API(最稳定,推荐)
- 步骤1:获取Canvas API访问令牌
登录你的Canvas账号,进入「账户」-「设置」,下拉到「已批准的集成」区域,点击「+ 新访问令牌」,自定义填写令牌用途、过期时间后生成,复制生成的令牌(令牌仅显示一次,需妥善保存) - 步骤2:在Google Sheets中配置自定义脚本
打开目标Google Sheets,点击顶部菜单栏「扩展程序」-「Apps 脚本」,删除默认代码后粘贴以下代码:function getCanvasGrades() { // 替换为你自己的Canvas访问令牌 const API_TOKEN = "YOUR_CANVAS_API_TOKEN"; const CANVAS_DOMAIN = "https://learn.canvas.net"; const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 写入表头 let currentRow = 1; sheet.getRange(currentRow, 1).setValue("课程名称"); sheet.getRange(currentRow, 2).setValue("当前成绩"); sheet.getRange(currentRow, 3).setValue("最终成绩"); currentRow++; try { // 获取当前账号下的活跃课程列表 const courseResp = UrlFetchApp.fetch(`${CANVAS_DOMAIN}/api/v1/courses?enrollment_state=active`, { headers: { "Authorization": `Bearer ${API_TOKEN}` } }); const courses = JSON.parse(courseResp.getContentText()); // 遍历拉取每门课的成绩 courses.forEach(course => { if(!course.id || !course.name) return; const gradeResp = UrlFetchApp.fetch(`${CANVAS_DOMAIN}/api/v1/courses/${course.id}/enrollments?user_id=self`, { headers: { "Authorization": `Bearer ${API_TOKEN}` } }); const enrollment = JSON.parse(gradeResp.getContentText())[0]; const currentGrade = enrollment?.grades?.current_score || "暂无"; const finalGrade = enrollment?.grades?.final_score || "暂无"; // 写入表格 sheet.getRange(currentRow, 1).setValue(course.name); sheet.getRange(currentRow, 2).setValue(currentGrade); sheet.getRange(currentRow, 3).setValue(finalGrade); currentRow++; }) } catch (e) { SpreadsheetApp.getUi().alert("拉取成绩失败:" + e.toString()); } } - 步骤3:运行脚本拉取成绩
替换代码中的YOUR_CANVAS_API_TOKEN为你之前生成的令牌,点击保存,然后点击运行按钮,第一次运行需要按照提示完成Google账号授权,授权完成后成绩会自动写入当前表格中。
方案2:携带Cookie临时抓取(仅应急使用,不稳定)
如果不想申请API令牌,可以用携带登录态Cookie的方式临时抓取,缺点是Cookie过期或者退出Canvas账号后就会失效,需要重新操作:
- 登录Canvas平台后打开成绩页,按F12打开浏览器开发者工具,切换到「网络」面板,刷新页面,找到请求地址为
https://learn.canvas.net/grades的请求,点击进入后在「请求头」区域复制完整的Cookie字段内容 - 同样打开Apps Script,使用以下代码抓取解析页面:
function getGradesWithCookie() { const cookie = "你复制的完整Cookie内容"; const resp = UrlFetchApp.fetch("https://learn.canvas.net/grades", { headers: { "Cookie": cookie } }); const content = resp.getContentText(); // 后续可自行用XmlService解析内容提取td节点,或直接用正则匹配成绩 const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); sheet.getRange(1,1).setValue(content); }
内容的提问来源于stack exchange,提问作者UFTaco
相关产品推荐
相关产品推荐

