公众号出来很久了,也可以个人申请。知道公众号的服务端开发其实很简单,接口调用封装,数据存取,不外如是。

人一旦懒了,真的是 “无可救药” 了。。。现简单描述晚到的公众号HelloWorld

  • 思路

公众号里面简单的文章展示,静态博客展示这种好像没啥特别的,就跳过了。

在聊天框输入参数, 传到云服务器处理,然后请求个三方API获取信息,封装返回。嗯,这就算个基本的Demo了

  • 准备

1, 得申请个公众号,个人的,免费

2, 最好买一台云服务器,双十一的阿里云最低100¥/Year,heihei

  • Let's go

按照 微信的公众号对接的文档来就可以了,直接贴代码

main.py

# -*- coding: utf-8 -*-
# filename: main.py
import web
from handle import Handle urls = (
'/wx', 'Handle',
) if __name__ == '__main__':
app = web.application(urls, globals())
app.run()

handle.py

# -*- coding: utf-8 -*-
# filename: handle.py import hashlib
import web
import reply
import receive
import requests
import re
import logging MY_TOKEN = "XXXXX" # 按照在公众号上的设置对应
URL_PHONENUM_INFO = "https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel="
LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s"
logging.basicConfig(filename='root.log', level=logging.INFO, format=LOG_FORMAT) # 调用查询号码省份运营商的API,简单暴力正则匹配结果返回
def getCurrentPhoneNumInfo(num):
logging.info("getCurrentPhoneNumInfo[%s]", num)
try:
if re.match("^1[3|5|7|8]\d{9}$", num) == None:
return "Error phone number format."
else:
r = requests.get(URL_PHONENUM_INFO + num)
m = re.search("carrier\:\'(.*)\'.*", r.text, re.M)
result = m.group(1)
logging.info("result=%s" , result)
return result.encode("UTF-8") # python2的转码问题总是会坑到一批新人
except Exception as e:
logging.error(e)
return "API error" class Handle(object): # 文档中的Get不是为了对话框交互准备的,此处删除 def POST(self):
try:
webData = web.data()
logging.warn("Handle Post webdata is %s", webData)
#后台打日志
recMsg = receive.parse_xml(webData)
if isinstance(recMsg, receive.Msg) and recMsg.MsgType == 'text':
toUser = recMsg.FromUserName
fromUser = recMsg.ToUserName
receiveContent = recMsg.Content
logging.warn("receive content:" + receiveContent)
content = getCurrentPhoneNumInfo(receiveContent)
replyMsg = reply.TextMsg(toUser, fromUser, content)
return replyMsg.send()
else:
logging.error("格式不支持,暂且不处理")
return "success"
except Exception, Argment:
return Argment

receive.py

# -*- coding: utf-8 -*-
# filename: receive.py
import xml.etree.ElementTree as ET
def parse_xml(web_data):
if len(web_data) == 0:
return None
xmlData = ET.fromstring(web_data)
msg_type = xmlData.find('MsgType').text
  # 暂只处理text格式的消息,demo嘛
if msg_type == 'text':
return TextMsg(xmlData) class Msg(object):
def __init__(self, xmlData):
self.ToUserName = xmlData.find('ToUserName').text
self.FromUserName = xmlData.find('FromUserName').text
self.CreateTime = xmlData.find('CreateTime').text
self.MsgType = xmlData.find('MsgType').text
self.MsgId = xmlData.find('MsgId').text class TextMsg(Msg):
def __init__(self, xmlData):
Msg.__init__(self, xmlData)
self.Content = xmlData.find('Content').text.encode("utf-8")

reply.py

# -*- coding: utf-8 -*-
# filename: reply.py
import time
class Msg(object):
def __init__(self):
pass
def send(self):
return "success" class TextMsg(Msg): def __init__(self, toUserName, fromUserName, content):
self.__dict = dict()
self.__dict['ToUserName'] = toUserName
self.__dict['FromUserName'] = fromUserName
self.__dict['CreateTime'] = int(time.time())
self.__dict['Content'] = content def send(self):
XmlForm = """
<xml>
<ToUserName><![CDATA[{ToUserName}]]></ToUserName>
<FromUserName><![CDATA[{FromUserName}]]></FromUserName>
<CreateTime>{CreateTime}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{Content}]]></Content>
</xml>
"""
return XmlForm.format(**self.__dict)

在加一个restat.sh 会用起来更舒服

ps -ef | grep "main.py" | grep -v grep  | awk '{print $2}' |xargs kill -
python main.py &

效果图

【客户端--公众号】

【服务端日志】

个人公众号服务端开发Demo的更多相关文章

  1. 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo

    原文:微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建 ...

  2. Day01_搭建环境&CMS服务端开发

    学成在线 第1天 讲义-项目概述 CMS接口开发 1 项目的功能构架 1.1 项目背景 受互联网+概念的催化,当今中国在线教育市场的发展可谓是百花齐放.如火如荼. 按照市场领域细分为:学前教育.K12 ...

  3. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  4. 微信公众号PHP简单开发流程

    原文:微信公众号PHP简单开发流程 微信公众号开发分傻瓜模式和开发者模式两种,前者不要考虑调用某些接口,只要根据后台提示傻瓜式操作即可,适用于非专业开发人员. 开发模式当然就是懂程序开发的人员使用的. ...

  5. 公众号第三方平台开发-aes解密失败

    公众号第三方平台开发-aes解密失败 问题:本地启动项目,配置域名,测试微信公众号,系统正常运行:将项目部署到测试环境执行同样的操作,系统报错,错误异常:aes解密失败..... 调试--寻找问题-- ...

  6. Swift3.0服务端开发(五) 记事本的开发(iOS端+服务端)

    前边以及陆陆续续的介绍了使用Swift3.0开发的服务端应用程序的Perfect框架.本篇博客就做一个阶段性的总结,做一个完整的实例,其实这个实例在<Swift3.0服务端开发(一)>这篇 ...

  7. Netty4 学习笔记之一:客户端与服务端通信 demo

    前言 因为以前在项目中使用过Mina框架,感受到了该框架的强大之处.于是在业余时间也学习了一下Netty.因为Netty的主要版本是Netty3和Netty4(Netty5已经被取消了),所以我就直接 ...

  8. 公众号第三方平台开发 教程六 代公众号使用JS SDK说明

    公众号第三方平台开发 教程一 创建公众号第三方平台 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取 公众号第三方平台开发 教程三 微信公众号 ...

  9. python网络编程TCP服务多客户端的服务端开发

    #服务多客户端TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何 ...

随机推荐

  1. Vue列表渲染:一个取值范围的v-for

    v-for 也可以取整数.在这种情况下,它将重复多次模板. 例子 <div id="app"> <span v-for="n in 10"&g ...

  2. fork/join并发编程

    Fork & Join 的具体含义 Fork 一词的原始含义是吃饭用的叉子,也有分叉的意思.在Linux 平台中,函数 fork()用来创建子进程,使得系统进程可以多一个执行分支.在 Java ...

  3. BZOJ 2565 最长回文串

    传送门 回文自动机! 正着跑一遍 记录以每个点作为回文子串的右端点的最大长度 倒过来跑一遍 记录每个点作为左端点的最大长度 求个和就好啦 附代码. #include<cstdio> #in ...

  4. 07.整合jsp、整合freemarker、整合thymeleaf

    整合jsp pom.xml部分内容 <packaging>war</packaging> </dependencies> <dependency> &l ...

  5. Struts2之param标签的使用

    struts2的s:param标签主要有两个属性name与value: 传值 若想在value属性中输入字符串,则可以这样写:<s:param name="tableTitle&quo ...

  6. Boyer-Moore

    Boyer-Moore 只做这些失败的匹配,就可以排除掉相应的对齐位置.在BM算法中,模式串P与文本串T的对准位置依然自左向右移动,而在对准位置确是自右向左的逐一比对各个字符串,具体的,在每一轮自右向 ...

  7. java 时间戳转为时间

    Date date = new Date(Long.parseLong(String.valueOf("1560235259477")));SimpleDateFormat for ...

  8. java基础复习(二)

    一. 基本语法 如果一个源文件中什么内容都没有,编译会不会生成 字节码文件?不会 如果一个类中没有主方法(如下图),编译运行会怎么样?编译可以通过,但运行报错 : 没有主方法 主方法 : 是一个特殊的 ...

  9. 使用idea搭建Spring boot+jsp的简单web项目

    大家好: 这是我的第一篇博客文章,简单介绍一下Spring boot + jsp 的搭建流程,希望给跟我一样新接触Spring boot的读者一点儿启发. 开发工具:jdk1.8   idea2017 ...

  10. 英语单词profile

    profile 来源——linux系统文件名 [root@centos71 ~]# cat /etc/profile # /etc/profile # System wide environment ...