欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python微信公眾號開發(fā)平臺

 更新時間:2018年01月25日 11:16:08   作者:菩提樹下的煮茶小童子  
這篇文章主要介紹了Python微信公眾號開發(fā)平臺,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下

 

上大學的時候,對微信公眾號開發(fā)淺嘗輒止的玩了一下,感覺還是挺有意思的。

http://www.dbjr.com.cn/article/133677.htm后來服務器到期了,也就擱置了。由于發(fā)布web程序,使用PHP很順手,就使用了PHP作為開發(fā)語言。但是其實微信公眾號的開發(fā)和語言關聯(lián)并不大,流程,原理上都是一致的。

快要做畢設了,想著到時候應該會部署一些代碼到服務器上,進行長期的系統(tǒng)構建。所以趁著還是學生,就買了阿里云的學生機。買了之后,就想著玩點什么,于是微信公眾號的開發(fā),就又提上了日程。但是這次,我不打算使用PHP了,感覺局限性相對于Python而言,稍微有點大。

使用Python的話,可以靈活的部署一些爬蟲類程序,和用戶交互起來也會比較方便。可拓展性感覺也比較的高,于是就選它了。

服務器配置這部分屬于是比較基礎的,不太明白的可以看看我之前的那個博客,還算是比較的詳細。今天就只是對核心代碼做下介紹好了。

項目目錄

root@aliyun:/var/www/html/wx/py# ls *.py
api.py dispatcher.py robot.py
root@aliyun:/var/www/html/wx/py# 

api.py

這個文件相當于是一個關卡,涉及token的驗證,和服務的支持。

# -*- coding:utf-8 -*-    #中文編碼
import sys
reload(sys) # 不加這部分處理中文還是會出問題
sys.setdefaultencoding('utf-8')
import time
from flask import Flask, request, make_response
import hashlib
import json
import xml.etree.ElementTree as ET
from dispatcher import *
app = Flask(__name__)
app.debug = True
@app.route('/') # 默認網(wǎng)址
def index():
 return 'Index Page'
@app.route('/wx', methods=['GET', 'POST'])
def wechat_auth(): # 處理微信請求的處理函數(shù),get方法用于認證,post方法取得微信轉(zhuǎn)發(fā)的數(shù)據(jù)
 if request.method == 'GET':
 token = '你自己設置好的token'
 data = request.args
 signature = data.get('signature', '')
 timestamp = data.get('timestamp', '')
 nonce = data.get('nonce', '')
 echostr = data.get('echostr', '')
 s = [timestamp, nonce, token]
 s.sort()
 s = ''.join(s)
 if (hashlib.sha1(s).hexdigest() == signature):
  return make_response(echostr)
 else:
 rec = request.stream.read() # 接收消息
 dispatcher = MsgDispatcher(rec)
 data = dispatcher.dispatch()
 with open("./debug.log", "a") as file:
  file.write(data)
  file.close()
 response = make_response(data)
 response.content_type = 'application/xml'
 return response
if __name__ == '__main__':
 app.run(host="0.0.0.0", port=80)

dispatcher.py

這個文件是整個服務的核心,用于識別用戶發(fā)來的消息類型,然后交給不同的handler來處理,并將運行的結(jié)果反饋給前臺,發(fā)送給用戶。消息類型這塊,在微信的開發(fā)文檔上有詳細的介紹,因此這里就不再過多的贅述了。

#! /usr/bin python
# coding: utf8
import sys
reload(sys)
sys.setdefaultencoding("utf8")
import time
import json
import xml.etree.ElementTree as ET
from robot import *
class MsgParser(object):
 """
 用于解析從微信公眾平臺傳遞過來的參數(shù),并進行解析
 """
 def __init__(self, data):
 self.data = data
 def parse(self):
 self.et = ET.fromstring(self.data)
 self.user = self.et.find("FromUserName").text
 self.master = self.et.find("ToUserName").text
 self.msgtype = self.et.find("MsgType").text
 # 純文字信息字段
 self.content = self.et.find("Content").text if self.et.find("Content") is not None else ""
 # 語音信息字段
 self.recognition = self.et.find("Recognition").text if self.et.find("Recognition") is not None else ""
 self.format = self.et.find("Format").text if self.et.find("Format") is not None else ""
 self.msgid = self.et.find("MsgId").text if self.et.find("MsgId") is not None else ""
 # 圖片
 self.picurl = self.et.find("PicUrl").text if self.et.find("PicUrl") is not None else ""
 self.mediaid = self.et.find("MediaId").text if self.et.find("MediaId") is not None else ""
 # 事件
 self.event = self.et.find("Event").text if self.et.find("Event") is not None else ""
 return self
class MsgDispatcher(object):
 """
 根據(jù)消息的類型,獲取不同的處理返回值
 """
 def __init__(self, data):
 parser = MsgParser(data).parse()
 self.msg = parser
 self.handler = MsgHandler(parser)
 def dispatch(self):
 self.result = "" # 統(tǒng)一的公眾號出口數(shù)據(jù)
 if self.msg.msgtype == "text":
  self.result = self.handler.textHandle()
 elif self.msg.msgtype == "voice":
  self.result = self.handler.voiceHandle()
 elif self.msg.msgtype == 'image':
  self.result = self.handler.imageHandle()
 elif self.msg.msgtype == 'video':
  self.result = self.handler.videoHandle()
 elif self.msg.msgtype == 'shortvideo':
  self.result = self.handler.shortVideoHandle()
 elif self.msg.msgtype == 'location':
  self.result = self.handler.locationHandle()
 elif self.msg.msgtype == 'link':
  self.result = self.handler.linkHandle()
 elif self.msg.msgtype == 'event':
  self.result = self.handler.eventHandle()
 return self.result
class MsgHandler(object):
 """
 針對type不同,轉(zhuǎn)交給不同的處理函數(shù)。直接處理即可
 """
 def __init__(self, msg):
 self.msg = msg
 self.time = int(time.time())
 def textHandle(self, user='', master='', time='', content=''):
 template = """
 <xml>
  <ToUserName><![CDATA[{}]]></ToUserName>
  <FromUserName><![CDATA[{}]]></FromUserName>
  <CreateTime>{}</CreateTime>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA[{}]]></Content>
  </xml>
 """
 # 對用戶發(fā)過來的數(shù)據(jù)進行解析,并執(zhí)行不同的路徑
 try:
  response = get_response_by_keyword(self.msg.content)
  if response['type'] == "image":
  result = self.imageHandle(self.msg.user, self.msg.master, self.time, response['content'])
  elif response['type'] == "music":
  data = response['content']
  result = self.musicHandle(data['title'], data['description'], data['url'], data['hqurl'])
  elif response['type'] == "news":
  items = response['content']
  result = self.newsHandle(items)
  # 這里還可以添加更多的拓展內(nèi)容
  else:
  response = get_turing_response(self.msg.content)
  result = template.format(self.msg.user, self.msg.master, self.time, response)
  #with open("./debug.log", 'a') as f:
  # f.write(response['content'] + '~~' + result)
  # f.close()
 except Exception as e:
  with open("./debug.log", 'a') as f:
  f.write("text handler:"+str(e.message))
  f.close()
 return result
 def musicHandle(self, title='', description='', url='', hqurl=''):
 template = """
 <xml>
  <ToUserName><![CDATA[{}]]></ToUserName>
  <FromUserName><![CDATA[{}]]></FromUserName>
  <CreateTime>{}</CreateTime>
  <MsgType><![CDATA[music]]></MsgType>
  <Music>
  <Title><![CDATA[{}]]></Title>
  <Description><![CDATA[{}]]></Description>
  <MusicUrl><![CDATA[{}]]></MusicUrl>
  <HQMusicUrl><![CDATA[{}]]></HQMusicUrl>
  </Music>
  <FuncFlag>0</FuncFlag>
 </xml>
 """
 response = template.format(self.msg.user, self.msg.master, self.time, title, description, url, hqurl)
 return response
 def voiceHandle(self):
 response = get_turing_response(self.msg.recognition)
 result = self.textHandle(self.msg.user, self.msg.master, self.time, response)
 return result
 def imageHandle(self, user='', master='', time='', mediaid=''):
 template = """
 <xml>
  <ToUserName><![CDATA[{}]]></ToUserName>
  <FromUserName><![CDATA[{}]]></FromUserName>
  <CreateTime>{}</CreateTime>
  <MsgType><![CDATA[image]]></MsgType>
  <Image>
  <MediaId><![CDATA[{}]]></MediaId>
  </Image>
  </xml>
 """
 if mediaid == '':
  response = self.msg.mediaid
 else:
  response = mediaid
 result = template.format(self.msg.user, self.msg.master, self.time, response)
 return result
 def videoHandle(self):
 return 'video'
 def shortVideoHandle(self):
 return 'shortvideo'
 def locationHandle(self):
 return 'location'
 def linkHandle(self):
 return 'link'
 def eventHandle(self):
 return 'event'
 def newsHandle(self, items):
 # 圖文消息這塊真的好多坑,尤其是<![CDATA[]]>中間不可以有空格,可怕極了
 articlestr = """
 <item>
  <Title><![CDATA[{}]]></Title>
  <Description><![CDATA[{}]]></Description>
  <PicUrl><![CDATA[{}]]></PicUrl>
  <Url><![CDATA[{}]]></Url>
 </item>
 """
 itemstr = ""
 for item in items:
  itemstr += str(articlestr.format(item['title'], item['description'], item['picurl'], item['url']))
 template = """
 <xml>
  <ToUserName><![CDATA[{}]]></ToUserName>
  <FromUserName><![CDATA[{}]]></FromUserName>
  <CreateTime>{}</CreateTime>
  <MsgType><![CDATA[news]]></MsgType>
  <ArticleCount>{}</ArticleCount>
  <Articles>{}</Articles>
 </xml>
 """
 result = template.format(self.msg.user, self.msg.master, self.time, len(items), itemstr)
 return result

robot.py

這個文件屬于那種畫龍點睛性質(zhì)的。

#!/usr/bin python
#coding: utf8
import requests
import json
def get_turing_response(req=""):
 url = "http://www.tuling123.com/openapi/api"
 secretcode = "嘿嘿,這個就不說啦"
 response = requests.post(url=url, json={"key": secretcode, "info": req, "userid": 12345678})
 return json.loads(response.text)['text'] if response.status_code == 200 else ""
def get_qingyunke_response(req=""):
 url = "http://api.qingyunke.com/api.php?key=free&appid=0&msg={}".format(req)
 response = requests.get(url=url)
 return json.loads(response.text)['content'] if response.status_code == 200 else ""
# 簡單做下。后面慢慢來
def get_response_by_keyword(keyword):
 if '團建' in keyword:
 result = {"type": "image", "content": "3s9Dh5rYdP9QruoJ_M6tIYDnxLLdsQNCMxkY0L2FMi6HhMlNPlkA1-50xaE_imL7"}
 elif 'music' in keyword or '音樂' in keyword:
 musicurl='http://204.11.1.34:9999/dl.stream.qqmusic.qq.com/C400001oO7TM2DE1OE.m4a?vkey=3DFC73D67AF14C36FD1128A7ABB7247D421A482EBEDA17DE43FF0F68420032B5A2D6818E364CB0BD4EAAD44E3E6DA00F5632859BEB687344&guid=5024663952&uin=1064319632&fromtag=66'
 result = {"type": "music", "content": {"title": "80000", "description":"有個男歌手姓巴,他的女朋友姓萬,于是這首歌叫80000", "url": musicurl, "hqurl": musicurl}}
 elif '關于' in keyword:
 items = [{"title": "關于我", "description":"喜歡瞎搞一些腳本", "picurl":"https://avatars1.githubusercontent.com/u/12973402?s=460&v=4", "url":"https://github.com/guoruibiao"},
   {"title": "我的博客", "description":"收集到的,瞎寫的一些博客", "picurl":"http://avatar.csdn.net/0/8/F/1_marksinoberg.jpg", "url":"http://blog.csdn.net/marksinoberg"},
   {"title": "薛定諤的:dog:", "description": "副標題有點奇怪,不知道要怎么設置比較好","picurl": "https://www.baidu.com/img/bd_logo1.png","url": "http://www.baidu.com"}
   ]
 result = {"type": "news", "content": items}
 else:
 result = {"type": "text", "content": "可以自由進行拓展"}
 return result

其實這看起來是一個文件,其實可以拓展為很多的方面。

如果想通過公眾號來監(jiān)控服務器的運行情況,就可以添加一個對服務器負載的監(jiān)控的腳本;

如果想做一些爬蟲,每天抓取一些高質(zhì)量的文章,然后通過公眾號進行展示。

不方便使用電腦的情況下,讓公眾號調(diào)用一些命令也可以算是曲線救國的一種方式。

等等吧,其實有多少想法,就可以用Python進行事先。然后通過公眾號這個平臺進行展示。

易錯點

在從PHP重構為Python的過程中,我其實也是遇到了一些坑的。下面總結(jié)下,如果恰好能幫助到遇到同樣問題的你,那我這篇文章也算是沒有白寫了。

微信公眾號的開發(fā),其實關鍵就在于理解這個工作的模式。大致有這么兩條路。

用戶把消息發(fā)送到微信公眾平臺上,平臺把信息拼接組裝成XML發(fā)到我們自己的服務器。(通過一系列的認證,校驗,讓平臺知道,我們的服務是合法的),然后服務器將XML進行解析,處理。

我們的服務器解析處理完成后,將數(shù)據(jù)再次拼接組裝成XML,發(fā)給微信公眾平臺,平臺幫我們把數(shù)據(jù)反饋給對應的用戶。
這樣,一個交互就算是完成了。在這個過程中,有下面幾個容易出錯的地方。

token校驗: token的校驗是一個get方式的請求。通過代碼我們也可以看到,就是對singature的校驗,具體看代碼就明白了。

XML數(shù)據(jù)的解析,對于不同的消息,記得使用不同的格式。其中很容易出錯的就是格式不規(guī)范。 <!CDATA[[]]> 中括號之間最好不要有空格,不然定位起錯誤還是很麻煩的。

服務的穩(wěn)定性。這里用的web框架是flask,小巧精良。但是對并發(fā)的支持性不是很好,對此可以使用uwsgi和Nginx來實現(xiàn)一個更穩(wěn)定的服務。如果就是打算自己玩一玩,通過命令行啟用(如python api.py)就不是很保險了,因為很有可能會因為用戶的一個奇怪的輸入導致整個服務垮掉,建議使用nohup的方式,來在一定程度上保證服務的質(zhì)量。

結(jié)果演示

目前這個公眾號支持文字,語音,圖片,圖文等消息類型。示例如下。

總結(jié)

在將公眾號從PHP重構為Python的過程中,遇到了一些問題,然后通過不斷的摸索,慢慢的也把問題解決了。其實有時候就是這樣,只有不斷的發(fā)現(xiàn)問題,才能不斷的提升自己。

這里其實并沒有深入的去完善,重構后的微信公眾號其實能做的還有很多,畢竟就看敢不敢想嘛。好了,就先扯這么多了,后面如果有好的思路和實現(xiàn),再回來更新好了。

以上所述是小編給大家介紹的Python微信公眾號開發(fā)平臺,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關文章

  • python神經(jīng)網(wǎng)絡tensorflow利用訓練好的模型進行預測

    python神經(jīng)網(wǎng)絡tensorflow利用訓練好的模型進行預測

    這篇文章主要為大家介紹了python神經(jīng)網(wǎng)絡tensorflow利用訓練好的模型進行預測,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • python使用 __init__初始化操作簡單示例

    python使用 __init__初始化操作簡單示例

    這篇文章主要介紹了python使用 __init__初始化操作,結(jié)合實例形式分析了Python面向?qū)ο蟪绦蛟O計中使用__init__進行初始化操作相關技巧與注意事項,需要的朋友可以參考下
    2019-09-09
  • Python實現(xiàn)提取文章摘要的方法

    Python實現(xiàn)提取文章摘要的方法

    這篇文章主要介紹了Python實現(xiàn)提取文章摘要的方法,實例分析了Python提取文章摘要的原理與實現(xiàn)技巧,需要的朋友可以參考下
    2015-04-04
  • Python?OpenCV超詳細講解基本功能

    Python?OpenCV超詳細講解基本功能

    OpenCV用C++語言編寫,它具有C?++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac?OS,OpenCV主要傾向于實時視覺應用,并在可用時利用MMX和SSE指令,本篇文章帶你了解OpenCV的基本功能
    2022-04-04
  • Python制作簡易版小工具之計算天數(shù)的實現(xiàn)思路

    Python制作簡易版小工具之計算天數(shù)的實現(xiàn)思路

    這篇文章主要介紹了Python制作簡易版小工具之計算天數(shù)的實現(xiàn)思路,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-02-02
  • Python 解決logging功能使用過程中遇到的一個問題

    Python 解決logging功能使用過程中遇到的一個問題

    這篇文章主要介紹了Python 解決logging功能使用過程中遇到的一個問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • python基于socket函數(shù)實現(xiàn)端口掃描

    python基于socket函數(shù)實現(xiàn)端口掃描

    這篇文章主要為大家詳細介紹了python基于socket函數(shù)實現(xiàn)端口掃描,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Python實現(xiàn)滑雪小游戲

    Python實現(xiàn)滑雪小游戲

    這篇文章主要為大家詳細介紹了Python實現(xiàn)滑雪小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 淺談python多線程和多線程變量共享問題介紹

    淺談python多線程和多線程變量共享問題介紹

    這篇文章主要介紹了淺談python多線程和多線程變量共享問題介紹,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-04-04
  • python爬取全國水雨情信息詳解

    python爬取全國水雨情信息詳解

    這篇文章主要為大家詳細介紹了python爬取全國水雨情信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10

最新評論