studio

按官方说法:

Studio是课程制作系统,课程团队使用它来创建和更新课程。Studio将课程内容写入到Mongo数据库中,之后LMS从中读取课程内容

参考我的译文:Open edX体系架构

架构

从技术角度来看,studio是个web服务,而且是个前端很重的web服务(mvc/模块化)。edx的课程制作后台,复杂而强大,官方好像并不认为适合用移动端来做,他们压根没构建RESTful接口

需求

随着对平台的深入了解和使用,我们可能会想把一些重复性的劳动自动化,诸如批量构建课程、批量备份、批量添加老师、批量构建结构化课程。人力来做的麻烦除了耗费精力,还容易出错

如何使studio可编程控制,是一个随着使用深入可能遇到的需求

思路

这个问题,我最初的想法是翻后台源码,看看它们的实现,看看是否有可能引出资源的RESTful接口,只要有小而美的接口,组合它们来完成任务就不麻烦

切入点从前端入手,之后跟踪请求,找到请求的后端实现,然后重新封装实现,引为外部接口,这部分的探索你可以从我的edx_siteapi提交记录中看到

后来偶然的机会在github上看到@pmitros的实现:edx-rest,pmitros来自mit,是edx项目的首席科学家、创始人之一,他采用了爬虫的思路

爬虫视角

爬虫爬取一个页面,通常是为了采集数据,爬取的过程常常会涉及与页面交互,点击以获取更多数据或是进入其他链接,而我们在一个页面中点击操作完成任务,常常也是点击链接的过程,如此一来爬虫与页面的交互,很自然地被用来自动化完成任务(很像批处理)

对服务器来说,爬虫对页面的操作,与用户的操作不可区分(等效),这么一来,理论上,任何能在open edx studio里做的事,都能采用爬虫完成

说到爬虫,最近edx官方源码库出现了一个活跃的爬虫项目:pa11ycrawler,基于Scrapy,用于检测页面的可访问性(是否挂掉)

多说一句,如果你想反爬虫,尤其是对付那些会动态ip切换的老手的话,可以使用机器学习观察他们的行为模式(我在一些技术会议上遇到过这么做的公司)

技术细节

我们知道studio需要登录,所以爬虫需要伪造为有效用户,你需要使用浏览器取得当前账号的csrftoken和sessionid,之后爬虫就会以你的身份去和服务器交互。如果你对http协议熟悉,了解cookie/session的概念,你知道只要我们取得cookie,就可以伪装成用户身份。许多著名的网络攻击都用到cookie

当我们能用程序伪装为浏览器时,剩下的细节就是找到功能对应的请求,分析http请求,并仿造即可(chrome调试工具里的network会帮上大忙)

这样做的好处

采用爬虫来使studio可编程的好处很多:

  • 非侵入。我们获得这些功能的同时,没有入侵源码
  • 操作直接,简易。不涉及open edx的内部逻辑
  • 权限合理,因为爬虫模拟的用户是合法用户,爬虫权限和用户一致,这样一来,爬虫的改进可以是自下而上的,不需要网站管理员干预
  • 易于分发,爬虫实际是python包,可以运行在任何能联网的机器上
  • 用户自主,用户可以自行为studio的操作编程

后来我的edx_siteapicourse_backup都推翻原有设计,采用基于edx-rest的方式来构建

我的补充

edx-rest只支持studio,我把爬虫对接到lms:edx_lms_rest.py,如此一来,lms上能在网页上操作的项目,也都能由爬虫自动化完成了

我给出了往课程里批量化注册学生的例子,并且封装为RESTful服务,使用方法也给出了:enrollment批量选修课程,细节看源码

其他思路

如果你对 爬虫/http请求 不熟悉,可能会觉得让爬虫模拟浏览器不是建轻松的工作,教你另一种巧妙的方式:使用自动化测试工具, 下边是我们常用的工具,即便对那些熟悉爬虫的人来说,遇到前端特别复杂的页面,他们也偏好这些工具

  • PhantomJS
  • webdriver/selenium