91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

微信開發之如何使用消息接口

發布時間:2021-03-12 10:02:54 來源:億速云 閱讀:106 作者:小新 欄目:移動開發

這篇文章主要介紹了微信開發之如何使用消息接口,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

                                                       承啟

因為之前設計了要實現一個微信機器人,以向用戶響應響應的文章,這個app十分地簡單,并不需要特別深入的設計,而且我的想法是:拿來主義, 反正github上面那么多的用python寫的博客系統,我只需要實現微信響應的部分,也就是從數據庫中獲取文章的數據,然后將文章的標題,url,圖片等信息打包成xml格式返回給微信服務器,服務器再返回給用戶。而且我發現,有菜單的會好很多,就像一個完整的app,可以直接點擊察看某篇文章,而不是硬邦邦的回復。我是用別人寫的一個博客系統進行改造——saepy-log.而這個博客系統又是基于tornado框架的,本來不打算染指tornado的,但是不得不硬著頭皮鉆研。其中遇到了很多困難,在sql語句的like寫法,察看文檔方面有了比較大的收獲。

部署與開發

事先說明,由于我是各種折騰,所以可能照本篇文章做是做不成的。下載了saepy-log的源碼后,按照這里的操作進行上傳后,就可以將博客系統安裝在sae平臺上了,然后用svn把代碼同步下來到本地工作目錄,一切準備就緒。

我們要修改的是blog.py是博客的核心功能所在,還有modle.py是數據模型的關鍵所在,我們將要擴展數據模型功能,使之完成我們的微信功能。

在blog.py里面添加我們的微信功能類 weixin.py(由于是用tornado框架,所以方法與在django里面略有不同):

導入需要用到的包

# weixin used package
import xml.etree.ElementTree as ET
import urllib,urllib2,time,hashlib
                                               
import tornado.wsgi
import tornado.escape

主要是xml的解析和一些處理字符串的包,接下來我們定義weixin類的主體:

# 添加微信推送帳號
class WeiXinPoster(BaseHandler):
    #-----------------------------------------------------------------------
    # 處理get方法 對應check_signature
    def get(self):
        global TOKEN
        signature = self.get_argument("signature")
        timestamp = self.get_argument("timestamp")
        nonce = self.get_argument("nonce")
        echoStr = self.get_argument("echostr")
        token = TOKEN
        tmpList = [token,timestamp,nonce]
        tmpList.sort()
        tmpstr = "%s%s%s" % tuple(tmpList)
        tmpstr = hashlib.sha1(tmpstr).hexdigest()
                                              
        if tmpstr == signature:
            self.write(echoStr)
            #return echoStr
        else:
            self.write(None);
            #return None
                                                          
    # 處理post方法,對應response_msg
    def post(self):
        global SORRY
        # 從request中獲取請求文本
        rawStr = self.request.body
        # 將文本進行解析,得到請求的數據
        msg = self.parse_request_xml(ET.fromstring(rawStr))
        # 根據請求消息來處理內容返回
        query_str = msg.get("Content")
        query_str = tornado.escape.utf8(query_str)
        # TODO 用戶發來的數據類型可能多樣,所以需要判別
        response_msg = ""
        return_data = ""
        # 使用簡單的處理邏輯,有待擴展
        if query_str[0] == "h":     # send help menu to user
            response_msg = self.get_help_menu()     # 返回消息
            # 包括post_msg,和對應的 response_msg
            if response_msg:
                return_data = self.pack_text_xml(msg, response_msg)
            else:
                response_msg = SORRY
                return_data = self.pack_text_xml(msg, response_msg)
            self.write(return_data)
        # 分類
        elif query_str[0] =="c":
            category = query_str[1:]
            response_msg = self.get_category_articles(category)
            if response_msg:
                return_data = self.pack_news_xml(msg, response_msg)
            else:
                response_msg = SORRY
                return_data = self.pack_text_xml(msg, response_msg)
            self.write(return_data)
        # 列出文章列表
        elif query_str[0] =="l":
            response_msg = self.get_article_list()
            if response_msg:
                return_data = self.pack_text_xml(msg, response_msg)
            else:
                response_msg = SORRY
                return_data = self.pack_text_xml(msg, response_msg)
            self.write(return_data)
        # 直接獲取某篇文章
        elif query_str[0] == "a":
            # 直接獲取文章的id,然后在數據庫中查詢
            article_id = int(query_str[1:])
            # 進行操作
            response_msg = self.get_response_article_by_id(article_id)
            if response_msg:
                return_data = self.pack_news_xml(msg, response_msg)
            else:
                response_msg = SORRY
                return_data = self.pack_text_xml(msg, response_msg)
            self.write(return_data)
                                                          
        # 還要考慮其他
        elif query_str[0] == "s":
            keyword = str(query_str[1:])
            # 搜索關鍵詞,返回相關文章
            response_msg = self.get_response_article(keyword)
            # 返回圖文信息
            if response_msg:
                return_data = self.pack_news_xml(msg, response_msg)
            else:
                response_msg = SORRY
                return_data = self.pack_text_xml(msg, response_msg)
            self.write(return_data)
                                                          
        elif query_str[0] == "n":
            response_msg = self.get_latest_articles()
            # 返回圖文信息
            if response_msg:
                return_data = self.pack_news_xml(msg, response_msg)
            else:
                response_msg = SORRY
                return_data = self.pack_text_xml(msg, response_msg)
            self.write(return_data)
        # 如果找不到,返回幫助信息
        else:
            response_msg = get_help_menu()
            if response_msg:
                return_data = response_msg
            else:
                return_data = SORRY
            self.write(return_data)
    # n for 獲取最新的文章
    def get_latest_articles(self):
        global MAX_ARTICLE
        global PIC_URL
        article_list = Article.get_articles_by_latest()
        article_list_length = len(article_list)
        count = (article_list_length < MAX_ARTICLE) and article_list_length or MAX_ARTICLE
        if article_list:
            # 構造圖文消息
            articles_msg = {'articles':[]}
            for i in range(0,count):
                article = {
                        'title': article_list[i].slug,
                        'description':article_list[i].description,
                        'picUrl':PIC_URL,
                        'url':article_list[i].absolute_url
                    }
                # 插入文章
                articles_msg['articles'].append(article)
                article = {}
            # 返回文章
            return articles_msg
                                                  
    #-----------------------------------------------------------------------
    # 解析請求,拆解到一個字典里    
    def parse_request_xml(self,root_elem):
        msg = {}
        if root_elem.tag == 'xml':
            for child in root_elem:
                msg[child.tag] = child.text  # 獲得內容
            return msg
                                              
    #-----------------------------------------------------------------------
    def get_help_menu(self):
        menu_msg = '''歡迎關注南苑隨筆,在這里你能獲得關于校園的資訊和故事。回復如下按鍵則可以完成得到相應的回應
        h :幫助(help)
        l :文章列表(article list)
        f : 獲得分類列表
        n : 獲取最新文章
        a + 數字 :察看某篇文章 a2 察看第2篇文章
        s + 關鍵字 : 搜索相關文章 s科研 察看科研相關
        c + 分類名 : 獲取分類文章 c校園生活 察看校園生活分類
        其他 : 功能有待豐富'''
        return menu_msg
    #-----------------------------------------------------------------------
    # 獲取文章列表
    def get_article_list(self):
        # 查詢數據庫獲取文章列表
        article_list = Article.get_all_article_list()
        article_list_str = "最新文章列表供您點閱,回復a+數字即可閱讀: \n"
        for i in range(len(article_list)):
            art_id = str(article_list[i].id)
            art_id = tornado.escape.native_str(art_id)
                                                          
            art_title = article_list[i].title
            art_title = tornado.escape.native_str(art_title)
                                                          
            art_category = article_list[i].category
            art_category = tornado.escape.native_str(art_category)
                                                          
                                                          
            article_list_str +=  art_id + ' ' + art_title + ' ' + art_category + '\n'
        return article_list_str
                                                      
    # 按照分類查找
    def get_category_articles(self, category):
        global MAX_ARTICLE
        global PIC_URL
        article_list = Article.get_articles_by_category(category)
        article_list_length = len(article_list)
        count = (article_list_length < MAX_ARTICLE) and article_list_length or MAX_ARTICLE
        if article_list:
            # 構造圖文消息
            articles_msg = {'articles':[]}
            for i in range(0,count):
                article = {
                        'title': article_list[i].slug,
                        'description':article_list[i].description,
                        'picUrl':PIC_URL,
                        'url':article_list[i].absolute_url
                    }
                # 插入文章
                articles_msg['articles'].append(article)
                article = {}
            # 返回文章
            return articles_msg
    #-----------------------------------------------------------------------
    # 獲取用于返回的msg
    def get_response_article(self, keyword):
        global PIC_URL
        keyword = str(keyword)
        # 從數據庫查詢得到若干文章
        article = Article.get_article_by_keyword(keyword)
        # 這里先用測試數據
        if article:
            title = article.slug
            description = article.description
            picUrl = PIC_URL
            url = article.absolute_url
            count = 1
            # 也有可能是若干篇
            # 這里實現相關邏輯,從數據庫中獲取內容
                                                          
            # 構造圖文消息
            articles_msg = {'articles':[]}
            for i in range(0,count):
                article = {
                        'title':title,
                        'description':description,
                        'picUrl':picUrl,
                        'url':url
                    }
                # 插入文章
                articles_msg['articles'].append(article)
                article = {}
            # 返回文章
            return articles_msg
        else:
            return
                                                  
    def get_response_article_by_id(self, post_id):
        global PIC_URL
        # 從數據庫查詢得到若干文章
        article = Article.get_article_by_id_detail(post_id)
        # postId為文章id
        if article:
            title = article.slug
            description = article.description
            picUrl = PIC_URL
            url = article.absolute_url
            count = 1
            # 這里實現相關邏輯,從數據庫中獲取內容
                                                          
            # 構造圖文消息
            articles_msg = {'articles':[]}
            for i in range(0,count):
                article = {
                        'title':title,
                        'description':description,
                        'picUrl':picUrl,
                        'url':url
                    }
                # 插入文章
                articles_msg['articles'].append(article)
                article = {}
            # 返回文章
            return articles_msg
        else:
            return

可見app的難度并不大,還是和上次使用微信API里面的和接近,需要用到的幾個全局變量,需要自己定義,如token,如PIC_URL等。程序原理其實就是解析用戶請求,h開頭,則提供幫助菜單,a開頭加數字的,就提供某篇文章,等等,然后提供相應的函數進行處理,這里面說明起來比較復雜,就以獲取分類文章來講吧:

需要用到分析用戶請求字符串:

# 分類
        elif query_str[0] =="c":
            category = query_str[1:]
            response_msg = self.get_category_articles(category)
            if response_msg:
                return_data = self.pack_news_xml(msg, response_msg)
            else:
                response_msg = SORRY
                return_data = self.pack_text_xml(msg, response_msg)
            self.write(return_data)

這里要提供get_category_articles(category)的功能,所以需要在weixin類里面實現一個這樣的函數:

# 按照分類查找
    def get_category_articles(self, category):
        global MAX_ARTICLE
        global PIC_URL
        article_list = Article.get_articles_by_category(category)
        article_list_length = len(article_list)
        count = (article_list_length < MAX_ARTICLE) and article_list_length or MAX_ARTICLE
        if article_list:
            # 構造圖文消息
            articles_msg = {'articles':[]}
            for i in range(0,count):
                article = {
                        'title': article_list[i].slug,
                        'description':article_list[i].description,
                        'picUrl':PIC_URL,
                        'url':article_list[i].absolute_url
                    }
                # 插入文章
                articles_msg['articles'].append(article)
                article = {}
            # 返回文章
            return articles_msg

很顯然,這里需要和數據庫模型Article打交道,看看Article是否實現了該功能,很遺憾沒有,那么我們只好卷起袖子自己干——擴展Article,所以我們轉戰到modle.py文件里面了,寫下了如下的代碼:

# 返回一個包含若干篇文章的數組 limit 5
    def get_articles_by_category(self, category):
        sdb._ensure_connected()
        article_list = sdb.query('SELECT * FROM `sp_posts` WHERE `category` = %s LIMIT 5', str(category))
        for i in range(len(article_list)):
            article_list[i] = post_detail_formate(article_list[i])
        return article_list

這里進行了數據庫查詢,將category參數傳遞進去,選擇category為參數的5篇文章,打包返回。post_detail_formate是博客系統已經寫好的,我們只要拿來用就行了。在python里面,寫sql語句要很小心,遇到要傳入參數的,最好是用逗號分割開,而不是使用%來填充參數。特別是使用like的時候,我們往往需要寫這樣的sql語句:

SELECT * FROM `sp_posts` WHERE `category` LIKE '%study%'

但是python里面又是用%s做參數占位符的,故而會引起很多不必要的錯誤,比如這里。總之要安全使用,最好是作為參數傳遞,python會為他們與原字符串里的%等分開。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“微信開發之如何使用消息接口”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

彭州市| 凤凰县| 余干县| 枣强县| 蒙阴县| 乌拉特后旗| 安徽省| 安乡县| 南安市| 怀远县| 遵义县| 灌南县| 乌审旗| 宁河县| 文昌市| 东丰县| 墨脱县| 柳林县| 平昌县| 那曲县| 孟州市| 京山县| 海丰县| 广元市| 准格尔旗| 普陀区| 滦南县| 庆城县| 尼勒克县| 海南省| 九江县| 土默特左旗| 鄂伦春自治旗| 铜陵市| 曲麻莱县| 伊通| 耒阳市| 依兰县| 高台县| 江山市| 威信县|