【问题标题】:Programmatically attaching file to desire2learn Dropbox feedback以编程方式将文件附加到desire2learn Dropbox反馈
【发布时间】:2015-09-24 00:40:00
【问题描述】:

以下是我对将文件上传到实体的保管箱提交时所需的操作顺序的理解:

  1. 为用户创建反馈(在我的例子中,我正在自动填充量规评估)
  2. 上传文件,接收唯一文件密钥
  3. 使用在 (2) 中收到的密钥将该文件附加到用户的反馈中

我可以使用网络界面为用户上传一个文件到 d2L,但如果我通过自动化准备反馈,显然我想简化这个。我现在的状态是:

  1. 为用户创建反馈(在我的例子中,我正在自动填充量规评估)(200 - 成功)
  2. 上传文件,接收唯一文件密钥(200 - 成功)
  3. 使用在 (2) 中收到的密钥将该文件附加到用户的反馈中(404 - 未找到)

我一直在努力解决如何调试上传文件并将其附加到 Dropbox 反馈。我按照http://docs.valence.desire2learn.com/basic/fileupload.html#resumable-uploads 的可恢复上传说明进行操作,并且(通常)一切正常,但是在将该上传的文件附加到该实体的保管箱文件夹时,我遇到了最终的 404 错误。

以下是我的调试输出,它展示了我所理解的系统状态。

注意:我在外部编辑器中使用搜索和替换替换了 COURSEID、DROPBOXID、ENTITYID 和一些键,以保持安全性。

POST /d2l/api/le/1.4/COURSEID/dropbox/folders/DROPBOXID/feedback/user/ENTITYID

将反馈发布到该用户的 Dropbox

{}

确认发帖成功

filepath=092215-0952/Testing Download Sep 21, 2015 1114 AM_upload/ENTITYID-DROPBOXID - Student Name-Due 18, YYYY TIME AM - netid_assignmentname.zip_upload.zip
length=76630
https://d2l.domain.tld/d2l/api/le/1.4/COURSEID/dropbox/folders/DROPBOXID/feedback/user/ENTITYID/upload?x_b=_________USERID___________&x_c=_________KEY_I_DONT_UNDERSTAND___________&x_a=_________APP_ID___________&x_d=_________ANOTHER_KEY_I_DONT_UNDERSTAND___________&x_t=1443053113
{'Content-Length': '76630', 'User-Agent': 'python-requests/2.7.0 CPython/3.3.6 Darwin/14.5.0', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'Accept': '*/*', 'X-Upload-Content-Type': 'application/zip', 'X-Upload-File-Name': 'temp.zip', 'X-Upload-Content-Length': '76630'}
Received new URL to which to upload this file: revising post for this fileKey
result=qafSoMUYAm
https://d2l.domain.tld/d2l/upload/qafSoMUYAm
result of revised post is 200

这样,我似乎启动并完成了可恢复上传。我会说,这部分通过 valence 的说明变得更容易了,但是我在尝试调试它之前一直在抱怨,直到我意识到 d2lservice 中的一些内置 post 命令总是会失败,因为我不得不在第一次发布后更改 URL。 :) 顺便说一句,如果我故意弄乱文件长度的字节数,我可以让它返回 416。我这样做是为了确保我没有因为错误的原因获得 200。

fileKey=qafSoMUYAm, attaching to the dropbox now
GET /d2l/api/le/1.1/COURSEID/dropbox/folders/DROPBOXID/feedback/user/ENTITYID
Feedback exists for org_unit_id=COURSEID,folder_id=DROPBOXID,entity_id=ENTITYID

在这里,我确保该用户的反馈确实存在,因此我可以将 URL 与下面失败的 URL 进行比较。注意:我对几乎所有内容都使用 1.4 版本,但在下面的示例中,我将版本硬编码为 1.1,以防 API 存在版本差异;我尝试了 1.1、1.4,但没有别的。

我还将反馈强制标记为 feedback['IsGraded']=False,以防由于某种原因,如果反馈已发布,则无法将文件添加到反馈中。然后我重新发布反馈(在将其标记为未评分后),并尝试将上传的文件附加到此反馈中。另一个变量是我还尝试(并删除了)在帖子中使用 fileName 参数(它在 API 中列为可选)。

POST /d2l/api/le/1.4/COURSEID/dropbox/folders/DROPBOXID/feedback/user/ENTITYID
I am turning on debug now...
ready for POST=/d2l/api/le/1.1/COURSEID/dropbox/folders/DROPBOXID/feedback/user/ENTITYID/attach
INFO:requests.packages.urllib3.connectionpool:Starting new HTTPS connection (1): d2l.domain.tld
send: b'POST /d2l/api/le/1.1/COURSEID/dropbox/folders/DROPBOXID/feedback/user/ENTITYID/attach?fileKey=qafSoMUYAm&x_b=_________USERID___________&x_a=_________APP_ID___________&x_d=sw6PXGCvBOsBj07VJCPu4RJ6hN8AN7OIId2ONOj-_CA&x_t=1443053116&x_c=LIrzfSOnb8rz3wkN-ZTbfnckwvrfheUU9kkarOhGpok HTTP/1.1\r\nHost: d2l.domain.tld\r\nConnection: keep-alive\r\nUser-Agent: python-requests/2.7.0 CPython/3.3.6 Darwin/14.5.0\r\nContent-Length: 0\r\nAccept: */*\r\nAccept-Encoding: gzip, deflate\r\n\r\n'
reply: 'HTTP/1.1 404 Not Found\r\n'
DEBUG:requests.packages.urllib3.connectionpool:"POST /d2l/api/le/1.1/COURSEID/dropbox/folders/DROPBOXID/feedback/user/ENTITYID/attach?fileKey=qafSoMUYAm&x_b=_________USERID___________&x_a=_________APP_ID___________&x_d=sw6PXGCvBOsBj07VJCPu4RJ6hN8AN7OIId2ONOj-_CA&x_t=1443053116&x_c=LIrzfSOnb8rz3wkN-ZTbfnckwvrfheUU9kkarOhGpok HTTP/1.1" 404 0

所以,我在尝试发表这篇文章时收到了 404,下面还有一堆来自 Python 的错误,这些错误并没有真正的帮助(但我还是把它们包括在内)。

header: Server header: X-XSS-Protection header: X-UA-Compatible header: X-Powered-By header: Date header: Content-Length header: Set-Cookie <Response [404]>
Traceback (most recent call last):
  File "../valence/sprinkle/production/postgradenoui.py", line 239, in <module>
    print(postGrades_handler(dropboxid, gradeddirname,gradeddir_uploadname))
  File "../valence/sprinkle/production/postgradenoui.py", line 230, in postGrades_handler
    result = sprinkleutil.postRubricFeedback(request, _ac, dropboxid, gradeddirname, _CFG_COURSE['courseorgunit'], gradeddir_uploadname)
  File "/Users/sprinkle/work/teaching/ece275-2015F/grading/valence/sprinkle/production/sprinkleutil.py", line 1279, in postRubricFeedback
    upload_feedback_files_for_dropbox_feedback(uc,orgunitNeeded,dropboxNeeded,dir,dbfFile,'1.4')
  File "/Users/sprinkle/work/teaching/ece275-2015F/grading/valence/sprinkle/production/sprinkleutil.py", line 791, in upload_feedback_files_for_dropbox_feedback
    result = attach_uploaded_file(uc,org_unit_id,folder_id,entity_id,fileKey,'temp.zip')
  File "/Users/sprinkle/work/teaching/ece275-2015F/grading/valence/sprinkle/production/sprinkleutil.py", line 523, in attach_uploaded_file
    return d2lservice._fetch_content(r)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/d2lvalence_util/service.py", line 46, in _fetch_content
    r.raise_for_status()
  File "/opt/local/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/requests/models.py", line 851, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 404 Client Error: Not Found

感谢任何成功执行这一系列操作的人的指点。我的 d2l 管理员没有带宽来支持我,我不确定我是否可以访问日志,所以我不知道如何改进我这边的调试。提前致谢!

【问题讨论】:

    标签: python desire2learn


    【解决方案1】:

    对于您的附加阶段,您似乎将fileKey 作为查询参数发送。应该是 POST 表单参数吧?

    所以 POST 的内容类型将是 application/x-www-form-urlencoded,而 POST 正文本身将是

    fileKey=qafSoMUYAm&fileName=SomeFileName.zip
    

    例如,请参阅How to mimic an HTML form submission in a POST request

    【讨论】:

    • 我正在从事类似的任务,我相信这一定能奏效
    • 很遗憾我仍然没有得到爱,但我会继续努力。我希望使用 valence 的 API 测试工具,但是没有 application/x-www-forum/urlencoded 来测试它。是否可以改为通过 JSON 发送这些数据?我试过了,但没有运气......
    • @victor-haag 我还在为此苦苦挣扎,您能否确认以下内容是“正确的”?发送:b'POST /d2l/api/le/1.4/COURSEID/dropbox/folders/DROPBOXID/feedback/user/USERID/attach?x_b=_________USERID___________&x_a=_________APP_ID___________&x_d=____something_else____&x_t=1443053116&x_c=____something_else_再次\主机___d2l/1.1\r .domain.tld\r\nAccept: */*\r\nContent-Type: application/x-www-forum-urlencoded\r\nContent-Length: 18\r\nConnection: keep-alive\r\nUser-Agent : python-requests/2.7.0 CPython/3.3.6 Darwin/14.5.0\r\nAccept-Encoding: gzip, deflate\r\n\r\nfileKey=2lIVkRyXEc'
    • 我相信你不能只在这里提供文件密钥;您是否还必须提供文件名,就像我的答案中的示例一样?
    • API 将其列为可选,我已尝试两种方式,但均无济于事。我还使用 urlencode 从 .zip 文件名中删除了空格和其他字符(尽管我不知道是否需要这样做)。
    猜你喜欢
    • 2018-01-07
    • 2015-04-13
    • 2013-04-09
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-31
    • 2021-11-19
    • 1970-01-01
    相关资源
    最近更新 更多