成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

給你的公眾號(hào)添加一個(gè)智能機(jī)器人

開(kāi)發(fā) 開(kāi)發(fā)工具
我們代碼使用 Python 開(kāi)發(fā),所以需要配置好 Python 開(kāi)發(fā)環(huán)境,安裝 Flash 庫(kù)。最后需要注冊(cè)一個(gè)圖靈機(jī)器人賬號(hào),調(diào)用其 API 接口。

環(huán)境和工具

  • 公眾號(hào)一個(gè)
  • 云服務(wù)器一臺(tái)
  • Python 環(huán)境
  • Flask(Python 第三方庫(kù))
  • 圖靈機(jī)器人賬號(hào)

以上就是我們實(shí)現(xiàn)公眾號(hào)后臺(tái)智能對(duì)話機(jī)器人需要的環(huán)境和工具,前兩個(gè)就不多說(shuō)了。我們代碼使用 Python 開(kāi)發(fā),所以需要配置好 Python 開(kāi)發(fā)環(huán)境,安裝 Flash 庫(kù)。最后需要注冊(cè)一個(gè)圖靈機(jī)器人賬號(hào),調(diào)用其 API 接口。

[[342172]]

歡迎到我的公眾號(hào) 碼小白TM 里調(diào)戲機(jī)器人,去看看這個(gè)機(jī)器人智不智能!

Web 服務(wù)器搭建

我們想要接收公眾號(hào)后臺(tái)發(fā)送的消息,就需要搭建一個(gè) Web 服務(wù)器了。我們?cè)谠品?wù)器上安裝好 Python 和 Flask 后,就可以進(jìn)行 Web 服務(wù)器的搭建了。

我們首先搭建一個(gè)非常簡(jiǎn)單的 Web 服務(wù)器,就是在網(wǎng)頁(yè)顯示出 HelloWorld!,來(lái)跑通我們的代碼。我們來(lái)看一下主程序代碼。

main.py

  1. from flask import Flask 
  2. app = Flask(__name__)@app.route("/"
  3. def index(): 
  4.     return "Hello World!" 
  5. if __name__ == "__main__"
  6.     app.run(host='0.0.0.0'

代碼非常簡(jiǎn)單,我們直接運(yùn)行代碼,啟動(dòng) Web 服務(wù)器:

  1. python main.py 

運(yùn)行成功后,我們可以在云服務(wù)器機(jī)器瀏覽器上訪問(wèn) 127.0.0.1,如果我們能看到 Hello World! 就說(shuō)明我們服務(wù)器啟動(dòng)成功了。我們也可以在外網(wǎng)機(jī)器瀏覽器上訪問(wèn)你云服務(wù)器的外網(wǎng) IP,來(lái)檢測(cè) Web 服務(wù)器是否成功啟動(dòng)。

公眾號(hào)后臺(tái)配置和驗(yàn)證

然后我們?nèi)ス娞?hào)后臺(tái)開(kāi)發(fā)->基本配置頁(yè)找到服務(wù)器配置,可以看到我們需要一個(gè)服務(wù)器的 URL 地址、Token 令牌、消息加解密密鑰。

 

給你的公眾號(hào)添加一個(gè)智能機(jī)器人
公眾號(hào)后臺(tái)配置

服務(wù)器的 URL 地址就是:http://服務(wù)器外網(wǎng)IP/wechat,/ 前面是你的云服務(wù)外網(wǎng) IP 地址,后邊是我們?cè)诖a里定義的路由入口(可以自己定義),后邊我們會(huì)在代碼中看到。Token 令牌是我們自己定義的,后邊代碼中也會(huì)用到。消息加解密密鑰可以通過(guò)自動(dòng)生成,消息加解密方式我們選擇明文模式即可。

你第一次配置的時(shí)候下邊會(huì)有保存按鈕,這個(gè)時(shí)候我們先不要點(diǎn)擊,因?yàn)槲覀冃枰?Web 服務(wù)器端對(duì)消息字段進(jìn)行解析處理,然后回傳結(jié)果進(jìn)行驗(yàn)證。

我們到微信公眾號(hào)開(kāi)發(fā)文檔里看一下消息驗(yàn)證流程。

 

給你的公眾號(hào)添加一個(gè)智能機(jī)器人
驗(yàn)證流程

根據(jù)上圖流程我們進(jìn)行我們的代碼編寫。

main.py

  1. from flask import Flask 
  2. from flask import request 
  3. import hashlibapp = Flask(__name__)@app.route("/"
  4. def index():    return "Hello World!" 
  5. # 公眾號(hào)后臺(tái)消息路由入口@app.route("/wechat", methods=["GET""POST"]) 
  6. def wechat(): # 驗(yàn)證使用的是GET方法    if request.method == "GET"
  7.         signature = request.args.get('signature'
  8.         timestamp = request.args.get('timestamp'
  9.         nonce = request.args.get('nonce'
  10.         echostr = request.args.get('echostr'
  11.         token = "公眾號(hào)后臺(tái)填寫的token" 
  12.   # 進(jìn)行排序        dataList = [token, timestamp, nonce]        dataList.sort()        result = "".join(dataList) 
  13.   #哈希加密算法得到hashcode        sha1 = hashlib.sha1()        sha1.update(result.encode("utf-8")) 
  14.         hashcode = sha1.hexdigest()        if hashcode == signature: 
  15.             return echostr 
  16.         else
  17.             return "" 
  18. if __name__ == "__main__"
  19.     app.run(host='0.0.0.0', port=80) #公眾號(hào)后臺(tái)只開(kāi)放了80端口 

這里需要注意 http 的端口號(hào)固定使用80,不可填寫其他。這里坑了我很久,因?yàn)槲业姆?wù)器上還有我自己的博客,80端口被博客占用了,為了把80端口讓出來(lái),我重新搭了我的博客,修改了端口,導(dǎo)致現(xiàn)在訪問(wèn)我的博客后邊必須加上修改后的端口。這里如果有同學(xué)有更高的方法,還請(qǐng)勞煩告知一下!

好了,現(xiàn)在我們的驗(yàn)證流程完成,運(yùn)行我們的 Web 服務(wù)器。然后到公眾號(hào)后臺(tái)配置處點(diǎn)擊保存,如果提示驗(yàn)證通過(guò),那么恭喜你完成了驗(yàn)證。

如果提示驗(yàn)證失敗,我們自己根據(jù)報(bào)錯(cuò)提示來(lái)查看是哪里的問(wèn)題。

實(shí)現(xiàn)“你問(wèn)我答”和“圖”上往來(lái)

我們驗(yàn)證成功了,下面就要開(kāi)始處理粉絲在公眾號(hào)發(fā)過(guò)來(lái)的消息了。我們先來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的“你問(wèn)我答”, 粉絲給公眾號(hào)一條文本消息,公眾號(hào)立馬回復(fù)一條相同文本消息給粉絲;還有圖上往來(lái),接受粉絲發(fā)送的圖片消息,并立馬回復(fù)相同的圖片給粉絲。

我們通過(guò)公眾號(hào)文檔知道,普通用戶向公眾號(hào)發(fā)消息是用的 POST 方法,消息分為文本消息、圖片消息、語(yǔ)音消息、視頻消息等很多種。這里我們只對(duì)文本消息和圖片消息進(jìn)行處理和回復(fù)(后續(xù)你也可以針對(duì)其他消息進(jìn)行處理和回復(fù))。

消息的格式為XML數(shù)據(jù)包,下面看一下文本消息的實(shí)例:

  1. <xml> 
  2.   <ToUserName><![CDATA[toUser]]></ToUserName> 
  3.   <FromUserName><![CDATA[fromUser]]></FromUserName> 
  4.   <CreateTime>1348831860</CreateTime> 
  5.   <MsgType><![CDATA[text]]></MsgType> 
  6.   <Content><![CDATA[this is a test]]></Content> 
  7.   <MsgId>1234567890123456</MsgId> 
  8. </xml> 
  • ToUserName 開(kāi)發(fā)者微信號(hào)
  • FromUserName 發(fā)送方帳號(hào)(一個(gè)OpenID)
  • CreateTime 消息創(chuàng)建時(shí)間 (整型)
  • MsgType 消息類型,文本為text,圖片為image
  • Content 文本消息內(nèi)容
  • MsgId 消息id,64位整型

被動(dòng)回復(fù)文本消息,就是我們回復(fù)給用戶的文本消息類型為:

  1. <xml> 
  2.  <ToUserName><![CDATA[粉絲號(hào)]]></ToUserName> 
  3.  <FromUserName><![CDATA[公眾號(hào)]]></FromUserName> 
  4.  <CreateTime>1460541339</CreateTime> 
  5.  <MsgType><![CDATA[text]]></MsgType> 
  6.  <Content><![CDATA[test]]></Content> 
  7. </xml> 

Content 回復(fù)的消息內(nèi)容

回復(fù)的圖片消息類型:

  1. <xml> 
  2.   <ToUserName><![CDATA[toUser]]></ToUserName> 
  3.   <FromUserName><![CDATA[fromUser]]></FromUserName> 
  4.   <CreateTime>12345678</CreateTime> 
  5.   <MsgType><![CDATA[image]]></MsgType> 
  6.   <Image> 
  7.     <MediaId><![CDATA[media_id]]></MediaId> 
  8.   </Image> 
  9. </xml> 

MediaId 通過(guò)素材管理中的接口上傳多媒體文件,得到的id。

接收和回復(fù)消息的格式我們知道了,下面我們來(lái)看一下整個(gè)流程。

 

給你的公眾號(hào)添加一個(gè)智能機(jī)器人

 

給你的公眾號(hào)添加一個(gè)智能機(jī)器人

我們根據(jù)流程來(lái)修改一下我們的代碼。我們?cè)黾觾蓚€(gè)文件來(lái)處理接收的消息,和回復(fù)的消息 receive.py,reply.py。

receive.py

  1. import xml.etree.ElementTree as ET 
  2. def parse_xml(web_data):    if len(web_data) == 0: 
  3.         return None 
  4.     xmlData = ET.fromstring(web_data)    msg_type = xmlData.find('MsgType').text 
  5.     if msg_type == 'text'
  6.         return TextMsg(xmlData) 
  7.     elif msg_type == 'image'
  8.         return ImageMsg(xmlData) 
  9. class Msg(object): 
  10.     def __init__(self, xmlData): 
  11.         self.ToUserName = xmlData.find('ToUserName').text 
  12.         self.FromUserName = xmlData.find('FromUserName').text 
  13.         self.CreateTime = xmlData.find('CreateTime').text 
  14.         self.MsgType = xmlData.find('MsgType').text 
  15.         self.MsgId = xmlData.find('MsgId').text 
  16. class TextMsg(Msg):    def __init__(self, xmlData): 
  17.         Msg.__init__(self, xmlData)        self.Content = xmlData.find('Content').text 
  18. class ImageMsg(Msg):    def __init__(self, xmlData): 
  19.         Msg.__init__(self, xmlData)        self.PicUrl = xmlData.find('PicUrl').text 
  20.         self.MediaId = xmlData.find('MediaId').text 

reply.py

  1. import time 
  2. 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> 
  3.                 <ToUserName><![CDATA[{ToUserName}]]></ToUserName> 
  4.                 <FromUserName><![CDATA[{FromUserName}]]></FromUserName> 
  5.                 <CreateTime>{CreateTime}</CreateTime> 
  6.                 <MsgType><![CDATA[text]]></MsgType> 
  7.                 <Content><![CDATA[{Content}]]></Content> 
  8.             </xml> 
  9.             """        return XmlForm.format(**self.__dict)class ImageMsg(Msg):    def __init__(self, toUserName, fromUserName, mediaId):        self.__dict = dict()        self.__dict['ToUserName'] = toUserName        self.__dict['FromUserName'] = fromUserName        self.__dict['CreateTime'] = int(time.time())        self.__dict['MediaId'] = mediaId    def send(self):        XmlForm = """            <xml> 
  10.                 <ToUserName><![CDATA[{ToUserName}]]></ToUserName> 
  11.                 <FromUserName><![CDATA[{FromUserName}]]></FromUserName> 
  12.                 <CreateTime>{CreateTime}</CreateTime> 
  13.                 <MsgType><![CDATA[image]]></MsgType> 
  14.                 <Image> 
  15.                 <MediaId><![CDATA[{MediaId}]]></MediaId> 
  16.                 </Image> 
  17.             </xml> 
  18.             """        return XmlForm.format(**self.__dict) 

main.py

  1. from flask import Flask 
  2. from flask import request 
  3. import hashlibimport receiveimport replyapp = Flask(__name__)@app.route("/"
  4. def index():    return "Hello World!" 
  5. # 公眾號(hào)后臺(tái)消息路由入口@app.route("/wechat", methods=["GET""POST"]) 
  6. def wechat(): # 驗(yàn)證使用的GET方法    if request.method == "GET"
  7.         signature = request.args.get('signature'
  8.         timestamp = request.args.get('timestamp'
  9.         nonce = request.args.get('nonce'
  10.         echostr = request.args.get('echostr'
  11.         token = "公眾號(hào)后臺(tái)填寫的token" 
  12.   # 進(jìn)行排序        dataList = [token, timestamp, nonce]        dataList.sort()        result = "".join(dataList) 
  13.   #哈希加密算法得到hashcode        sha1 = hashlib.sha1()        sha1.update(result.encode("utf-8")) 
  14.         hashcode = sha1.hexdigest()        if hashcode == signature: 
  15.             return echostr 
  16.         else
  17.             return "" 
  18.  else
  19.         recMsg = receive.parse_xml(request.data) 
  20.         if isinstance(recMsg, receive.Msg): 
  21.             toUser = recMsg.FromUserName            fromUser = recMsg.ToUserName            if recMsg.MsgType == 'text'
  22.                 content = recMsg.Content                replyMsg = reply.TextMsg(toUser, fromUser, content)                return replyMsg.send() 
  23.             elif recMsg.MsgType == 'image'
  24.                 mediaId = recMsg.MediaId                replyMsg = reply.ImageMsg(toUser, fromUser, mediaId)                return replyMsg.send() 
  25.             else
  26.                 return reply.Msg().send() 
  27.         else
  28.             return reply.Msg().send() 
  29. if __name__ == "__main__"
  30.     app.run(host='0.0.0.0', port=80) #公眾號(hào)后臺(tái)只開(kāi)放了80端口 

然后我們啟動(dòng) Web 服務(wù)器,去公眾號(hào)后臺(tái)發(fā)消息發(fā)圖片測(cè)試,如果成功的話立馬就會(huì)回復(fù)你相同的文字和圖片。

微信提供了一個(gè)在線測(cè)試的平臺(tái),可以很方便的進(jìn)行開(kāi)發(fā)中的各種測(cè)試。

接入圖靈機(jī)器人

首先我們?nèi)D靈機(jī)器人官網(wǎng)注冊(cè)一個(gè)賬號(hào)。然后在后臺(tái)創(chuàng)建一個(gè)機(jī)器人。

然后我們根據(jù)圖靈機(jī)器人接入文檔的使用說(shuō)明:

  • 編碼方式:調(diào)用調(diào)用圖靈API的各個(gè)環(huán)節(jié)的編碼方式均為 UTF-8
  • 接口地址:http://openapi.tuling123.com/openapi/api/v2
  • 請(qǐng)求方式: HTTP POST
  • 請(qǐng)求參數(shù):參數(shù)格式為 json

請(qǐng)求參數(shù)示例:

  1.  "reqType":0, 
  2.     "perception": { 
  3.         "inputText": { 
  4.             "text""附近的酒店" 
  5.         },        "inputImage": { 
  6.             "url""imageUrl" 
  7.         },        "selfInfo": { 
  8.             "location": { 
  9.                 "city""北京"
  10.                 "province""北京"
  11.                 "street""信息路" 
  12.             }        }    },    "userInfo": { 
  13.         "apiKey"""
  14.         "userId""" 
  15.     }} 

輸出參數(shù)示例:

  1.     "intent": { 
  2.         "code": 10005, 
  3.         "intentName"""
  4.         "actionName"""
  5.         "parameters": { 
  6.             "nearby_place""酒店" 
  7.         }    },    "results": [ 
  8.         {          "groupType": 1, 
  9.             "resultType""url"
  10.             "values": { 
  11.                 "url""http://m.elong.com/hotel/0101/nlist/#indate=2016-12-10&outdate=2016-12-11&keywords=%E4%BF%A1%E6%81%AF%E8%B7%AF" 
  12.             }        },        {          "groupType": 1, 
  13.             "resultType""text"
  14.             "values": { 
  15.                 "text""親,已幫你找到相關(guān)酒店信息" 
  16.             }        }    ]} 

其中 apiKey 是可以在我們創(chuàng)建的機(jī)器人的參數(shù)中找到,userId 是用戶唯一標(biāo)識(shí)。

好了,下面來(lái)編寫我們的代碼。我們?cè)黾右粋€(gè) tuling.py 文件來(lái)接入圖靈接口。

tuling.py

  1. import json 
  2. import urllibapiKey = '從你創(chuàng)建的機(jī)器人獲得' 
  3. tulingUrl = "http://openapi.tuling123.com/openapi/api/v2" 
  4. # content 是接收的消息,userId 是用戶唯一標(biāo)識(shí)def tulingReply(content, userId):    requestData = {        "reqType": 0, 
  5.         "perception": { 
  6.             "inputText": { 
  7.                 "text": content 
  8.             },            "selfInfo": { 
  9.                 "location": { 
  10.                     "city""北京" 
  11.                 }            }        },        "userInfo": { 
  12.             "apiKey": apiKey, 
  13.             "userId": userId 
  14.         }    }     requestData = json.dumps(requestData).encode('utf8'
  15.     http_post = urllib.request.Request(        tulingUrl,        data=requestData, 
  16.         headers={'content-type''application/json'}) 
  17.      response = urllib.request.urlopen(http_post)    response_str = response.read().decode('utf8'
  18.     response_dic = json.loads(response_str)    results_code = response_dic['intent']['code'
  19.   # 免費(fèi)版每天有固定次數(shù),如果超過(guò)之后會(huì)返回4003錯(cuò)誤碼 
  20.     if results_code == 4003: 
  21.         results_text = "4003:%s" % response_dic['results'][0]['values']['text'
  22.     else
  23.         results_text = response_dic['results'][0]['values']['text'
  24.     return results_text 

修改 main.py

  1. from flask import Flask 
  2. from flask import request 
  3. import hashlibimport reimport tulingimport receiveimport replyapp = Flask(__name__)@app.route("/"
  4. def index():    return "Hello World!" 
  5. # 公眾號(hào)后臺(tái)消息路由入口@app.route("/wechat", methods=["GET""POST"]) 
  6. def wechat(): # 驗(yàn)證使用的GET方法    if request.method == "GET"
  7.         signature = request.args.get('signature'
  8.         timestamp = request.args.get('timestamp'
  9.         nonce = request.args.get('nonce'
  10.         echostr = request.args.get('echostr'
  11.         token = "公眾號(hào)后臺(tái)填寫的token" 
  12.   # 進(jìn)行排序        dataList = [token, timestamp, nonce]        dataList.sort()        result = "".join(dataList) 
  13.   #哈希加密算法得到hashcode        sha1 = hashlib.sha1()        sha1.update(result.encode("utf-8")) 
  14.         hashcode = sha1.hexdigest()        if hashcode == signature: 
  15.             return echostr 
  16.         else
  17.             return "" 
  18.  else
  19.         recMsg = receive.parse_xml(request.data) 
  20.         if isinstance(recMsg, receive.Msg): 
  21.             toUser = recMsg.FromUserName            fromUser = recMsg.ToUserName            if recMsg.MsgType == 'text'
  22.                 content = recMsg.Content    # userId 長(zhǎng)度小于等于32位 
  23.                 if len(toUser) > 31: 
  24.                     userid = str(toUser[0:30]) 
  25.                 else
  26.                     userid = str(toUser)                userid = re.sub(r'[^A-Za-z0-9]+''', userid) 
  27.                 tulingReplay = tuling.tulingReply(content, userid)                replyMsg = reply.TextMsg(toUser, fromUser, tulingReplay)                return replyMsg.send() 
  28.             elif recMsg.MsgType == 'image'
  29.                 mediaId = recMsg.MediaId                replyMsg = reply.ImageMsg(toUser, fromUser, mediaId)                return replyMsg.send() 
  30.             else
  31.                 return reply.Msg().send() 
  32.         else
  33.             return reply.Msg().send() 
  34. if __name__ == "__main__"
  35.     app.run(host='0.0.0.0', port=80) #公眾號(hào)后臺(tái)只開(kāi)放了80端口 

耶,我們的機(jī)器人完成了,馬上迫不及待的去試試。

 

給你的公眾號(hào)添加一個(gè)智能機(jī)器人

可以愉快的和你的機(jī)器人對(duì)話了。

后面發(fā)現(xiàn)了第一關(guān)注公眾號(hào)后的歡迎語(yǔ)沒(méi)有了,因?yàn)槟阕约旱姆?wù)器接管了公眾號(hào)的消息,所以原來(lái)后臺(tái)設(shè)置的歡迎語(yǔ)就失效了。在公眾號(hào)文檔中看到關(guān)注/取消關(guān)注屬于事件。其消息的格式如下。

  1. <xml> 
  2.   <ToUserName><![CDATA[toUser]]></ToUserName> 
  3.   <FromUserName><![CDATA[FromUser]]></FromUserName> 
  4.   <CreateTime>123456789</CreateTime> 
  5.   <MsgType><![CDATA[event]]></MsgType> 
  6.   <Event><![CDATA[subscribe]]></Event> 
  7. </xml> 

我們只需要判斷一下 MsgType 是 event,然后 Event 是 subscribe,然后回復(fù)我們的歡迎語(yǔ)就可以了,很簡(jiǎn)單,這個(gè)我們就不詳細(xì)展開(kāi)了。

責(zé)任編輯:未麗燕 來(lái)源: 今日頭條
相關(guān)推薦

2021-01-05 14:39:30

人工智能機(jī)器人購(gòu)物

2015-12-10 21:49:32

IM機(jī)器人

2021-01-28 19:34:49

人工智能AI機(jī)器人

2018-11-13 09:19:48

機(jī)器人人工智能系統(tǒng)

2023-07-27 14:38:58

人工智能機(jī)器人開(kāi)發(fā)

2022-07-28 11:26:41

人工智能機(jī)器人

2024-05-07 07:00:00

智能機(jī)器人工業(yè)機(jī)器人人工智能

2018-03-28 09:28:16

CITE機(jī)器人智能系統(tǒng)館

2021-02-15 15:17:15

人工智能機(jī)器人技術(shù)

2019-04-19 14:40:15

代碼Python機(jī)器人

2022-07-28 22:00:47

核酸采樣機(jī)器人機(jī)器人

2020-02-18 10:26:58

機(jī)器人人工智能系統(tǒng)

2015-05-22 11:40:00

希捷

2021-04-01 10:51:44

機(jī)器人人工智能編程

2021-11-30 10:56:43

ChatterBot機(jī)器人人工智能

2018-12-29 14:50:06

人工智能機(jī)器人編程語(yǔ)言

2012-06-21 14:20:16

CSS3

2021-05-24 15:29:24

人工智能機(jī)器人聊天

2023-05-24 10:30:48

機(jī)器人人工智能

2023-10-05 13:04:27

騰訊機(jī)器人RoboticX
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 中文字幕av网址 | 久久99国产精一区二区三区 | 波多野结衣一区二区 | 国产日韩一区二区 | 男人av的天堂 | 特一级黄色毛片 | 久久伦理中文字幕 | 中文字幕三区 | 日韩中文字幕在线视频观看 | 久久精品欧美一区二区三区不卡 | 国产一区二区三区在线视频 | 欧美一区视频 | 日韩性生活网 | 成人av免费看 | 成人三级在线播放 | 亚洲狠狠爱 | 国产在线一区二 | 成人精品鲁一区一区二区 | 亚洲午夜电影 | 日韩中文字幕一区二区 | 亚洲精品1区 | 国产久视频 | 精品国产一区二区三区av片 | 日韩在线不卡视频 | 国产精品性做久久久久久 | 久久精品在线 | 99热国产精品 | 最新日韩精品 | 欧美伊人久久久久久久久影院 | 国产一区二区三区视频免费观看 | 亚洲一级在线 | 精品亚洲一区二区三区 | 精品av久久久久电影 | 国产一级淫片免费视频 | 久久久久久久一区二区三区 | 97在线观视频免费观看 | 永久免费av| 最新伦理片 | 日本a视频| 草草视频在线播放 | 国产精品亚洲成在人线 |