BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

百度开放云骑士之夜:“基于百度开放云的营销插件平台”的作品简析

| 作者 水羽哲 关注 0 他的粉丝 发布于 2013年7月12日. 估计阅读时间: 6 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

在6号的百度开放云骑士之夜的活动中,有幸在36小时的编码之后获得了比赛的一等奖,这里写下自己在整个比赛中的感受以及作品的技术选型方案。

创意背景

营销总是商业活动中一个重要的环节,而微博、微信的广泛普及能够让商家的营销活动以更低的成本获取更好的效果,虽然微信和微博都开放了他们的API,但是并不是每一个商家都有自己的技术力量来做实现,因此项目的思路是基于百度开放云(BAE)的计算能力结合这些社交平台的API,让营销的活动更加简单。商家只需要在平台之上,通过一些简单的配置即可将一个完善的营销CMS跑起来。

技术选型

36个小时的时间有限,所以实现中以微信的API为主。对于微信,我认为他是一个I/O的系统,项目期望能够在I(输入)环节之前加入Trigger,在O(输出)之前加入Response,即一个完整的流程应该是:用户输入信息,触发相应的应答机制。

每一个的触发和回复都将是一个具体的环节,由一组插件负责进行。那么,在此之上可以将接口开放,让一般的开发者能够也利用这个平台提交自己的插件,进而形成一个插件市场。

对于这样的一个平台,他需要具有如下的能力:

  1. 开发的插件架构
  2. 动态的路由配置
  3. 上下文相关的用户命令
  4. 强大的API负载能力

比赛时使用Python语言,框架选取的Flask,由于Flask框架简单、可靠、轻量级,适合做为API的调用;服务器端的需求是在短时间内选择一个简单、可靠、可扩展的平台来支持程序的运行,所以当时就直接上手了BAE,原因如下:

  1. 现场有工程师支持;在比赛的现场有百度开放云的工程师做支持,方便在遇到问题的时候快速解决;
  2. 简单易用:BAE支持Python的环境,程序经过少许的改动就能直接运行;
  3. 动态扩展:不用担心系统的扩展需求,这一步的实现可以交由BAE来实现。

应用流程

在系统启动以后,会通过app.add_url_rule的方式自动加载所有公司的API端(以http://base_url/v1/access_token的方式暴露)。base_url将会作为微信的服务器端的接入口,用户把系统中产生的base_url和access_token填入微信的后台中。

当一个请求过来之后,系统会在插件市场中自动寻找对应的插件,一般一个插件应该包含如下的几个内容:

  1. match函数:用来相应请求,如果属于插件的处理范围之内则返回True,否则返回False;
  2. response函数:系统会把用户的信息和上下文参数发送给这个函数,按照微信的格式进行回复;
  3. 两个函数的前端展示/设置代码

目前完成的的插件包括:

  1. 触发:位置匹配、文本正则、用户订阅、用户退订、用户发来音频
  2. 回复:API查询、返回所有支持命令、后退、邮件通知、回复音乐、回复文本

用户可以通过界面创建简单的界面创建命令,命令是支持上下文以及嵌套的,例如,在比赛时,通过百度地图的API插件设置位置匹配:

由于插件方式都是统一的接口,用户可以通过满足接口的方式来实现自己的插件,后期可以把插件上传到系统端则形成市场,并且每一条用户的回复都会对应一个具体的命令,系统会记录对应的上下文等资源,这样的好处是第三方的插件提交上来以后能够实现按照“调用次数收费分成”的方式。

注意

需要明确的是PaaS平台由于自身的特性,所以不能完全兼容本地的开发环境,因此需要根据BAE平台的特点对代码进行修改,其中包括:

  1. 依赖的导入

    在BAE Python的环境中,已经包含了一些常见的依赖,例如:BeautifulSoup、Jinja2、pytz等,但是有一些项目需要,而在预装中没有的模块需要按照如下的方式来导入:

    1. 本地开发环境安装virtualenv
    2. 使用pip安装需要的依赖
    3. 将ENV目录下的依赖路径复制到项目下
  2. 线上线下环境区分

    通过'SERVER_SOFTWARE' not in os.environ:来区分线上和线下环境区分;

  3. 测试

    在用户上传之后,BAE会在平台端对系统中改动的代码自动跑一遍lint的测试,主要是对于系统禁用的函数、功能、以及语法的检查,这个过程和代码的大小成正比,失败时只会在console端显示错误日志。

  4. 本地写入

    为了支持应用的分布式扩展,BAE禁止应用对本地文件系统的写操作。创建临时文件,可通过bae.core.const.APP_TMPDIR获取临时目录的路径,也可以通过NFS来支持对于网络文件系统的支持,能够实现本地文件的写入。

  5. 设置url映射 由于BAE在路由层面的特性,需要我们自己来设置app.conf对应的映射关系,例如:

     handlers:
    - url : /static/(.)
      script : /static/$1
    - url : /.
     script: index.py
     

在36个小时的代码之后完成了项目的原型,最大的感受还是:通过开放的标准、完善的平台,个人的团队也能够做出一些有意思的事情!

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT