精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何用 Python 和 Flask 建立部署一個(gè) Facebook Messenger 機(jī)器人

開發(fā) 開發(fā)工具
這是我建立一個(gè)簡(jiǎn)單的 Facebook Messenger 機(jī)器人的記錄。功能很簡(jiǎn)單,它是一個(gè)回顯機(jī)器人,只是打印回用戶寫了什么。這個(gè)項(xiàng)目的目的不是建立最好的 Messenger 機(jī)器人,而是讓你了解如何建立一個(gè)小型機(jī)器人和每個(gè)事物是如何整合起來(lái)的。

 [[169470]]

這是我建立一個(gè)簡(jiǎn)單的 Facebook Messenger 機(jī)器人的記錄。功能很簡(jiǎn)單,它是一個(gè)回顯機(jī)器人,只是打印回用戶寫了什么。

回顯服務(wù)器類似于服務(wù)器的“Hello World”例子。

這個(gè)項(xiàng)目的目的不是建立***的 Messenger 機(jī)器人,而是讓你了解如何建立一個(gè)小型機(jī)器人和每個(gè)事物是如何整合起來(lái)的。

技術(shù)棧

使用到的技術(shù)棧:

  • Heroku 做后端主機(jī)。免費(fèi)級(jí)足夠這個(gè)等級(jí)的教程。回顯機(jī)器人不需要任何種類的數(shù)據(jù)持久,所以不需要數(shù)據(jù)庫(kù)。
  • Python 是我們選擇的語(yǔ)言。版本選擇 2.7,雖然它移植到 Pyhton 3 很容易,只需要很少的改動(dòng)。
  • Flask 作為網(wǎng)站開發(fā)框架。它是非常輕量的框架,用在小型工程或微服務(wù)是非常***的。
  • *** Git 版本控制系統(tǒng)用來(lái)維護(hù)代碼和部署到 Heroku。
  • 值得一提:Virtualenv。這個(gè) python 工具是用來(lái)創(chuàng)建清潔的 python 庫(kù)“環(huán)境”的,這樣你可以只安裝必要的需求和最小化應(yīng)用的大小。

機(jī)器人架構(gòu)

Messenger 機(jī)器人是由一個(gè)響應(yīng)兩種請(qǐng)求的服務(wù)器組成的:

  • GET 請(qǐng)求被用來(lái)認(rèn)證。他們與你注冊(cè)的 FaceBook 認(rèn)證碼一同被 Messenger 發(fā)出。
  • POST 請(qǐng)求被用來(lái)實(shí)際的通信。典型的工作流是,機(jī)器人將通過(guò)用戶發(fā)送帶有消息數(shù)據(jù)的 POST 請(qǐng)求而建立通信,然后我們將處理這些數(shù)據(jù),并發(fā)回我們的 POST 請(qǐng)求。如果這個(gè)請(qǐng)求完全成功(返回一個(gè) 200 OK 狀態(tài)碼),我們也將響應(yīng)一個(gè) 200 OK 狀態(tài)碼給初始的 Messenger請(qǐng)求。

這個(gè)教程應(yīng)用將托管到 Heroku,它提供了一個(gè)優(yōu)雅而簡(jiǎn)單的部署應(yīng)用的接口。如前所述,免費(fèi)級(jí)可以滿足這個(gè)教程。

在應(yīng)用已經(jīng)部署并且運(yùn)行后,我們將創(chuàng)建一個(gè) Facebook 應(yīng)用然后連接它到我們的應(yīng)用,以便 Messenger 知道發(fā)送請(qǐng)求到哪,這就是我們的機(jī)器人。

機(jī)器人服務(wù)器

基本的服務(wù)器代碼可以在 Github 用戶 hult(Magnus Hult) 的 Chatbot 項(xiàng)目上獲取,做了一些只回顯消息的代碼修改和修正了一些我遇到的錯(cuò)誤。最終版本的服務(wù)器代碼如下:

  1. from flask import Flask, request 
  2. import json 
  3. import requests 
  4. app = Flask(__name__) 
  5. ### 這需要填寫被授予的頁(yè)面通行令牌(PAT) 
  6. ### 它由將要?jiǎng)?chuàng)建的 Facebook 應(yīng)用提供。 
  7. PAT = '' 
  8. @app.route('/', methods=['GET']) 
  9. def handle_verification(): 
  10.   print "Handling Verification." 
  11.   if request.args.get('hub.verify_token''') == 'my_voice_is_my_password_verify_me'
  12.     print "Verification successful!" 
  13.     return request.args.get('hub.challenge'''
  14.   else
  15.     print "Verification failed!" 
  16.     return 'Error, wrong validation token' 
  17. @app.route('/', methods=['POST']) 
  18. def handle_messages(): 
  19.   print "Handling Messages" 
  20.   payload = request.get_data() 
  21.   print payload 
  22.   for sender, message in messaging_events(payload): 
  23.     print "Incoming from %s: %s" % (sender, message) 
  24.     send_message(PAT, sender, message) 
  25.   return "ok" 
  26. def messaging_events(payload): 
  27.   """Generate tuples of (sender_id, message_text) from the 
  28.   provided payload. 
  29.   ""
  30.   data = json.loads(payload) 
  31.   messaging_events = data["entry"][0]["messaging"
  32.   for event in messaging_events: 
  33.     if "message" in event and "text" in event["message"]: 
  34.       yield event["sender"]["id"], event["message"]["text"].encode('unicode_escape'
  35.     else
  36.       yield event["sender"]["id"], "I can't echo this" 
  37. def send_message(token, recipient, text): 
  38.   """Send the message text to recipient with id recipient. 
  39.   ""
  40.   r = requests.post("https://graph.facebook.com/v2.6/me/messages"
  41.     params={"access_token": token}, 
  42.     data=json.dumps({ 
  43.       "recipient": {"id": recipient}, 
  44.       "message": {"text": text.decode('unicode_escape')} 
  45.     }), 
  46.     headers={'Content-type''application/json'}) 
  47.   if r.status_code != requests.codes.ok: 
  48.     print r.text 
  49. if __name__ == '__main__'
  50.   app.run() 

讓我們分解代碼。***部分是引入所需的依賴: 

  1. from flask import Flask, request 
  2. import json 
  3. import requests 

接下來(lái)我們定義兩個(gè)函數(shù)(使用 Flask 特定的 app.route 裝飾器),用來(lái)處理到我們的機(jī)器人的 GET 和 POST 請(qǐng)求。

  1. @app.route('/', methods=['GET']) 
  2. def handle_verification(): 
  3.   print "Handling Verification." 
  4.   if request.args.get('hub.verify_token''') == 'my_voice_is_my_password_verify_me'
  5.     print "Verification successful!" 
  6.     return request.args.get('hub.challenge'''
  7.   else
  8.     print "Verification failed!" 
  9.     return 'Error, wrong validation token' 

當(dāng)我們創(chuàng)建 Facebook 應(yīng)用時(shí),verify_token 對(duì)象將由我們聲明的 Messenger 發(fā)送。我們必須自己來(lái)校驗(yàn)它。***我們返回“hub.challenge”給 Messenger。

處理 POST 請(qǐng)求的函數(shù)更有意思一些:

  1. @app.route('/', methods=['POST']) 
  2. def handle_messages(): 
  3.   print "Handling Messages" 
  4.   payload = request.get_data() 
  5.   print payload 
  6.   for sender, message in messaging_events(payload): 
  7.     print "Incoming from %s: %s" % (sender, message) 
  8.     send_message(PAT, sender, message) 
  9.   return "ok" 

當(dāng)被調(diào)用時(shí),我們抓取消息載荷,使用函數(shù) messaging_events 來(lái)拆解它,并且提取發(fā)件人身份和實(shí)際發(fā)送的消息,生成一個(gè)可以循環(huán)處理的 python 迭代器。請(qǐng)注意 Messenger 發(fā)送的每個(gè)請(qǐng)求有可能多于一個(gè)消息。

  1. def messaging_events(payload): 
  2.   """Generate tuples of (sender_id, message_text) from the 
  3.   provided payload. 
  4.   ""
  5.   data = json.loads(payload) 
  6.   messaging_events = data["entry"][0]["messaging"
  7.   for event in messaging_events: 
  8.     if "message" in event and "text" in event["message"]: 
  9.       yield event["sender"]["id"], event["message"]["text"].encode('unicode_escape'
  10.     else
  11.       yield event["sender"]["id"], "I can't echo this" 

對(duì)每個(gè)消息迭代時(shí),我們會(huì)調(diào)用 send_message 函數(shù),然后我們使用 Facebook Graph messages API 對(duì) Messenger 發(fā)回 POST 請(qǐng)求。在這期間我們一直沒有回應(yīng)我們阻塞的原始 Messenger請(qǐng)求。這會(huì)導(dǎo)致超時(shí)和 5XX 錯(cuò)誤。

上述情況是我在解決遇到錯(cuò)誤時(shí)發(fā)現(xiàn)的,當(dāng)用戶發(fā)送表情時(shí)實(shí)際上是發(fā)送的 unicode 標(biāo)識(shí)符,但是被 Python 錯(cuò)誤的編碼了,最終我們發(fā)回了一些亂碼。

這個(gè)發(fā)回 Messenger 的 POST 請(qǐng)求將永遠(yuǎn)不會(huì)完成,這會(huì)導(dǎo)致給初始請(qǐng)求返回 5xx 狀態(tài)碼,顯示服務(wù)不可用。

通過(guò)使用 encode('unicode_escape') 封裝消息,然后在我們發(fā)送回消息前用 decode('unicode_escape') 解碼消息就可以解決。

  1. def send_message(token, recipient, text): 
  2.   """Send the message text to recipient with id recipient. 
  3.   ""
  4.   r = requests.post("https://graph.facebook.com/v2.6/me/messages"
  5.     params={"access_token": token}, 
  6.     data=json.dumps({ 
  7.       "recipient": {"id": recipient}, 
  8.       "message": {"text": text.decode('unicode_escape')} 
  9.     }), 
  10.     headers={'Content-type''application/json'}) 
  11.   if r.status_code != requests.codes.ok: 
  12.     print r.text 

部署到 Heroku

一旦代碼已經(jīng)建立成我想要的樣子時(shí)就可以進(jìn)行下一步。部署應(yīng)用。

那么,該怎么做?

我之前在 Heroku 上部署過(guò)應(yīng)用(主要是 Rails),然而我總是遵循某種教程做的,所用的配置是創(chuàng)建好了的。而在本文的情況下,我就需要從頭開始。

幸運(yùn)的是有官方 Heroku 文檔來(lái)幫忙。這篇文檔很好地說(shuō)明了運(yùn)行應(yīng)用程序所需的***限度。

長(zhǎng)話短說(shuō),我們需要的除了我們的代碼還有兩個(gè)文件。***個(gè)文件是“requirements.txt”,它列出了運(yùn)行應(yīng)用所依賴的庫(kù)。

需要的第二個(gè)文件是“Procfile”。這個(gè)文件通知 Heroku 如何運(yùn)行我們的服務(wù)。此外這個(gè)文件只需要一點(diǎn)點(diǎn)內(nèi)容: 

  1. web: gunicorn echoserver:app  

Heroku 對(duì)它的解讀是,我們的應(yīng)用通過(guò)運(yùn)行 echoserver.py 啟動(dòng),并且應(yīng)用將使用 gunicorn 作為 Web 服務(wù)器。我們使用一個(gè)額外的網(wǎng)站服務(wù)器是因?yàn)榕c性能相關(guān),在上面的 Heroku 文檔里對(duì)此解釋了:

Web 應(yīng)用程序并發(fā)處理傳入的 HTTP 請(qǐng)求比一次只處理一個(gè)請(qǐng)求的 Web 應(yīng)用程序會(huì)更有效利地用測(cè)試機(jī)的資源。由于這個(gè)原因,我們建議使用支持并發(fā)請(qǐng)求的 Web 服務(wù)器來(lái)部署和運(yùn)行產(chǎn)品級(jí)服務(wù)。

Django 和 Flask web 框架提供了一個(gè)方便的內(nèi)建 Web 服務(wù)器,但是這些阻塞式服務(wù)器一個(gè)時(shí)刻只能處理一個(gè)請(qǐng)求。如果你部署這種服務(wù)到 Heroku 上,你的測(cè)試機(jī)就會(huì)資源利用率低下,應(yīng)用會(huì)感覺反應(yīng)遲鈍。

Gunicorn 是一個(gè)純 Python 的 HTTP 服務(wù)器,用于 WSGI 應(yīng)用。允許你在單獨(dú)一個(gè)測(cè)試機(jī)內(nèi)通過(guò)運(yùn)行多 Python 進(jìn)程的方式來(lái)并發(fā)的運(yùn)行各種 Python 應(yīng)用。它在性能、靈活性和配置簡(jiǎn)易性方面取得了***的平衡?;氐轿覀冎疤岬竭^(guò)的“requirements.txt”文件,讓我們看看它如何結(jié)合 Virtualenv 工具。

很多情況下,你的開發(fā)機(jī)器也許已經(jīng)安裝了很多 python 庫(kù)。當(dāng)部署應(yīng)用時(shí)你不想全部加載那些庫(kù),但是辨認(rèn)出你實(shí)際使用哪些庫(kù)很困難。

Virtualenv 可以創(chuàng)建一個(gè)新的空白虛擬環(huán)境,以便你可以只安裝你應(yīng)用所需要的庫(kù)。

你可以運(yùn)行如下命令來(lái)檢查當(dāng)前安裝了哪些庫(kù):

  1. kostis@KostisMBP ~ $ pip freeze 
  2. cycler==0.10.0 
  3. Flask==0.10.1 
  4. gunicorn==19.6.0 
  5. itsdangerous==0.24 
  6. Jinja2==2.8 
  7. MarkupSafe==0.23 
  8. matplotlib==1.5.1 
  9. numpy==1.10.4 
  10. pyparsing==2.1.0 
  11. python-dateutil==2.5.0 
  12. pytz==2015.7 
  13. requests==2.10.0 
  14. scipy==0.17.0 
  15. six==1.10.0 
  16. virtualenv==15.0.1 
  17. Werkzeug==0.11.10 

注意:pip 工具應(yīng)該已經(jīng)與 Python 一起安裝在你的機(jī)器上。如果沒有,查看官方網(wǎng)站如何安裝它。

現(xiàn)在讓我們使用 Virtualenv 來(lái)創(chuàng)建一個(gè)新的空白環(huán)境。首先我們給我們的項(xiàng)目創(chuàng)建一個(gè)新文件夾,然后進(jìn)到目錄下: 

  1. kostis@KostisMBP projects $ mkdir echoserver 
  2. kostis@KostisMBP projects $ cd echoserver/ 
  3. kostis@KostisMBP echoserver $ 

現(xiàn)在來(lái)創(chuàng)建一個(gè)叫做 echobot 的新環(huán)境。運(yùn)行下面的 source 命令激活它,然后使用 pip freeze 檢查,我們能看到現(xiàn)在是空的。 

  1. kostis@KostisMBP echoserver $ virtualenv echobot 
  2. kostis@KostisMBP echoserver $ source echobot/bin/activate 
  3. (echobot) kostis@KostisMBP echoserver $ pip freeze 
  4. (echobot) kostis@KostisMBP echoserver $ 

我們可以安裝需要的庫(kù)。我們需要是 flask、gunicorn 和 requests,它們被安裝后我們就創(chuàng)建 requirements.txt 文件:

  1. (echobot) kostis@KostisMBP echoserver $ pip install flask 
  2. (echobot) kostis@KostisMBP echoserver $ pip install gunicorn 
  3. (echobot) kostis@KostisMBP echoserver $ pip install requests 
  4. (echobot) kostis@KostisMBP echoserver $ pip freeze 
  5. click==6.6 
  6. Flask==0.11 
  7. gunicorn==19.6.0 
  8. itsdangerous==0.24 
  9. Jinja2==2.8 
  10. MarkupSafe==0.23 
  11. requests==2.10.0 
  12. Werkzeug==0.11.10 
  13. (echobot) kostis@KostisMBP echoserver $ pip freeze > requirements.txt 

上述完成之后,我們用 python 代碼創(chuàng)建 echoserver.py 文件,然后用之前提到的命令創(chuàng)建 Procfile,我們最終的文件/文件夾如下: 

  1. (echobot) kostis@KostisMBP echoserver $ ls 
  2. Procfile     echobot     echoserver.py   requirements.txt 

我們現(xiàn)在準(zhǔn)備上傳到 Heroku。我們需要做兩件事。***是如果還沒有安裝 Heroku toolbet,就安裝它(詳見 Heroku)。第二是通過(guò) Heroku 網(wǎng)頁(yè)界面創(chuàng)建一個(gè)新的 Heroku 應(yīng)用。

點(diǎn)擊右上的大加號(hào)然后選擇“Create new app”。

 

為你的應(yīng)用選擇一個(gè)名字,然后點(diǎn)擊“Create App”。

 

你將會(huì)重定向到你的應(yīng)用的控制面板,在那里你可以找到如何部署你的應(yīng)用到 Heroku 的細(xì)節(jié)說(shuō)明。

  1. (echobot) kostis@KostisMBP echoserver $ heroku login 
  2. (echobot) kostis@KostisMBP echoserver $ git init 
  3. (echobot) kostis@KostisMBP echoserver $ heroku git:remote -a <myappname> 
  4. (echobot) kostis@KostisMBP echoserver $ git add . 
  5. (echobot) kostis@KostisMBP echoserver $ git commit -m "Initial commit" 
  6. (echobot) kostis@KostisMBP echoserver (master) $ git push heroku master 
  7. ... 
  8. remote:        https://<myappname>.herokuapp.com/ deployed to Heroku 
  9. ... 
  10. (echobot) kostis@KostisMBP echoserver (master) $ heroku config:set WEB_CONCURRENCY=3 

如上,當(dāng)你推送你的修改到 Heroku 之后,你會(huì)得到一個(gè)用于公開訪問(wèn)你新創(chuàng)建的應(yīng)用的 URL。保存該 URL,下一步需要它。

創(chuàng)建這個(gè) Facebook 應(yīng)用

讓我們的機(jī)器人可以工作的***一步是創(chuàng)建這個(gè)我們將連接到其上的 Facebook 應(yīng)用。Facebook 通常要求每個(gè)應(yīng)用都有一個(gè)相關(guān)頁(yè)面,所以我們來(lái)創(chuàng)建一個(gè)。

接下來(lái)我們?nèi)?Facebook 開發(fā)者專頁(yè),點(diǎn)擊右上角的“My Apps”按鈕并選擇“Add a New App”。不要選擇建議的那個(gè),而是點(diǎn)擊“basic setup”。填入需要的信息并點(diǎn)擊“Create App Id”,然后你會(huì)重定向到新的應(yīng)用頁(yè)面。

 

 在 “Products” 菜單之下,點(diǎn)擊“+ Add Product” ,然后在“Messenger”下點(diǎn)擊“Get Started”。跟隨這些步驟設(shè)置 Messenger,當(dāng)完成后你就可以設(shè)置你的 webhooks 了。Webhooks 簡(jiǎn)單的來(lái)說(shuō)是你的服務(wù)所用的 URL 的名稱。點(diǎn)擊 “Setup Webhooks” 按鈕,并添加該 Heroku 應(yīng)用的 URL (你之前保存的那個(gè))。在校驗(yàn)元組中寫入 ‘myvoiceismypasswordverifyme’。你可以寫入任何你要的內(nèi)容,但是不管你在這里寫入的是什么內(nèi)容,要確保同時(shí)修改代碼中 handle_verification 函數(shù)。然后勾選 “messages” 選項(xiàng)。 

點(diǎn)擊“Verify and Save” 就完成了。Facebook 將訪問(wèn)該 Heroku 應(yīng)用并校驗(yàn)它。如果不工作,可以試試運(yùn)行: 

  1. (echobot) kostis@KostisMBP heroku logs -t 

然后看看日志中是否有錯(cuò)誤。如果發(fā)現(xiàn)錯(cuò)誤, Google 搜索一下可能是最快的解決方法。

***一步是取得頁(yè)面訪問(wèn)元組(PAT),它可以將該 Facebook 應(yīng)用于你創(chuàng)建好的頁(yè)面連接起來(lái)。 

 

從下拉列表中選擇你創(chuàng)建好的頁(yè)面。這會(huì)在“Page Access Token”(PAT)下面生成一個(gè)字符串。點(diǎn)擊復(fù)制它,然后編輯 echoserver.py 文件,將其貼入 PAT 變量中。然后在 Git 中添加、提交并推送該修改。 

  1. (echobot) kostis@KostisMBP echoserver (master) $ git add . 
  2. (echobot) kostis@KostisMBP echoserver (master) $ git commit -m "Initial commit" 
  3. (echobot) kostis@KostisMBP echoserver (master) $ git push heroku master 

***,在 Webhooks 菜單下再次選擇你的頁(yè)面并點(diǎn)擊“Subscribe”。 

現(xiàn)在去訪問(wèn)你的頁(yè)面并建立會(huì)話: 

成功了,機(jī)器人回顯了!

注意:除非你要將這個(gè)機(jī)器人用在 Messenger 上測(cè)試,否則你就是機(jī)器人唯一響應(yīng)的那個(gè)人。如果你想讓其他人也試試它,到Facebook 開發(fā)者專頁(yè)中,選擇你的應(yīng)用、角色,然后添加你要添加的測(cè)試者。

總結(jié)

這對(duì)于我來(lái)說(shuō)是一個(gè)非常有用的項(xiàng)目,希望它可以指引你找到開始的正確方向。官方的 Facebook 指南有更多的資料可以幫你學(xué)到更多。

你可以在 Github 上找到該項(xiàng)目的代碼。

如果你有任何評(píng)論、勘誤和建議,請(qǐng)隨時(shí)聯(lián)系我。

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2021-05-07 13:20:39

Python機(jī)器人編程語(yǔ)言

2016-10-09 13:40:44

PythonSlack聊天機(jī)器人

2020-02-26 17:39:18

Python機(jī)器人Word

2017-08-25 15:08:24

深度學(xué)習(xí)機(jī)器人

2021-08-05 10:58:58

Facebook開源Droidlet

2022-09-30 13:55:46

Python機(jī)器人

2015-08-27 16:31:50

facebook虛擬機(jī)器人m

2020-02-18 10:26:58

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

2018-06-08 16:48:09

PythonQQ機(jī)器人

2021-07-22 10:17:55

加密機(jī)器人加密貨幣機(jī)器人

2021-11-30 10:56:43

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

2021-04-01 10:51:44

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

2020-09-15 13:56:08

公眾號(hào)機(jī)器人圖靈機(jī)器人

2021-05-24 15:29:24

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

2012-06-21 14:20:16

CSS3

2022-08-04 07:03:41

AnswersInfobip無(wú)代碼

2021-10-08 15:31:24

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

2021-08-06 09:35:37

Python盯盤機(jī)器人編程語(yǔ)言

2020-12-02 13:00:17

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

2022-07-28 22:00:47

核酸采樣機(jī)器人機(jī)器人
點(diǎn)贊
收藏

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

国产天堂在线| 国产麻豆视频在线观看| 欧美一区久久久| 国产精品欧美一区喷水| 丁香婷婷久久久综合精品国产| 伊人国产在线观看| 精品大片一区二区| 日韩精品一区二区三区swag| 国产午夜视频在线播放| 日本激情一区二区| 天堂一区二区在线| 粗暴蹂躏中文一区二区三区| 午夜男人的天堂| 国产成人77亚洲精品www| 日韩脚交footjobhd| 91丨porny丨户外露出| 日本一区二区三区在线不卡| 亚洲人一二三区| 国产成人精品免费视频大全最热| www.日韩一区| 在线播放精品| 精品国产欧美一区二区三区成人| 日本道中文字幕| 97久久精品一区二区三区的观看方式 | 老司机午夜性大片| 成人av免费电影网站| 亚洲一区影音先锋| 在线免费观看成人| 免费黄色在线视频网站| 成人成人成人在线视频| 91久久国产精品| 欧美视频xxxx| 国产日韩欧美三级| 97色在线视频观看| 久久久久99精品成人片毛片| 91久久电影| 中文字幕在线看视频国产欧美在线看完整 | 亚洲天天在线日亚洲洲精| 美女搡bbb又爽又猛又黄www| 国产aa精品| 在线电影一区二区三区| 视色视频在线观看| 国产情侣av自拍| 三级黄视频在线观看| 成人免费视频视频在线观看免费 | 欧洲亚洲视频| 亚洲第一av在线| 午夜福利三级理论电影| 99久久香蕉| 精品国产3级a| 在线视频 日韩| 日韩精品福利一区二区三区| 亚洲精品不卡在线| 在线观看国产免费视频| 首页亚洲中字| 亚洲少妇激情视频| 亚洲精品一区二区三区影院忠贞| 国产精品一国产精品| 亚洲香蕉成人av网站在线观看| 色哟哟精品观看| 不卡视频在线| 色偷偷噜噜噜亚洲男人| 希岛爱理中文字幕| 欧美日韩1区2区3区| 欧美日韩国产成人高清视频| 久久久一二三区| 亚洲人妖在线| 欧美在线播放视频| 最新黄色网址在线观看| 激情综合网激情| 99久久精品久久久久久ai换脸| 亚洲欧美另类日韩| wwwwxxxxx欧美| 欧美日韩综合精品| 97视频在线观看网站| 中文字幕视频一区| 97视频在线免费| 91视频欧美| 日本久久一区二区| 久久久福利影院| 国产精品主播在线观看| 亚洲一级黄色片| 黄色a级片在线观看| 欧美99在线视频观看| 高清一区二区三区日本久| 欧美特黄aaaaaa| 久草这里只有精品视频| 国产欧美精品一区二区三区| 深夜福利在线看| 欧美极品美女视频| av一区二区三区免费观看| 激情国产在线| 7777精品伊人久久久大香线蕉 | 激情五月六月婷婷| 91免费网站视频| 精华区一区二区三区| 中文字幕av一区二区三区高| 美女av免费观看| 国模套图日韩精品一区二区| 欧美精品九九99久久| 操你啦视频在线| 高清不卡一区二区在线| 青娱乐国产91| 视频在线这里都是精品| 国产精品呻吟| 国产精品欧美风情| 亚洲欧美另类综合| 国产精品色噜噜| 国产精品333| 亚洲综合资源| 亚洲美女又黄又爽在线观看| 69av视频在线| 蓝色福利精品导航| 欧美系列一区| 国产夫妻在线播放| 日韩精品一区在线| 国产人与禽zoz0性伦| 久久久久欧美精品| 国产嫩草一区二区三区在线观看| 免费在线观看av网站| 日韩欧美aⅴ综合网站发布| 亚洲成人激情小说| 91久久久精品国产| 国产精品麻豆va在线播放| 日韩在线观看视频一区二区三区| 中文字幕在线一区二区三区| 成年人视频在线免费| 久久国产精品免费精品3p| 久久国产精品视频| 国产精品高潮呻吟久久久| www成人在线观看| 熟女少妇在线视频播放| 中文字幕av一区二区三区四区| 色婷婷成人综合| 中文字幕av在线免费观看| 久久久久久久久久久久久女国产乱| 男插女免费视频| 在线高清欧美| 久久精品国产成人精品| 亚洲视频在线观看一区二区| 国产日韩欧美麻豆| 男人舔女人下面高潮视频| 欧美午夜寂寞| 欧美中文字幕视频| 青青草视频在线观看| 岛国av在线不卡| 亚洲专区区免费| 蜜乳av另类精品一区二区| 久久久影院一区二区三区| 国产白浆在线免费观看| 亚洲精品一区二区三区四区| www久久精品| 日本精品一区二区三区四区| 自拍欧美一区| 国产91亚洲精品| 黄色软件在线| 欧美亚洲国产一区二区三区va| 亚洲精品国产精品国自产网站| 视频一区视频二区中文| 麻豆蜜桃91| 欧美日韩视频免费观看| 国产一区二区精品丝袜| 亚洲一区二区色| 亚洲精品一二三四区| 国产乱淫av片| 国产一区二区三区成人欧美日韩在线观看| 精品无人区一区二区三区| 在线观看爽视频| 在线观看精品国产视频| 一区二区三区黄| 亚洲黄色av一区| 艳妇乳肉亭妇荡乳av| 久久国产精品久久久久久电车| 色综合电影网| 美国十次综合久久| 91精品国产成人| www日韩tube| 日韩一区和二区| 日本五十路女优| 国产欧美日韩一区二区三区在线观看| 免费看污污网站| 欧美日韩精品免费观看视频完整| 蜜桃欧美视频| 亚洲成人毛片| 欧美xxxxx少妇| 国产精品毛片在线看| 欧美性色黄大片人与善| 亚洲欧美在线人成swag| 欧美激情中文字幕在线| 青青草视频在线观看| 欧美情侣在线播放| 毛片a片免费观看| 欧美xxxx黑人又粗又长| 欧美一区二区三区免费| 欧美三级韩国三级日本三斤在线观看| 偷拍自拍在线看| 国产精品自拍在线| 少妇无码av无码专区在线观看| 精品亚洲成人| 亚洲a区在线视频| 成人av三级| 久久琪琪电影院| 欧美r级在线| 国产视频在线一区二区| aaa一区二区三区| 欧洲亚洲精品在线| 好吊妞视频一区二区三区| 亚洲欧美日韩在线播放| 永久免费av无码网站性色av| 成人av一区二区三区| 天天久久综合网| 麻豆精品蜜桃视频网站| 国产精品无码一本二本三本色| 国产一区日韩一区| 乱子伦一区二区| 日韩电影免费网站| 日本福利一区二区三区| 久久久久久毛片免费看 | 欧美日韩国产123| 精品国产99久久久久久| 亚洲一区二区久久| 亚洲三级中文字幕| 精品毛片乱码1区2区3区| 国产美女永久免费| 欧美日韩极品在线观看一区| 国产污视频网站| 色诱亚洲精品久久久久久| 中文字幕日韩一级| 天天av天天翘天天综合网色鬼国产| 精品国产精品国产精品| 亚洲欧洲精品一区二区三区| 国产馆在线观看| 欧美极品aⅴ影院| 91在线无精精品白丝| 国产日产欧美一区| 午夜理伦三级做爰电影| 久久久三级国产网站| 一女三黑人理论片在线| 久久综合狠狠综合久久激情 | 2020国产精品视频| av在线资源| 91高清视频免费观看| 18video性欧美19sex高清| 久久免费国产视频| av在线私库| 庆余年2免费日韩剧观看大牛| 樱花草涩涩www在线播放| 欧美有码在线观看| 亚洲人免费短视频| 国产精品免费久久久久久| 福利一区二区| 91久久久久久久久久久久久| 精品一区二区三区中文字幕 | 亚洲欧美日本一区二区三区| 麻豆91在线看| 亚洲国产日韩在线一区| www.亚洲资源| 91激情五月电影| 中文字幕人妻一区二区三区视频 | 四川一级毛毛片| 国产不卡高清在线观看视频| 佐佐木明希电影| av一二三不卡影片| 加勒比一区二区| 国产精品久久久久久久裸模| 成人一级黄色大片| 亚洲综合一区二区| 黄色片免费观看视频| 欧美亚洲综合久久| 国产jizzjizz一区二区| 女人色极品影院| 9久re热视频在线精品| 国产 福利 在线| 蜜桃精品视频在线观看| 欧美视频亚洲图片| 午夜激情福利网| 91视频一区二区| 在线国产视频一区| 亚洲私人影院在线观看| 久热精品在线观看| 色综合久久天天| 亚洲天堂中文在线| 精品国产一区二区三区久久影院| 视频国产一区二区三区| 日日噜噜噜夜夜爽亚洲精品 | 国产麻豆一区二区三区精品视频| 亚洲国产精品久久久久久女王| 欧美二区不卡| 四虎永久在线精品无码视频| 国产久卡久卡久卡久卡视频精品| 黄色正能量网站| 亚洲欧美偷拍卡通变态| 亚洲天堂av片| 日韩一区二区在线观看视频| 蜜桃视频在线观看网站| 久久久精品欧美| 亚洲精品永久免费视频| 92看片淫黄大片看国产片| 欧美日韩一区二区三区四区不卡 | 精品国产一区二区在线观看| av资源种子在线观看| 欧美极品欧美精品欧美视频 | 国产人与禽zoz0性伦| 亚洲成人精品一区二区| 在线播放一级片| 亚洲激情视频网| 91香蕉在线观看| 国产精品美女久久| 丝袜久久网站| 国产青草视频在线观看| 激情综合网最新| 成人小视频免费看| 懂色aⅴ精品一区二区三区蜜月| 99久久精品国产一区二区成人| 亚洲色图综合网| 天堂√8在线中文| 国产精品一区二区三区不卡| 久久精品国产大片免费观看| 日韩精品无码一区二区三区免费| 成人福利视频网站| 深夜福利影院在线观看| 欧美人狂配大交3d怪物一区| 国产人成在线观看| 97在线免费视频| eeuss鲁片一区二区三区| 国产成人生活片| 国产精品一区二区在线播放| 波多野结衣久久久久| 欧美日韩免费观看一区三区| 精品三级久久久久久久电影聊斋| 538国产精品视频一区二区| 国产丝袜一区| 日韩伦理在线免费观看| 国产精品一区二区果冻传媒| 国产乱国产乱老熟300| 91精品国产欧美一区二区成人| 麻豆影院在线观看| 成人欧美一区二区三区在线| 99国内精品久久久久久久| 中文字幕成人在线视频| 国产精品视频你懂的| 亚洲天堂久久久久| 久久天堂av综合合色| 韩国一区二区视频| 蜜桃无码一区二区三区| 欧美日韩另类字幕中文| 四季av日韩精品一区| 久久久久久有精品国产| 97色成人综合网站| www.国产精品一区| 国产精品久久看| 色婷婷激情视频| 亚洲品质自拍视频网站| 国产精品嫩草影院桃色| 另类专区欧美制服同性| 久久亚洲精精品中文字幕| 一本大道东京热无码aⅴ| 狠狠色综合色综合网络| 欧美成人手机视频| 亚洲成人中文字幕| 极品美女一区| 亚洲黄色一区二区三区| 川上优av一区二区线观看| 波多野结衣一区| 美女在线视频一区二区| 成人欧美一区二区三区视频网页| 国产视频第二页| 97在线视频观看| av在线不卡顿| 一级黄色片在线免费观看| 夜夜嗨av一区二区三区| 网站黄在线观看| 国产精品18久久久久久首页狼| 日本精品黄色| 国产sm在线观看| 欧美日韩中文在线| 婷婷在线视频| 国产69精品久久久久9999apgf | 中文字幕一区二区三区四区久久 | 蜜臀av一区二区三区| 中文字幕在线有码| 亚洲精品自拍偷拍| 日韩精品第二页| 精品久久一二三| 中文字幕一区二区三区精华液| 亚洲精品久久久久久久久久| 黑人巨大精品| 高清视频一区二区三区| 久久精品二区三区| av成人免费网站| 精品亚洲永久免费精品 | 亚洲jizzjizz日本少妇| 亚洲免费网站| 中文字幕在线有码| 国产精品**亚洲精品| 国产制服91一区二区三区制服| 91麻豆文化传媒在线观看| 国产绿帽刺激高潮对白| 日韩av黄色在线观看| 欧美成人69av|