1. 程式人生 > >個人公眾號服務端開發Demo

個人公眾號服務端開發Demo

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
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)

效果圖

【客戶端--公眾號】

技術分享圖片

【服務端日誌】

技術分享圖片

個人公眾號服務端開發Demo