手把手教你用圖靈機(jī)器人做微信公眾號(hào)自動(dòng)回復(fù)助手

手把手教你用圖靈機(jī)器人做微信公眾號(hào)自動(dòng)回復(fù)助手

本文首發(fā)于我的個(gè)人博客:尾尾部落

閱讀這篇文章,你將會(huì)學(xué)會(huì)以下內(nèi)容:

  1. 如何用flask搭建微信公眾平臺(tái)服務(wù)
  2. 如何將在微信公眾平臺(tái)調(diào)用圖靈機(jī)器人
  3. 如何用uwsgi+supervisor+nginx部署flask應(yīng)用

實(shí)驗(yàn)前提

  • 一個(gè)可供外網(wǎng)訪問的主機(jī)(比如云服務(wù)器)
  • 一個(gè)微信公眾號(hào)
  • 一個(gè)圖靈機(jī)器人賬號(hào)

一、創(chuàng)建圖靈機(jī)器人

登陸圖靈機(jī)器人后,在個(gè)人主面點(diǎn)擊創(chuàng)建機(jī)器人

image

填寫相關(guān)信息:
[圖片上傳失敗...(image-f1a704-1531208389290)]
創(chuàng)建成功后,會(huì)自動(dòng)跳轉(zhuǎn)到機(jī)器人設(shè)置界面疚顷,在這里你可以對(duì)機(jī)器人進(jìn)行個(gè)性化定制。其實(shí),圖靈機(jī)器人提供簡(jiǎn)單的方法薯酝,快速接入微信公眾號(hào),這太沒有挑戰(zhàn)性了爽柒,對(duì)于喜歡搞事情的我們吴菠,肯定不能選擇這種方法。
image

我們將鼠標(biāo)往下滑浩村,會(huì)出現(xiàn)api接入做葵,這個(gè)apikey就是我們等等用來接入微信公眾號(hào)的密鑰。
image

至此心墅,圖靈機(jī)器人準(zhǔn)備完畢酿矢。

二、接入微信公眾號(hào)

跟著微信公眾平臺(tái)開發(fā)文檔一步一步往下走即可怎燥,只不過瘫筐,我們這里使用Flask代替web.py。為什么使用Flask?

喜歡铐姚。任性策肝。

主要步驟:

1. 搭建服務(wù)

這里以Ubuntu 16.04.2 LTS的云服務(wù)器為例進(jìn)行說明。
準(zhǔn)備環(huán)境:

# 創(chuàng)建項(xiàng)目目錄
mkdir -p /var/www/weixin
# 進(jìn)入項(xiàng)目目錄
cd /var/www/weixin
# 安裝virtualenv包管理工具
apt install virtualenv
# 創(chuàng)建項(xiàng)目虛擬環(huán)境
virtualenv venv
# 激活環(huán)境
source venv/bin/activate

成功激活環(huán)境后,會(huì)出現(xiàn)(venv)

image

# 安裝Flask包
pip install flask
pip install requests

使用如下代碼創(chuàng)建run.py文件

from flask import Flask
from flask import request

app = Flask(__name__)

@app.route("/")
def index():
    return "Hello World!"

if __name__ == "__main__":
    app.run(host='0.0.0.0')

運(yùn)行python run.py之众,這樣服務(wù)就啟動(dòng)起來了篇梭。
[圖片上傳失敗...(image-df9b44-1531208389290)]

你可以通過瀏覽器,輸入x.x.x.x:5000來訪問你的服務(wù)酝枢。

這里的x.x.x.x是你云主機(jī)的ip地址恬偷,比如100.39.101.123,下同帘睦。

如果成功袍患,就會(huì)看到如下界面:

image

接下來,進(jìn)入微信公眾平臺(tái)竣付,點(diǎn)擊基本配置
image

點(diǎn)擊修改配置诡延,填寫服務(wù)器基本配置:
image

這時(shí)候,你還沒有配置服務(wù)器信息古胆,還不能提交肆良。
先放著,我們回到云服務(wù)器逸绎,打開run.py文件惹恃,
添加驗(yàn)證所需要的代碼:

# -*- coding:utf-8 -*-
from flask import Flask
from flask import request
import hashlib

app = Flask(__name__)

@app.route("/")
def index():
    return "Hello World!"

@app.route("/wechat", methods=["GET","POST"])
def weixin():
    if request.method == "GET":     # 判斷請(qǐng)求方式是GET請(qǐng)求
        my_signature = request.args.get('signature')     # 獲取攜帶的signature參數(shù)
        my_timestamp = request.args.get('timestamp')     # 獲取攜帶的timestamp參數(shù)
        my_nonce = request.args.get('nonce')        # 獲取攜帶的nonce參數(shù)
        my_echostr = request.args.get('echostr')         # 獲取攜帶的echostr參數(shù)

        token = 'Your token'     # 一定要跟剛剛填寫的token一致

        # 進(jìn)行字典排序
        data = [token,my_timestamp ,my_nonce ]
        data.sort()

        # 拼接成字符串
        temp = ''.join(data)

        # 進(jìn)行sha1加密
        mysignature = hashlib.sha1(temp).hexdigest()

        # 加密后的字符串可與signature對(duì)比,標(biāo)識(shí)該請(qǐng)求來源于微信
        if my_signature == mysignature:
            return my_echostr

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

image

保存棺牧,再運(yùn)行python run.py
回到微信公眾平臺(tái)巫糙,點(diǎn)擊提交確定颊乘,收到提交成功的提示参淹,表明配置成功。

image

回到云服務(wù)器乏悄,可以看到微信公眾平臺(tái)往我們的服務(wù)器發(fā)了一個(gè)GET請(qǐng)求浙值,并且我們成功地返回了驗(yàn)證信息。
image

再回到公眾平臺(tái)檩小,點(diǎn)擊啟用开呐,可以看到服務(wù)器配置(已啟用)的字樣。

image

至此识啦,我們已經(jīng)成功將我們的服務(wù)與微信公眾平臺(tái)連接上了负蚊。

2. 接入圖靈機(jī)器人

打開run.py文件,添加代碼引入圖靈機(jī)器人:

# -*- coding:utf-8 -*-
from flask import Flask
from flask import request
import hashlib
import requests
import json
import time
import re
import xml.etree.ElementTree as ET

app = Flask(__name__)

@app.route("/")
def index():
    return "Hello World!"

@app.route("/wechat", methods=["GET","POST"])
def weixin():
    if request.method == "GET":     # 判斷請(qǐng)求方式是GET請(qǐng)求
        my_signature = request.args.get('signature')     # 獲取攜帶的signature參數(shù)
        my_timestamp = request.args.get('timestamp')     # 獲取攜帶的timestamp參數(shù)
        my_nonce = request.args.get('nonce')        # 獲取攜帶的nonce參數(shù)
        my_echostr = request.args.get('echostr')         # 獲取攜帶的echostr參數(shù)

        token = 'Your token'     # 一定要跟剛剛填寫的token一致

        # 進(jìn)行字典排序
        data = [token,my_timestamp ,my_nonce ]
        data.sort()

        # 拼接成字符串
        temp = ''.join(data)

        # 進(jìn)行sha1加密
        mysignature = hashlib.sha1(temp).hexdigest()

        # 加密后的字符串可與signature對(duì)比颓哮,標(biāo)識(shí)該請(qǐng)求來源于微信
        if my_signature == mysignature:
            return my_echostr
    else:
        # 解析xml
        xml = ET.fromstring(request.data)
        toUser = xml.find('ToUserName').text
        fromUser = xml.find('FromUserName').text
        msgType = xml.find("MsgType").text
        createTime = xml.find("CreateTime")
        # 判斷類型并回復(fù)
        if msgType == "text":
            content = xml.find('Content').text
            return reply_text(fromUser, toUser, reply(fromUser, content))
        else:
            return reply_text(fromUser, toUser, "我只懂文字")

def reply_text(to_user, from_user, content):
    """
    以文本類型的方式回復(fù)請(qǐng)求
    """
    return """
    <xml>
        <ToUserName><![CDATA[{}]]></ToUserName>
        <FromUserName><![CDATA[{}]]></FromUserName>
        <CreateTime>{}</CreateTime>
        <MsgType><![CDATA[text]]></MsgType>
        <Content><![CDATA[{}]]></Content>
    </xml>
    """.format(to_user, from_user, int(time.time() * 1000), content)


def reply(openid, msg):
    '''
    使用圖靈機(jī)器人
    '''
    data = {"key": "Your tuling apikey", "info": msg, "userid": openid}#  使用自己的key
    r = requests.post('http://openapi.tuling123.com/openapi/api', data)
    text = json.loads(r.text)
    return text['text'].encode('utf-8')

if __name__ == "__main__":
    app.run(host='0.0.0.0',port=80)

image

image

保存后家妆,運(yùn)行python run.py
這時(shí)候,你就可以在你的手機(jī)微信公眾號(hào)窗口調(diào)戲圖靈機(jī)器人了:
image

到這里冕茅,你以為結(jié)束了嗎伤极?還早著呢蛹找。

三、部署flask服務(wù)

image

正如你所看到了哨坪,當(dāng)你運(yùn)行python run.py庸疾,服務(wù)就運(yùn)行起來了,但是當(dāng)你按下ctrl+c或者斷開與云服務(wù)器的連接当编,服務(wù)就自動(dòng)掉線了届慈,這時(shí)候,你再呼喚圖靈機(jī)器人忿偷,它就無(wú)應(yīng)答了金顿。因此,直接運(yùn)行python run.py這種方法只適合本地開發(fā)調(diào)試鲤桥,線上用這種方法不穩(wěn)定揍拆,我們需要使用uwsgi

安裝uwsgi茶凳,supervisoruwsgi

apt-get install nginx
apt-get install supervisor
pip install uwsgi

安裝完成后嫂拴,我們來測(cè)試一下uwsgi。我們先將run.py中的port去掉贮喧,保留host:

image

保存筒狠。
python2運(yùn)行:

uwsgi --socket 0.0.0.0:5000 --protocol=http -w run:app

python3運(yùn)行:

uwsgi --socket 0.0.0.0:5000 -w run:app

然后再在瀏覽器上輸入http://x.x.x.x:5000,看到正確輸出Hello World!塞淹,就表示uwsgi安裝正確窟蓝,我們就可以使用uwsgi來啟動(dòng)flask服務(wù)了罪裹。同時(shí)饱普,我們可以看到服務(wù)器上輸出如下信息:

image

但是這種方法還是每次需要從命令行啟動(dòng),太麻煩了状共。下面我們來做一些配置套耕。在/var/www/weixin/目錄下創(chuàng)建配置文件weixin_uwsgi.ini:

[uwsgi]
module = run:app
master = true
processes = 4
chdir = /var/www/weixin
socket = /var/www/weixin/weixin_uwsgi.sock
logto = /var/www/weixin/%n.log
chmod-socket = 777
vacuum = true

配置完成后運(yùn)行:

uwsgi --ini weixin_uwsgi.ini

image

就會(huì)在項(xiàng)目目錄下生成weixin_uwsgi.sock文件,這個(gè)文件一般大小為0峡继,它是用來和Nginx通信的冯袍。
這時(shí)候,我們不能ctrl+c殺掉這個(gè)進(jìn)程碾牌,重新開一個(gè)連接窗口

# 進(jìn)入項(xiàng)目目錄
cd /var/www/weixin
# 激活虛擬環(huán)境
source venv/bin/activate
# 查看當(dāng)前目錄下的文件
ll

[圖片上傳失敗...(image-305b8a-1531208389290)]
接下來康愤,我們開始配置Nginx
刪除nginx的默認(rèn)配置文件:

rm /etc/nginx/sites-enabled/default

然后在我們的項(xiàng)目目錄下創(chuàng)建nginx配置文件vim /var/www/weixin/weixin_nginx.conf:

server {
    listen  80;
    server_name x.x.x.x; #公網(wǎng)地址
    location / {
        include      uwsgi_params;
        uwsgi_pass unix:/var/www/weixin/weixin_uwsgi.sock;
    }
}

[圖片上傳失敗...(image-aa0c39-1531208389291)]
保存退出舶吗。將weixin_nginx.conf軟鏈接到nginx的conf.d目錄下:

sudo ln -s /var/www/weixin/weixin_nginx.conf  /etc/nginx/conf.d/

重啟nginx服務(wù):

/etc/init.d/nginx restart

[圖片上傳失敗...(image-66f57-1531208389291)]
看到ok就表示nginx正常啟動(dòng)征冷。這時(shí)不出意外,你在瀏覽器中輸入http://x.x.x.x誓琼,就可以看到Hello World!检激。
[圖片上傳失敗...(image-a221af-1531208389291)]
這樣我們就不用再加5000的端口號(hào)肴捉,直接用ip地址和默認(rèn)的80端口就可以訪問了。

使用supervisor引導(dǎo)uwsgi

image

這時(shí)候我們?cè)倩氐角耙粋€(gè)運(yùn)行uwsgi的窗口叔收,uwsgi保持運(yùn)行的狀態(tài)齿穗,我們不能斷開它,也不能做其他任何事情饺律,一旦服務(wù)器斷開連接窃页,,uwsgi服務(wù)就會(huì)關(guān)閉复濒,weixin_uwsgi.sock文件就會(huì)消失腮出,這時(shí)再訪問網(wǎng)站,nginx就會(huì)報(bào)錯(cuò):
[圖片上傳失敗...(image-d88d2-1531208389291)]
所以supervisor就派上用場(chǎng)了芝薇。我們?cè)陧?xiàng)目目錄下創(chuàng)建supervisor配置文件vim /var/www/weixin/weixin_supervisor.conf:

[program:weixin]
# 啟動(dòng)命令入口
command=/var/www/weixin/venv/bin/uwsgi /var/www/weixin/weixin_uwsgi.ini
# 命令程序所在目錄
directory=/var/www/weixin
#運(yùn)行命令的用戶名
user=root
autostart=true
autorestart=true
#日志地址
stdout_logfile=/var/www/weixin/weixin_supervisor.log

保存退出后胚嘲,啟動(dòng)supervisor服務(wù)

service supervisor start

至此,flask就可以穩(wěn)定運(yùn)行了洛二。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末馋劈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子晾嘶,更是在濱河造成了極大的恐慌妓雾,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垒迂,死亡現(xiàn)場(chǎng)離奇詭異械姻,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)机断,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門楷拳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吏奸,你說我怎么就攤上這事欢揖。” “怎么了奋蔚?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵她混,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我泊碑,道長(zhǎng)坤按,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任馒过,我火速辦了婚禮臭脓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沉桌。我一直安慰自己谢鹊,他們只是感情好算吩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著佃扼,像睡著了一般偎巢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上兼耀,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天压昼,我揣著相機(jī)與錄音,去河邊找鬼瘤运。 笑死窍霞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拯坟。 我是一名探鬼主播但金,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼郁季!你這毒婦竟也來了冷溃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤梦裂,失蹤者是張志新(化名)和其女友劉穎似枕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體年柠,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡凿歼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了冗恨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片答憔。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖派近,靈堂內(nèi)的尸體忽然破棺而出攀唯,到底是詐尸還是另有隱情,我是刑警寧澤渴丸,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站另凌,受9級(jí)特大地震影響谱轨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吠谢,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一土童、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧工坊,春花似錦献汗、人聲如沸敢订。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)楚午。三九已至,卻和暖如春尿招,著一層夾襖步出監(jiān)牢的瞬間矾柜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工就谜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怪蔑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓丧荐,卻偏偏與公主長(zhǎng)得像缆瓣,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虹统,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容