重写了一个校园微信公众号后端 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
paicha
V2EX    分享创造

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

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

    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  
        1
    手动帮顶!
    paicha
        3
    paicha  
    OP
    PRO
       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
    PRO
       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
    PRO
       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
    PRO
       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
    PRO
       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 好评。收藏了。
    run2
        20
    run2  
       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
    PRO
       2015-12-13 22:42:20 +08:00
    @sobigfish
    还有这样的事情?要是有人这样做也没办法……
    paicha
        23
    paicha  
    OP
    PRO
       2015-12-13 22:43:51 +08:00
    @paicha 惭愧,英文也差,都是写好一块, commit 一块。
    paicha
        24
    paicha  
    OP
    PRO
       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
    PRO
       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
    PRO
       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
    PRO
       2015-12-22 10:54:55 +08:00 via iPhone
    @inisun 不提供,模拟登陆。
    paicha
        33
    paicha  
    OP
    PRO
       2016-01-12 02:37:34 +08:00
    @n0o0a0h0 你们公司的微信公众号弄成怎样了?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1084 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 23:17 PVG 07:17 LAX 16:17 JFK 19:17
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86