Giter Club home page Giter Club logo

vlang's Introduction

vLang 使用说明

vLang是一个基于模型的微信开发框架,遵循MIT协议发布。

安装

开发与测试环境: Ubuntu Kylin 15.04 64bit Python 3.4 Tornado 4.1

python3 setup.py install

入门

1. Hello World!

最简单的例程,对用户发送的所有消息,回复“Hello World!”

from vlang.menu import Menu
from vlang.server import start

class MainMenu(Menu):
    def action(self):
        yield "Hello World"

# token需和微信后台填写一致
settings = {"url" :"/weixin",
                   "port" : 8080,
                   "token" : "WQif56gU" }
start(MainMenu(), settings)

2. 微信计算器

  • 简易乘法计算器
from vlang.menu import Menu
from vlang.server import start

class MainMenu(Menu):
    def action(self):
        num0 = yield "请输入因数1:"    #用户输入将保存在num0里.
        num1 = yield "请输入因数2:"
        num2 = float(num0) * float(num1)
        yield "计算结果:\n {0} x {1} = {2}".format(num0,num1,num2)

settings = {"url" :"/weixin",
                   "port" : 8080,
                   "token" : "WQif56gU" }
start(MainMenu(), settings)
  • 带有二级级菜单的四则运算器,能计算加减法,乘法。
from vlang.menu import Menu
from vlang.server import start

class MainMenu(Menu):
    def tag(self):
        self.name = "计算器"
    def action(self):
        reply = yield self.makeMenu()  # 根据子菜单的名字,生成菜单列表
        yield self.autoJump(reply)  # 根据回复,跳转到对应菜单

class Menu_1(Menu):
    def tag(self):
        self.name = "加减法"
    def action(self):
        reply = yield self.makeMenu()
        yield self.autoJump(reply)

class Menu_1_1(Menu):
    def tag(self):
        self.name = "加法"
    def action(self):
        num0 = yield "请输入加数1:"
        num1 = yield "请输入加数2:"
        num2 = float(num0) + float(num1)
        yield "计算结果:\n {0} + {1} = {2}".format(num0, num1, num2) 

class Menu_1_2(Menu):
    def tag(self):
        self.name = "减法"
    def action(self):
        num0 = yield "请输入被减数:"
        num1 = yield "请输入减数:"
        num2 = float(num0) - float(num1)
        reply = yield '''计算结果:\n {0} - {1} = {2}
回复“ 0 ”可回到主菜单'''.format(num0, num1, num2) 
        if reply == "0" : yield MainMenu  # 跳转到指定菜单
        
class Menu_2(Menu):
    def tag(self):
        self.name = "乘法"
    def action(self):
        num0 = yield "请输入因数1:"
        num1 = yield "请输入因数2:"
        num2 = float(num0) * float(num1)
        yield "计算结果:\n {0} x {1} = {2}".format(num0, num1, num2)

# 链接菜单
menuTree = MainMenu()  # 新建一个菜单树
menuTree.add(Menu_1)  # 链接一级菜单
menuTree.add(Menu_2)
menuTree.Menu_1.add(Menu_1_1)  # 链接二级菜单
menuTree.Menu_1.add(Menu_1_2)

# 设置并启动服务器
settings = {"url" :"/weixin",
                   "port" : 8080,
                   "token" : "WQif56gU" }
start(menuTree, settings)

Menu

在vLang中,微信项目是由一个个菜单链接而构成的, 本节将详细介绍vLang中菜单的结构,链接,启动。

结构

菜单是继承自vlang.menu.Menu的类,并需重载其action()方法,用来接收,处理,回复微信消息。 在多级菜单中,还需重载tag()方法,用以保存一些设置,目前仅有self.name这一项,用以指定菜单的名字。

from vlang.menu import Menu

class MainMenu(Menu):
    def tag(self):
        #用以保存本菜单的设置。
        self.name = "主菜单"
    
    def action(self):
        #当收到用户消息时,vLang会调用对应菜单的action(),并传入用户消息。
        pass
        

链接

为了简化开发,vLang支持多级菜单。菜单与其子菜单的链接使用add(Menu)。 在上文 四则运算器 一例中,

menuTree = MainMenu()    #新建一个菜单树,必须为Menu类的实例。
menuTree.add(Menu_1)     #链接一级菜单
menuTree.add(Menu_2)
menuTree.Menu_1.add(Menu_1_1) #链接二级菜单
menuTree.Menu_1.add(Menu_1_2)

启动

vlang.server.start(menuTree, settings)

其中, menuTree是Menu类的实例,如果有多级菜单,启动前需先链接菜单。 settings是一个包含许多设置的字典

settings = {"url" :"/weixin",            
                   "port" : 8080,        #默认为 80 端口
                   "ip":"127.0.0.1",     #默认为"" , 绑定所有地址,
                   "token" : "WQif56gU"#在微信公众号官网设置的token
                   "work" : "WQif56gU"}  #可同时服务的用户数量,也是线程数量,默认为10

yield!

Python中 yield 关键字具有神奇的魔力。 vLang中,yield用于: 回复/接收消息跳转菜单

回复

  • 给用户发送消息:
yield "您好,欢迎光临!"
  • 给用户发送消息,并得到回复:
reply = yield "请输入用户名:"
  • 缓存一段话,暂不发给用户,程序将继续执行至下一个yield语句处。一般用于缓存一段错误信息:
def action(self):
    while(True):
        try:
            reply = yield "请输入整数:"
            num = int(reply)
            break
        except ValueError:
            yield "您输入的不是整数,请重试\n", self.BUFFER  # 缓存一段话,后面添加个self.buffer即可。        

如果用户输入了"haha",int(reply)将抛出ValueError异常 程序实际回复:

您输入的不是整数,请重试 请输入整数:

可缓存多段文本,当程序继续执行到没有self.buffer的yield语句时,vLang才会将缓存区文本发送给用户。

跳转

入门 小节中,四则运算器 为例。

  • 跳转到另一个菜单:
yield Menu_1_2

能够传入Menu,或者Menu的实例。 例如,跳转到主菜单可以这样写:

yield MainMenu

也可以这样写:

yield menuTree
  • 跳转到现行菜单的开始点:
yield self

特别的,如果没有显式指定下一个菜单,当action() 执行完后,默认跳转到现行菜单的开始点。

  • 跳转到父菜单:
yield self.baseMenu
  • 当然,跳转菜单的同时也能给用户回复消息,也缓存一段信息:
yield "充值失败!", MainMenu , self.buffer

不过,上面的三个参数得 按顺序 写。其原型是:(String , Menu , self.buffer)

版本

目前版本为 0.2.1 ,是开源的第一个版本。

  • 下个版本中,将会有如下改进

    • autoJump() 支持模糊匹配
    • 加入日志模块
    • 加入消息加解密功能
    • 支持多媒体消息,如语音,图片,图文,地理位置等
  • 未来版本中,可能有如下改进

    • 在80端口处提供一个管理员网页,方便设置,管理
    • 提供幸运大转盘,刮刮卡等等常见活动
    • 接入 其他开源项目,以支持中文分词和情感分析
    • ……
    • 非常期待您的建议!

关于

谢谢您的耐心阅读!

vlang's People

Stargazers

 avatar 杜鹏 avatar SPARON avatar Y0ungsh4rk3 avatar  avatar zbv avatar  avatar Heavy avatar  avatar  avatar zhangzhd avatar Gavin avatar  avatar  avatar wang avatar 小水手 avatar Jiawen Xiong avatar oroz3 avatar Baz2013 avatar  avatar Qiang Qin avatar abramsz avatar  avatar Henry.H avatar kerneltravel avatar HLun avatar  avatar menduo avatar lixyon avatar  avatar skycle avatar Hanson Hu avatar  avatar lany avatar mathslimin avatar 汪飞 avatar  avatar Ming avatar 睿瞳深邃 avatar  avatar yang maxwell avatar shajiquan avatar Vicever avatar Terry Chan avatar Eric Wu avatar HErMiT avatar Jacky Zhang avatar  avatar  avatar Gevin avatar Charles Shu avatar Yan Zer0 avatar mougua avatar impony avatar david l euler avatar Hua avatar Eason avatar jie avatar gaccob avatar yuanhong avatar Jason avatar Zhongliang Wang avatar geosmart avatar Tassel avatar  avatar jiecuoren avatar haha avatar zhiyue avatar  avatar YJ Park avatar  avatar zhipeng avatar kmx avatar  avatar kazaff avatar Juntao Liu avatar  avatar Xavier Nico avatar  avatar  avatar Alex Zhang avatar Safaring avatar Tiany Wang avatar Richard Chen avatar  avatar  avatar netxfly avatar  avatar  avatar Zijian Wang avatar 里丰 avatar  avatar Yigang Zhang avatar Slice avatar  avatar  avatar  avatar sbilly avatar  avatar  avatar

Watchers

mlzboy avatar  avatar James Cloos avatar Chuncheng avatar  avatar jayway avatar Charles Shu avatar  avatar  avatar Jason avatar  avatar yang maxwell avatar Eason avatar speng avatar  avatar HLun avatar  avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.