個人公眾號服務端開發Demo
阿新 • • 發佈:2018-11-16
icc 服務端開發 res use 思路 http image warn 輸入
公眾號出來很久了,也可以個人申請。知道公眾號的服務端開發其實很簡單,接口調用封裝,數據存取,不外如是。
人一旦懶了,真的是 “無可救藥” 了。。。現簡單描述晚到的公眾號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 importreply 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)
效果圖
【客戶端--公眾號】
【服務端日誌】
個人公眾號服務端開發Demo