Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >云中漫步,做个公众号方便生活、取悦自己

云中漫步,做个公众号方便生活、取悦自己

原创
作者头像
刘卓夫
修改于 2017-06-19 11:18:17
修改于 2017-06-19 11:18:17
6.1K40
代码可运行
举报
文章被收录于专栏:刘卓夫的专栏刘卓夫的专栏
运行总次数:0
代码可运行

背景

笔者平常负责小组下午茶的组织(部门的小福利),每次购买点心后,需要先垫付费用并记录下来,等到季度末的时候再汇总给接口人统一报销。两个季度下来,总感觉一些地方需要改进:

  • 不能随手记录(手机下单,不能及时把消费记录存入电脑的excel上)
  • 报销记录怕丢失(硬盘坏过一次,翻了很多app的历史才把记录找回)
  • 汇总统计不方便(各组记录方式不一样[xls?txt?],需要接口人逐个搜集,再一一汇总统计)

作为一个搞自动化出生的技术控,面对这些问题简直不能忍,在合并完上个季度的报销费用后,我问自己:为什么不做个工具,既能解决问题,又能取悦自己呢?

需求分析

对于小工具而言,主要需求如下:

  1. 可以随手记录
  2. 可以自动备份
  3. 可以自动统计

自动备份和自动统计都比较容易,只要数据能录入到后台,这些都不是事儿;而要能随手记录,那就必须是移动端的应用(毕竟手机大家基本都是随身带,下单也多是用手机),且安卓和苹果都支持。经过这么一分析,做个【微信公众号】就是一个合适的轻量级解决方案啦 ^_^

当然,要作为部门记账报销用的工具,还得加一些小需求:

  • 支持用户注册和鉴权 (万一有其他人也关注了公众号,提几个数据上来,那就悲剧了)
  • 支持多用户报销 (一个组可能有多人轮流组织,各自都要报销)

系统设计

1.用户场景

按照角色进行划分如下:

  • 用户:每个小组的下午茶接口人,购买下午茶后录入消费记录,等待报销
  • 管理员:中心报销接口人,每季度汇总各小组消费统计数据,统一报销

2.系统交互

  • 下午茶公众号:从用户场景看,用户与公众号的交互并不复杂,用基于文本交互的订阅号(未认证)来实现,性价比是最高的。当然,如果有条件通过微信认证,使用菜单和界面等高级能力,交互体验会更友好。
  • 公众号web服务:web服务主要是处理微信公众平台转发来的http消息,下文会详细介绍如何基于腾讯云来搭建公众号web服务

3.基于腾讯云的公众号web服务

  • 服务器选型: 公众号的用户量并不大,业务场景也不复杂,所以最低配的CVM云服务器(1核cpu+1G内存+20G云硬盘+1M带宽)完全可以满足需求。
  • 数据库&缓存:腾讯云本身提供了非常完善的数据库云服务(CDB和云缓存),不过以本公众号的数据量和访问量来看,用专业的数据库云服务确实有点大材小用了,还增加成本。因此直接在CVM上部署mysql和memcached,实际运行下来,发现性能完全没有问题。
  • web服务:单从公众号的交互方式来说,选Django似乎有点‘重’,Tornado、Flask、web.py等轻框架更合适。不过,通过Django的后台管理功能可以对用户、费用、组织关系等信息进行快速的维护,能省掉不少的工作量,后续有新需求也方便扩展,因此web框架选用Django。Web服务的搭建采用经典的Nginx+uwsgi+Django的方式,稳定性和性能也都能得到保证。
  • 数据安全性:报销记录非常敏感,每一笔都是实打实的经费,数据的安全性格外的重要,因此,增加一层数据的保护非常有必要。高可用、高稳定、强安全的云对象存储服务COS就是一个很好的选择,将数据每日备份到COS中,可以让数据的安全性得到大大的提高。

说明:使用数据库云服务来提升数据安全性是最直接有效的,考虑到尽量减少小工具的成本,这里选用了COS存储服务(COS每月有50G存储、10G流量的免费额度,完全满足需要)

  • 服务可用性:作为一个面向部门多个小组的记账服务,可用性须得到保证,当服务出现异常时,必须要马上发现并修复。通过腾讯云提供的云监控服务,可以在服务出现故障后第一时间得到通知

系统实现

完成了需求分析和系统设计,实现起来就是水到渠成了。

1.新建云服务器实例

在‘云产品’中选择‘云服务器’,进入云主机即可按提示创建CVM云服务器

  • 镜像这里选择的是‘CentOS 7.2 64位’
  • 硬盘建议选择‘云硬盘’,便于后续升级
  • 一定要选择1M或以上的带宽,并分配公网IP,否则无法接收微信公众平台的消息
  • 如果选择了额外的云硬盘,在登录后要先挂载才能使用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
fdisk -l
fdisk /dev/vdb  -- 这里有一系列交互式命令
mkfs.ext3 /dev/vdb1
mount /dev/vdb1 /data
cat /etc/fstab
echo '/dev/vdb1 /data ext3 defaults 0 0' >> /etc/fstab

2.软件安装

  • 通过yum,大部分需要的软件都可以快速安装
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum install nginx
yum install uwsgi
yum install uwsgi-plugin-python
yum install python-devel
yum install MySQL-python
yum install memcached
yum install Python-memcached
  • mysql和django需要自己手动安装
  • 如何在linux下安装和配置mysql,网上的文章非常全,这里不再赘述(本文采用5.7.16)
  • yum中的django版本较低,可以自行下载需要的版本来安装(文本采用1.8.4)

上传安装包到云服务器,推荐使用FileZilla(上传下载都可以),windows和mac都支持,界面友好,非常方便。

3.Nginx+uwsgi+Django配置

网上的资料虽然不少,但实际配置起来难免踩坑,这里给出笔者的配置流程,供参考

  • 3.1、创建Django项目

本步骤主要是创建一个初始django项目,用于调试nginx+uwsgi+django,下午茶app的逻辑实现放在后面完成

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 此命令需要完成django安装后才能使用
django-admin.py startproject wx_website
/* 
项目的目录结构如下,其中
apps目录存放下午茶对应的app工程
conf目录存放项目相关的配置文件
lib目录存放公共库
media、static、templates目录存放资源和模版文件
op目录存放网站操作脚本
*/
ll wx_website
drwxr-xr-x 6 root root 4096 Jan 16 22:20 apps
drwxr-xr-x 2 root root 4096 Feb 23 21:13 conf
drwxr-xr-x 2 root root 4096 Jan  2 02:05 lib
-rwxr-xr-x 1 root root  253 Nov 19 14:15 manage.py
-rw-r--r-- 1 root root  418 Nov 26 08:20 manage.pyc
drwxr-xr-x 2 root root 4096 Nov 15 22:26 media
drwxr-xr-x 2 root root 4096 Nov 16 08:06 op
drwxr-xr-x 6 root root 4096 Feb 10 17:05 static
drwxr-xr-x 3 root root 4096 Dec 25 15:34 templates
drwxr-xr-x 2 root root 4096 Mar  4 10:14 wx_website
// 调试模式启动,监听分配的公网ip 14.249.22.158上的8000端口
python manage.py runserver 14.249.22.158:8000

访问http://14.249.22.158:8000 看到Django欢迎页面,说明此步骤成功

IP‘14.249.22.158为示例,请替换为CVM的公网IP

  • 3.2、nginx+uwsgi配置

网上有很多例子是先配置uwsgi+django,再配置nginx+uwsgi,实际操作时很容易埋坑;这里直接给出完整的nginx+uwsgi配置,一次搞定

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* 在conf目录下创建以下3个文件,分别为uwsgi和nginx的配置文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ll conf
-rw-r--r-- 1 root root  253 Nov 19 14:15 uwsgi.ini
-rw-r--r-- 1 root root  664 Nov 19 14:15 uwsgi_params
-rw-r--r-- 1 root root 1157 Feb 23 21:13 wx_website_nginx.conf

uwsgi_params

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
uwsgi_param  QUERY_STRING       $query_string;
uwsgi_param  REQUEST_METHOD     $request_method;
uwsgi_param  CONTENT_TYPE       $content_type;
uwsgi_param  CONTENT_LENGTH     $content_length;
uwsgi_param  REQUEST_URI        $request_uri;
uwsgi_param  PATH_INFO          $document_uri;
uwsgi_param  DOCUMENT_ROOT      $document_root;
uwsgi_param  SERVER_PROTOCOL    $server_protocol;
uwsgi_param  REQUEST_SCHEME     $scheme;
uwsgi_param  HTTPS              $https if_not_empty;
uwsgi_param  REMOTE_ADDR        $remote_addr;
uwsgi_param  REMOTE_PORT        $remote_port;
uwsgi_param  SERVER_PORT        $server_port;
uwsgi_param  SERVER_NAME        $server_name;

uwsgi.ini

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[uwsgi]
socket = /var/run/uwsgi/uwsgi.sock
master = true
# 步骤1中创建的wx_website项目的绝对路径
pythonpath = /data/website/wx_website
chdir = /data/website/wx_website
module = wx_website.wsgi
processes = 4
# 日志所在的目录一定要先创建好
daemonize = /var/log/uwsgi/uwsgi.log
plugins = python

wx_website_nginx.conf

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
worker_processes  4;
# 日志和pid所在的目录一定要先创建好
error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;
  log_format   main '$remote_addr - $remote_user [$time_local]  $status '
    '"$request" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for"';
    # 日志目录要先创建好
  access_log   /var/log/nginx/access.log  main;
  sendfile     on;
  upstream django {
      # 对应uwsgi.ini中配置的socket文件路径
    server unix:///var/run/uwsgi/uwsgi.sock;
    # server 127.0.0.1:8000;
  }
  server {
    listen      80;
    server_name 14.249.22.158;
    charset     utf-8;
    client_max_body_size 10M;
    location /media  {
        alias /data/website/wx_website/media;
    }
    location /static {
        alias /data/website/wx_website/static;
    }
    location / {
        uwsgi_pass  django;
        include     /data/website/wx_website/conf/uwsgi_params;
    }
  }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* 启动nginx
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# step1:验证配置文件是否正确
nginx -t -c /data/website/wx_website/conf/wx_website_nginx.conf
# step2:步骤1显示successful后,启动nginx
nginx -t -c /data/website/wx_website/conf/wx_website_nginx.conf
# 后续修改nginx配置并验证成功后,用此命令使新配置生效
nginx -s reload
  • 在op目录下创建uwsgiserver.sh文件如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash
# 这里为上文中uwsgi.ini的全路径
uwsgi_ini_path=/data/website/wx_website/conf/uwsgi.ini
if [ ! -n "$1" ]
then
        echo "Usages: sh uwsgiserver.sh [start|stop|restart]"
        exit 0
fi
if [ $1 = start ]
then
        psid=`ps aux | grep "uwsgi" | grep -v "grep" | wc -l`
        echo "psid:"$psid
        if [ $psid -gt 4 ]
        then
                echo "uwsgi is running!"
                exit 0
        else
                uwsgi $uwsgi_ini_path
                echo "Start uwsgi service [OK]"
        fi
elif [ $1 = stop ];then
        killall -9 uwsgi
        echo "Stop uwsgi service [OK]"
elif [ $1 = restart ];then
        killall -9 uwsgi
        uwsgi $uwsgi_ini_path
        echo "Restart uwsgi service [OK]"
else
        echo "Usages: sh uwsgiserver.sh [start|stop|restart]"
fi

这个sh脚本用于uwsgi的启停,后续开发过程中,它的使用频率会非常高

  • 修改django相关代码后,需要重启uwsgi使修改生效*
  • 启动uwsgi
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 启动uwsgi
sh uwsgiserver.sh start
# 重启uwsgi
sh uwsgiserver.sh restart

最后,访问http://14.249.22.158/ 出现django欢迎页面,说明nginx+uwsgi+django配置成功

Tips:如果到最后一步,没有出现django欢迎页面,可以查看以下几个日志文件定位问题

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/var/log/nginx/access.log
/var/log/nginx/error.log
/var/log/uwsgi/uwsgi.log

4.公众号django-app开发

下午茶消费如何记录和报销等逻辑(下图灰色部分),不具备普遍参考性,就不详细介绍了,这里主要介绍微信公众号交互相关的内容。

  • 4.1、创建app
  • 在项目根目录创建名字为happytea的app
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python manage.py startapp happytea
  • 将生成的happytea目录移动到wx_website/apps/目录下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mv happytea/ apps/
ll /data/website/wx_website/apps/happytea
-rw-rw-r-- 1 root root     0 Jan 16 22:19 __init__.py
-rw-rw-r-- 1 root root   838 Feb 17 00:09 admin.py
-rw-rw-r-- 1 root root  1762 Feb 15 21:47 models.py
-rw-r--r-- 1 root root   162 Feb 12 13:25 urls.py
-rw-rw-r-- 1 root root 29199 Mar 24 22:10 views.py
  • wx_website/wx_website/settings.py 中添加app
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'django_crontab',
# 添加新创建的app
    'apps.happytea'
)
  • 4.2、修改url路由配置
  • 首先修改django的顶层url路由配置 wx_website/wx_website/urls.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
urlpatterns = [
    url(r'^$', views.web_root_index),
    url(r'^admin/', include(admin.site.urls)),
# 将/happytea/路径下请求路由到app的url定义文件中
    url(r'^happytea/', include('apps.happytea.urls', namespace="happytea")),
]
  • 修改app的url路由配置 wx_website/apps/happytea/urls.py
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
urlpatterns = [
# 将/happytea/wxmp/路径下的消息路由到 views中wxmp函数处理
    url(r'^wxmp/$', views.wxmp, name='wxmp'),
]
  • 4.3、引入wechat_sdk库

微信公众平台相关的逻辑,主要有3个方面的内容(上图红框部分):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. 公众号token的维护与更新

2. 验证消息是否鉴权通过

3. 微信xml消息解析与封装

通过微信公众平台的 开发文档 可以理解这些概念和协议,从而实现对应的处理逻辑。 不过从开发效率上看,如果引入开源的wechat_sdk库,可以将我们从这些非主干业务的开发工作中解放出来,节省大量的开发工作;而且开源库经过大量实际项目的运行,可靠性也非常高

这里给大家推荐wechat-python-sdk文档清晰易懂,接口调用简单,按照示例能快速上手。以本项目为例:

定义用于存储/获取的“token”和“时间戳”的函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 保存新的token和过期时间,覆盖原来保存的
def set_wx_token_func(newtoken, expires_at):
    # 直接使用django的模型保存
    token.update_token(newtoken, expires_at)
#
# 获取当前保存的token和过期时间(之前通过set_wx_token_func中保存的)
def get_wx_token_func():
    last_token = token.get_token_by_wxid(wx_id)
    return (str(last_token.token), last_token.expires_at)
  • 得到WechatBasic类实例,后面的公众平台相关操作都通过此实例完成
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 公众号的配置信息
# access_token_getfunc和access_token_setfunc为前一步定义的两个函数
conf = WechatConf(token=apptoken, appid=appid, appsecret=appsecret,
                  encrypt_mode='normal', encoding_aes_key=appaeskey,
                  access_token_getfunc=get_wx_token_func,
                  access_token_setfunc=set_wx_token_func,
                  access_token_refreshfunc=None)
wechat = WechatBasic(conf=conf)
  • 验证微信消息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      # 1,解析3个请求鉴权参数
    signature = request.GET.get('signature')
    timestamp = request.GET.get('timestamp')
    nonce = request.GET.get('nonce')

    # 2、通过sdk提供的check_signature接口验证消息是否鉴权通过
    if not wechat.check_signature(signature, timestamp, nonce):
        logger.info('check_signature fail')
        return HttpResponseForbidden()

    # 3、如果是http-get方法,说明是平台配置验证,返回echostr参数的值即可;
    #    如果是http-post,则说明微信公众平台转发的用户命令消息,进一步处理
    if request.method == 'GET':
        echostr = request.GET.get('echostr')
        logger.info('wx reg succ')
        return HttpResponse(echostr)
    elif request.method == 'POST':
        return handler_wxmp_req(request.body)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* 解析微信转发的xml请求,提取发送用户id、消息类型、消息内容
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 1、解析xml消息
    try:
        wechat.parse_data(body)
    except ParseError:
        logger.error('parse wx_msg fail, msg: ' + body)
        return HttpResponseBadRequest()

    # 2、得到发送消息的用户id、消息类型、消息内容
    userid = wechat.message.source # 用户id
    msg = wechat.message 
    if isinstance(msg, TextMessage): # 消息类型
        txt = wechat.message.content   # 消息文本
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
* 将要回复的文本消息封装为微信公众号xml响应
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 解析命令文本,判断格式是否正确
   (ret, expinfo) = parse_add_expense(txt)
   if not ret:
        content = '您输入的格式有误'
                # 将返回的文本内容(content)封装为xml响应文本
                # response_text方法返回的是一个xml文本
                # 将此文本作为http-body返回给微信公众平台即可
        return wechat.response_text(content=content)

按照上面的方法,就可以很方便的完成与微信公众平台相关的逻辑处理了。

  • 4.4、下午茶逻辑处理
  • 如何进行django-app的开发,可以参考官方文档,非常全面,这也是选择django框架的优点之一。

这里仅仅截取一段简单‘用户状态查询’逻辑,便于理解下文的公众号操作示例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    # 得到用户发送的文本(已完成微信xml请求的解析)
    txt = wechat.message.content.strip()
    # 根据请求中的用户id查询用户信息
    user = User.get_user_by_openid(wechat.message.source)
    # 如果命令文本是‘2’,说明是要查询用户状态
    if txt == '2':
        # 得到用户的状态信息文本
        content = gen_user_info(user)
                # 将要返回给用户的文本结果封装为xml响应文本
        rspxml = wechat.response_text(content=content)
                # 将xml响应文本作为http响应的body返回给公众平台
                return HttpResponse(rspxml)

到这里,我们已经完成了服务器环境的搭建和公众号后台服务的开发。接下来就可以配置公众号,让搭建的后台服务来处理用户发送的命令了。

5.微信公众号配置

  • url填入在django-app开发中配置的url,确保对应的view逻辑可以处理微信公众平台转发的消息
  • token需要与实例化wechat-python-sdk的WechatConf时传入的token参数相同
  • EncodingAESKey也是要与实例化WechatConf时传入的参数相同
  • 加密方式选择‘明文模式’,便于调试
  • 点击“提交”,公众号后台服务将收到来自公众平台的http-get请求。按照4.3中的处理逻辑,如果校验成功并返回了echostr,则公众号配置成功,后续用户在公众号中发送的消息,都会转发给我们的后台服务处理。
  • 出现下图说明配置成功
  • 在公众号中发送文本‘2’,验证功能是否正确

TIPS:如果提交公众号的基础配置未成功 或 发送命令后未返回结果,请检查django逻辑处理的日志来定位问题

6.使用COS云储存

  • 6.2、创建一个Bucket,这里取名为‘happytea’
    • 要使用cos云存储,必选先创建bucket
    • 最终存储的文件,必须在某一个bucket下
    • 可以认为bucket就是根目录,下面可以存放文件或者创建目录
    • bucket的所属地域,最好与CVM的机房所在地域一致,以获得最快的上传、下载速度
  • 6.3、参考COS-PYTHON-SDK文档进行安装

推荐pip方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install qcloud_cos_v4
  • 6.4、在云API密钥中查询appid、secretid、secretkey信息,调用cos-sdk的时候需要用到
  • 6.5、在代码中调用sdk,完成文件的云存储(上传)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 导入cos-sdk
from qcloud_cos import CosClient
from qcloud_cos import UploadFileRequest
# 通过appid、secretid、secretkey,cos-region(bucket的地域)
# 创建一个CosClient实例
os_client = CosClient(settings.COS_APPID, settings.COS_SECRET_ID,
                               settings.COS_SECRET_KEY, settings.COS_REGION)
# 创建一个上传文件请求,参数为:bucket名称、路径、文件路径
# 注意参数的类型为unicode,不是string
cos_upload_req = UploadFileRequest(
            u'happytea', u'/' + filename.decode('utf8'), file_path.decode('utf8'))
# 设置上传时如果存在同名同路径文件,是否允许覆盖
cos_upload_req.set_insert_only(0)
# 通过client完成上传,并得到上传响应对象
cos_upload_rsp = cos_client.upload_file(cos_upload_req)
# 判断响应(json对象)的‘code’值是否等于0
# 0:上传cos成功,非0:失败
if cos_upload_rsp['code'] != 0:
    raise Exception('cos upload fail, info:{}'.format(cos_upload_rsp['message']))
  • 6.6、添加一个定时任务,每日调用脚本上传关键数据的备份文件到cos中

7.添加云监控

  • 7.1、进入云监控-告警策略管理,添加‘告警策略’
  • 7.2、添加告警触发条件(要监控的内容),如cpu、内存、ping不可达、磁盘只读等等
  • 7.3、关联告警对象,这里勾选我们要监控的cvm服务器
  • 7.4、设置告警接收组,这里选择接收告警(邮件、短信)的用户分组

这样,当cvm服务器出现我们监控的问题时,就可以通过短信、邮件马上得到通知了。

公众号实现效果

到这里,基于云服务的公众号开发就完成了,使用时效果如下

  • 添加一笔下午茶报销费用
  • 查看小组未报销费用
  • 查看中心未报销费用

END

回想几年前,有朋友开发一个小型的业务系统,却因服务器购买、托管、网络等问题耗费了大量时间和精力,等系统开发完成,已错过了最佳的上线时间,实在让人唏嘘。

如今,无论是服务器、网络、云存储还是CDN,云服务的生态已经非常成熟,门槛低且成本小,我们何不放飞自己的梦想,在云中世界里尽情的飞翔呢!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
4 条评论
热度
最新
这才是高手!
这才是高手!
回复回复点赞举报
作者这篇部署文章是我看过的最优雅的部署了
作者这篇部署文章是我看过的最优雅的部署了
回复回复点赞举报
谢谢作者分享。
谢谢作者分享。
回复回复点赞举报
不错,学习了。
不错,学习了。
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
手把手教你用图灵机器人做微信公众号自动回复助手 手把手教你用图灵机器人做微信公众号自动回复助手
创建成功后,会自动跳转到机器人设置界面,在这里你可以对机器人进行个性化定制。其实,图灵机器人提供简单的方法,快速接入微信公众号,这太没有挑战性了,对于喜欢搞事情的我们,肯定不能选择这种方法。
尾尾部落
2018/09/04
2.4K1
手把手教你用图灵机器人做微信公众号自动回复助手
		
			手把手教你用图灵机器人做微信公众号自动回复助手
Django+wechatpy接入微信公众平台以及授权登录
确定Django环境可以正常运行,环境搭建见:Linux 搭建Nginx+uwsgi+Django环境 安装 wechatpy[cryptography] sudo pip3 install wechatpy[cryptography] 修改settings.py 接入微信公众号的连接去掉csrf验证,详情参考:解决Django+Vue前后端分离的跨域问题及关闭csrf验证的后半部分 在settings.py 加入微信公众号配置 AppID = '' AppSecret = '' Token = ''
lin_zone
2019/05/08
2.6K0
nodejs微信公众号开发
网上关于node开发公众号的资料相当缺乏,本文旨在以node的视角对公众号开发做一个阐述。
一粒小麦
2019/08/06
6.4K4
用Docker搭建微信公众号
此文我将带大家用Docker来搭建一个微信公众号的后台,主要涉及Docker里运行JavaWeb的技术,一起来做这个有意思的事情吧! (如果你对Docker了解不是很多的话,欢迎查看我的上一篇教程:
小小科
2018/05/03
3.2K0
用Docker搭建微信公众号
用 Python 进行微信公众号开发
今天看到篇教程,是用python开发微信公众号的,觉得有意思,就敲代码实现了一下,成功后更觉得好玩,故记录,方便开发深入时使用。
马哥linux运维
2019/03/08
4K0
用 Python 进行微信公众号开发
用 Python 进行微信公众号开发
作者 crystaleone | 职位 马哥教育金牌助教 今天看到篇教程,是用python开发微信公众号的,觉得有意思,就敲代码实现了一下,成功后更觉得好玩,故记录,方便开发深入时使用。 基础背景介绍 首先得有个人微信号(没有自行注册),为方便测试学习; 其次,还要注册微信公众号,微信公众号不止一种,是分多种的,具体详情见官方说明,但仅测试学习时可先不注册公众号,(需要用个人微信号扫描登陆测试公众平台)利用微信提供的测试平台接口即可: 微信公众号说明:http://kf.qq.com/faq/120911
小小科
2018/06/20
3.9K0
图解微信公众号后台服务开发(nodejs版)
IMWeb前端团队
2017/12/28
7.4K0
图解微信公众号后台服务开发(nodejs版)
微信订阅号后台搭建
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。
Bobby
2019/04/09
2.1K0
微信公众号开发基本流程
背景: 过年前后做了个微信公众号项目,已经过去一段时间了,抽空回忆总结下基本流程吧,不然很快估计自己就忘了。。
全栈程序员站长
2022/09/06
3.8K0
微信公众号开发基本流程
最详细的微信公众号搭建一条龙
因为公众号最终是要面向外网使用的,那么就必须要有一台对外的服务器,推荐使用云服务器(自己做过内网穿透映射也可以,但是不方便)。
万少
2025/02/11
3520
最详细的微信公众号搭建一条龙
公众号开发笔记二
微信公众平台开发模板消息,用于公众号向用户发送服务通知,如学生进校门,用校卡滴,就可以在公众号接收服务通知,表明学生进校.在公众号内申请功能,添加模板消息.
达达前端
2019/07/04
1.6K0
微信公众号开发前配置
配置服务器地址URL、令牌Token、和消息加解密密钥EncodingAESKey 消息加密模式配置为兼容模式 服务器地址脚本代码:
jwj
2022/05/18
2.2K0
公众号开发配置
地址:http://你的域名/admin(如输入后台地址,提示404等无法打开,请检查伪静态配置)
西里国际站
2023/04/19
1.5K0
公众号开发配置
sillyGirl傻妞命令大全
完整版主要是方便老玩家复制粘贴命令,而且发现大家更喜欢命令和注释在一行,所以我做下梳理。
季春二九
2024/11/05
2150
Nginx+Django 部署
uwsgi是一种线路协议而不是通信协议,在此常用于在uwsgi服务器与其他网络服务器的数据通信。uwsgi协议是一个uwsgi服务器自有的协议,它用于定义传输信息的类型。uwsgi实现了WSGI的所有接口,是一个快速、自我修复、开发人员和系统管理员友好的服务器。uwsgi代码完全用C编写,效率高、性能稳定。
洗尽了浮华
2018/12/25
1.7K0
微信公众号模板消息
模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。
神葳
2021/01/22
4.7K0
微信公众号自动回复图文消息
订阅号收到过一些查询消息,比如vue、react,无奈一直没有心情去搞关键字搜索,就丢一边去了
ayqy贾杰
2019/06/12
4.2K0
微信公众号自动回复图文消息
微信公众号开发之模板消息
其实这个问题很简单,在【微信公众平台】现在已经可以直接查看自己的公众号都能使用那些接口。
Javen
2018/08/21
2.5K0
微信公众号开发之模板消息
微信公众号开发者模式介绍及接入
编辑模式和开发模式是互斥的关系,也就是说,当我们使用开发模式时,编辑模式下的操作就会失效。反之,使用编辑模式时,开发模式下的操作就会失效,所以只能使用其中一个模式进行公众号的开发。
端碗吹水
2020/09/23
1.4K0
微信公众号开发者模式介绍及接入
公众号开发笔记一
用户识别,每个公众号都有对应的一个OpenID.移动应用包含个人以及企业级应用,如果有多个公众号和应用,那么绑定后有多个不同的OpenID,但对这些同一开放平台账号下只有一个UnionID.
达达前端
2019/07/03
1.7K0
公众号开发笔记一
推荐阅读
相关推荐
手把手教你用图灵机器人做微信公众号自动回复助手 手把手教你用图灵机器人做微信公众号自动回复助手
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验