【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

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

  • 2013-07-11
  • 本文字数:1816 字

    阅读完需:约 6 分钟

在 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 目录下的依赖路径复制到项目下
  1. 线上线下环境区分

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

2013-07-11 03:46883
用户头像

发布了 89 篇内容, 共 31.1 次阅读, 收获喜欢 4 次。

关注

评论

发布
暂无评论
发现更多内容

秒杀系统

俊俊哥

秒杀

我收集的 3 个企业经营“失败”案例

霍太稳@极客邦科技

格一格你的情欲念

王进行

Go: 并发访问 Map — Part III

陈思敏捷

并发 map sync Go 语言

新生必备清单:不想成为虚度青春的“小透明”,手机应该怎样选?

脑极体

30岁的二三事

大唐小生

总结 个人感悟

这16道Redis最常见面试问题,你能回答上来几个?

火羊哥

Java

【面试必问】Spring中的事务管理详解

只喝纯牛奶

机器学习基石第二节 学习笔记

半亩房顶

Machine Learning

机器学习基石第三节 学习笔记

半亩房顶

Machine Learning

零代码可视化开发平台iVX是什么?

代码制造者

编程语言 可视化 零代码 iVX

Java七种排序算法以及实现

狸猫换太子

Java 排序算法 实现

JVM系列:通过一个例子分析JIT的汇编代码

简爱W

最牛逼的Java框架,没有之一

我是苞谷

JVM参数手册

Rayjun

JVM GC

一年多远程工作经验,说说真实的感受

盛安德软件

【写作群星榜】7.24~7.31 写作平台优秀作者 & 文章排名

InfoQ写作社区官方

写作平台 排行榜 热门活动

数据结构与算法之排序

shirley

排序算法

密码朋克的社会实验(三):比特币发明了什么

腾讯安全云鼎实验室

比特币 区块链 密码学

别在网上乱找代码了,找了一段代码突然爆了!!!

导导

Java

什么是算法的大O表示法

码农神说

算法 时间复杂度 Java算法 大O

机器学习基石第五节 学习笔记

半亩房顶

Machine Learning

dubbo-go 中使用 sentinel

apache/dubbo-go

dubbo sentinel Go 语言

机器学习基石第四节 学习笔记

半亩房顶

Machine Learning

如何进行需求梳理及埋点方案设计

易观大数据

职场求生攻略答疑篇之 2 —— 无所适从的向上沟通

臧萌

架构师训练营第九周学习总结

张明森

小伙伴想写个 IDEA 插件么?这些 API 了解一下!

程序员小航

IDEA idea插件 教程 API IntelliJ IDEA

webRTC框架下的视频主动丢帧

fumingwang

音视频 WebRTC

机器学习基石第一节 学习笔记

半亩房顶

Machine Learning

来了来了!Docker安装及运行原理

程序员的时光

Java Docker 微服务

百度开放云骑士之夜:“基于百度开放云的营销插件平台”的作品简析_Python_水羽哲_InfoQ精选文章