V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
paicha
V2EX  ›  分享创造

重写了一个校园微信公众号后端

  •  3
     
  •   paicha ·
    paicha · 2015-12-13 11:17:40 +08:00 · 7204 次点击
    这是一个创建于 3269 天前的主题,其中的信息可能已经有所发展或是发生改变。

    2013 年,大二暑假。我第一次从零到一编写了一个 Web 应用,此前我都在运营维护 Discuz! 搭建的校园论坛、搭建过校园 PT 站,只懂 HTML 、 CSS 和 PHP 的一些皮毛:修改代码、保存、运行,看上去没问题,上线。当时没有深入学习编程,也没打算当程序员,只是周围没人懂开发,只能自己硬着头皮上。

    后来看到某大学的校园公众号的新闻,兴奋得晚上睡不着觉,第二天起来找编程资料,花了一周把《 Learn Python the Hard Way 》连爬带滚过了一遍,然后就动手写了。当时什么都不懂,不懂就搜索,示例代码拷贝下来,改一改运行,可以用。没有明确的模块划分,也不懂什么框架 API ,反正 import 进去就能运行了。最终 App 的目录下面塞了 30 多个文件,代码复制粘贴,洋洋洒洒上千行, MysqL 语句也是一条一条在终端运行测试出来的,花了三四天没把部署环境搭建起来,于是就放到 SAE 上运行。

    从暑假开始,陆续开发了录取查询、电影、天气、 SimSimi 、接入校园论坛数据、漂流瓶聊天、全校 40 多家外卖菜单、接入图书馆系统、快递查询、课表、成绩查询……加上运营的功夫,一个多学期,关注人数已经覆盖了三分之二的学生。

    以上就是我编程入门的作品了。同学们看到微信里漂亮的排版,却不知道实现过程的龌蹉,但是谁的第一次不是这样呢,重要的是It Works!。后来我凭借大学的经历获得了一份 Python 的实习工作,误打误撞,最后成为了一个前端程序员。毕业之后,由于校园团队里没合适的人接手开发,功能就没继续维护更新了。到现在自己技术成长了许多,也为了方便师弟接手维护,于是就把公众号后端重写了。

    以下是正文:)

    主要技术栈:

    Python 、 Flask 、 Redis 、 MySQL 、 Celery 。 结构很简单,处理微信请求的路由,判断用户指令,一系列功能模块,队列、定时任务,还有基础的 models 、 templates 、 utils 、 config 。

    主要功能:

    •  期末成绩查询
      • 手动查询
      • 微信分享成绩单
    •  快递查询
      • 单号查询
      • 扫码查询
      • 包裹动态,自动提醒
    •  校内图书馆图书搜索
      • 借书记录
      • 一键续借
      • 还书提醒
    •  签到排行榜
    •  机器人陪聊

    一些细节:

    • 字典、正则匹配指令,避免过多的条件语句嵌套。
    • 场景状态,支持上下文回复。
    • AES 算法加密保存敏感信息。
    • 全局保存、统一刷新微信 access_token 。
    • 将静态回复文案独立到配置文件,统一管理。
    • 一切依赖外部 API 的操作都使用客服接口异步回复。因为微信服务器有 5 秒内回复的限制。
    • 关键词指令优先于上下文状态。用户进入上下文状态后,任何关键词指令都可以跳出当前状态。
    • 快捷菜单的操作都有对应的关键词,兼容繁体、全角空格。
    • 回复消息中,长文本的回复使用图文信息进行排版。
    • 前端 UI 使用 WeUI 统一风格,使用 CDN 加速。

    功能预览:

    功能预览

    除了主要的功能比较实用,其他小功能相对鸡肋,纯粹为了好玩。我认为程序员也应该关注产品体验的细节。所幸微信公众号开发几乎不涉及界面设计,界面上只要关注回复排版,比如文本的换、空行排版、<a>标签的使用。交互上要高效,尽量兼容用户的误输入。快递查询,可以扫快递单的条形码以及连续输入快递单号进行查询;成绩查询,绑定成功的同时就会发送消息给用户。

    这次厚脸皮开源出来,就是想和大家交流学习,同时给需要的人一个参考。因为本职前端,上述一些 Python 类库的使用,都是边查文档边写的, Python 也是懂基本语法的水平,测试还没写……如果发现代码中出现低级的写法或者错误,恳请指正。关于微信公众号开发的,也欢迎交流。

    GitHub 地址,欢迎 star & fork : https://github.com/paicha/gxgk-wechat-server

    33 条回复    2016-01-12 02:37:34 +08:00
    dawncold
        1
    dawncold  
       2015-12-13 11:23:04 +08:00
    那些细节都是基本应该具备的,不用单独说明
    jiezhi
        2
    jiezhi  
       2015-12-13 11:24:25 +08:00   ❤️ 1
    手动帮顶!
    paicha
        3
    paicha  
    OP
       2015-12-13 11:25:59 +08:00
    @dawncold 有点啰嗦了:) 刚好过了编辑时间
    IMRES
        4
    IMRES  
       2015-12-13 11:26:48 +08:00   ❤️ 1
    Soaper
        5
    Soaper  
       2015-12-13 11:41:50 +08:00
    马克。。。
    superbear
        6
    superbear  
       2015-12-13 12:04:10 +08:00
    faceair
        7
    faceair  
       2015-12-13 12:21:57 +08:00
    好像没有后台管理界面?
    kingcos
        8
    kingcos  
       2015-12-13 12:29:12 +08:00 via iPhone   ❤️ 1
    收藏起来。顿时想自己也搞个。。。哈哈,这段考完试试试
    paicha
        9
    paicha  
    OP
       2015-12-13 12:29:24 +08:00
    @faceair 确实没有,因为我对这个需求不大……
    不过文案回复、快捷菜单的修改通过后台管理确实比较方便。
    macleek
        10
    macleek  
       2015-12-13 13:32:45 +08:00 via Android   ❤️ 1
    想当年俺也是通过黑了一台学校服务器,提供校外查成绩的功能吸引力大量的同学关注。。。俺的公众号比你还多一个校园卡查询挂失功能。。。
    paicha
        11
    paicha  
    OP
       2015-12-13 13:39:15 +08:00
    @macleek 哈哈,厉害。我们的校园卡只能去线下查询挂失,没有线上操作的方式,不像有的学校还能支付宝充饭卡。
    zonghua
        12
    zonghua  
       2015-12-13 13:44:45 +08:00
    @paicha 自动回复的这个接口权限怎么拿到的 /?
    @macleek 学校建网站的时候留了个后门
    paicha
        13
    paicha  
    OP
       2015-12-13 13:46:05 +08:00
    @zonghua 客服接口。服务号+微信认证。
    tangooricha
        14
    tangooricha  
       2015-12-13 13:56:32 +08:00
    献上 5 枚铜币,为 LZ 的精神赞一个!
    OKbexx
        15
    OKbexx  
       2015-12-13 13:58:43 +08:00
    莞香😏
    paicha
        16
    paicha  
    OP
       2015-12-13 14:18:36 +08:00 via iPhone
    @OKbexx 😳又见熟人?
    Meiji
        17
    Meiji  
       2015-12-13 14:26:48 +08:00
    广科学渣路过
    zrj766
        18
    zrj766  
       2015-12-13 21:26:01 +08:00 via Android   ❤️ 1
    还不错,一个微信搞定,大学狗表示很方便。
    haogefeifei
        19
    haogefeifei  
       2015-12-13 21:52:17 +08:00   ❤️ 1
    Python 好评。收藏了。
    sobigfish
        20
    sobigfish  
       2015-12-13 22:27:47 +08:00   ❤️ 1
    想说...当心又有坑爹的老师拿你的东西去申请资金...
    上次发生的是哪个学校来着?
    CharlesPeng
        21
    CharlesPeng  
       2015-12-13 22:33:24 +08:00   ❤️ 1
    给楼主点个赞,楼主的 commit 能力很强啊
    paicha
        22
    paicha  
    OP
       2015-12-13 22:42:20 +08:00
    @sobigfish
    还有这样的事情?要是有人这样做也没办法……
    paicha
        23
    paicha  
    OP
       2015-12-13 22:43:51 +08:00
    @paicha 惭愧,英文也差,都是写好一块, commit 一块。
    paicha
        24
    paicha  
    OP
       2015-12-13 22:44:15 +08:00
    @CharlesPeng 惭愧,英文也差,都是写好一块, commit 一块。
    dreammes
        25
    dreammes  
       2015-12-14 00:28:42 +08:00 via iPhone
    不错⊙▽⊙
    silentsolo
        26
    silentsolo  
       2015-12-14 01:19:29 +08:00 via iPad
    n0o0a0h0
        27
    n0o0a0h0  
       2015-12-21 12:16:58 +08:00
    棒! 我们公司最近也要建立一个微信公众账号的后端。主要是方便管理公司的人员。所有人员都要上去注册或是更新自己的资料。
    看来这也是很大的坑的。。本人不会 python 。。 或者你可以介绍好的团队或者你可以帮助付费写一下?
    paicha
        28
    paicha  
    OP
       2015-12-21 12:23:34 +08:00
    @n0o0a0h0 用微信企业号好一点。
    n0o0a0h0
        29
    n0o0a0h0  
       2015-12-21 15:08:22 +08:00
    @paicha 但是企业微信号可以满足我的需求咩
    paicha
        30
    paicha  
    OP
       2015-12-21 17:56:11 +08:00 via iPhone
    @n0o0a0h0 很多已有的现成模块啦。我记得就有你要的注册管理员工。
    inisun
        31
    inisun  
       2015-12-22 00:45:31 +08:00
    你们学校直接提供这些接口吗?
    paicha
        32
    paicha  
    OP
       2015-12-22 10:54:55 +08:00 via iPhone
    @inisun 不提供,模拟登陆。
    paicha
        33
    paicha  
    OP
       2016-01-12 02:37:34 +08:00
    @n0o0a0h0 你们公司的微信公众号弄成怎样了?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   918 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 129ms · UTC 21:10 · PVG 05:10 · LAX 13:10 · JFK 16:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.