一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺(tái)!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Ruby - 使用Ruby來編寫訪問Twitter的命令行應(yīng)用程序的教程

使用Ruby來編寫訪問Twitter的命令行應(yīng)用程序的教程

2020-04-25 14:39Arpan Sen Ruby

這篇文章主要介紹了使用Ruby來編寫訪問Twitter的命令行應(yīng)用程序的教程,文章來自于IBM官方網(wǎng)站技術(shù)文檔,需要的朋友可以參考下

簡介

Twitter 現(xiàn)已成為社交網(wǎng)絡(luò)中的佼佼者。Twitter 只允許用戶發(fā)布不多于 140 個(gè)字符的內(nèi)容,誰能夠想到,這個(gè)過去毫不起眼的小網(wǎng)站如今卻價(jià)值十多億美元,擁有數(shù)百萬用戶,Twitter 平臺(tái)上已構(gòu)建了大量的應(yīng)用程序,并且不斷有新的開發(fā)人員準(zhǔn)備投入這一浪潮中。

本文并不打算介紹 Twitter(事實(shí)上,也沒有這個(gè)必要)。相反,本文將介紹如何訪問 Twitter 平臺(tái)來構(gòu)建出色的命令行應(yīng)用程序。Twitter 支持各種編程語言,包括 C++、Java?、Perl、Ruby、PHP 和 Python。對于每種語言,都有大量的庫或包可以幫助您完成大量工作。

本文將介紹如何使用 Ruby 來訪問 Twitter。您應(yīng)該對 Ruby 有所了解,但是即使不具備這方面的知識(shí),也很容易快速掌握 Ruby。

安裝 Twitter gem

一些 gem 可用于從 Ruby 訪問 Twitter(參見 參考資料,以獲得有關(guān)的更多信息)。對于本文,我選擇使用 twitter,這是由 John Nunemaker 編寫的 Ruby 包裝器。安裝 gem 非常簡單:

bash$ gem install twitter

該命令用于在您的機(jī)器上安裝 Twitter 客戶端。如果您有一個(gè)定制的 gem 安裝文件夾,那么首先需要從腳本中調(diào)用 rubygems,然后調(diào)用 twitter。下面展示了具體過程:

?
1
2
require 'rubygems'
require 'twitter'

第一個(gè) Twitter 腳本

現(xiàn)在,您已經(jīng)準(zhǔn)備好構(gòu)建第一個(gè)應(yīng)用程序,該應(yīng)用程序用于檢測您所關(guān)注的人的位置。首先創(chuàng)建一個(gè)腳本,它會(huì)獲取其他人的姓名,并告訴您他們的當(dāng)前位置。清單 1 顯示了相關(guān)代碼。
清單 1. 跟蹤用戶位置

?
1
2
3
4
5
6
7
8
require 'rubygems'
require 'twitter'
 
def track
 ARGV.each do |name|
  puts name + " => " + Twitter.user("#{name}").location
 end
end

track

這段代碼執(zhí)行了哪些操作?如果您剛剛接觸 Ruby,則需要向您解釋一下,ARGV 是一個(gè)數(shù)組,它提供腳本對命令行參數(shù)的訪問。Twitter.user API 返回有關(guān)您對其位置感興趣的人的信息。調(diào)用以下腳本可以獲得 Lady Gaga、Ashton Kutcher 和 Oprah Winfrey 的當(dāng)前位置:

?
1
2
3
4
bash$ ./location_tracker.rb ladygaga aplusk Oprah
ladygaga => New York, NY
aplusk => Los Angeles, California
Oprah => Chicago, IL

在 Twitter 上實(shí)現(xiàn)用戶搜索并了解認(rèn)證情況

現(xiàn)在,讓我們搜索 Twitter 上的一些現(xiàn)有用戶。如果可以猜出用戶的 Twitter ID,那么可以使用以下命令行:

?
1
2
3
require 'rubygems'
require 'twitter'
puts "User exists" if Twitter.user?(ARGV[0])

不過,一般情況下無法猜出用戶的 ID。因此,需要提供搜索用戶名的功能。這需要用以下代碼實(shí)現(xiàn),該代碼將搜索名稱與 Arpan 匹配的所有用戶:

?
1
2
3
require 'rubygems'
require 'twitter'
names = Twitter.user_search("Arpan")

但是這段代碼未能正常工作。清單 2 顯示的錯(cuò)誤日志告訴您問題出現(xiàn)在哪里。
清單 2. 無法執(zhí)行用戶搜索

?
1
2
3
4
5
6
7
8
Twitter::Unauthorized: GET https://api.twitter.com/1/users/search.json?q=Arpan%
20Sen: 401: Could not authenticate you.
  from D:/Ruby/lib/ruby/gems/1.8/gems/twitter-1.6.2/lib/faraday/response/r
aise_http_4xx.rb:12:in `on_complete'
  from D:/Ruby/lib/ruby/gems/1.8/gems/faraday-0.7.4/lib/faraday/response.r
b:9:in `call'
  from D:/Ruby/lib/ruby/gems/1.8/gems/faraday-0.7.4/lib/faraday/response.r
b:62:in `on_complete'

從這段代碼可以看出,您首先需要通過 Twitter 的認(rèn)證,然后才能執(zhí)行其他操作。這里的認(rèn)證不是要求您進(jìn)行登錄并輸入密碼;而是指對您的腳本(在Twitter 中稱為 應(yīng)用程序)進(jìn)行認(rèn)證。請牢記這一差異,然后訪問 http://dev.twitter.com/apps,并使用平常的帳號(hào)和密碼進(jìn)行登錄。Twitter 會(huì)要求您提供應(yīng)用程序名稱、描述和應(yīng)用程序的占位符 (placeholder) 網(wǎng)站。提供這些信息后,還必須提供以下四項(xiàng)內(nèi)容實(shí)現(xiàn)腳本認(rèn)證:

  1.     用戶密匙(Consumer key)
  2.     用戶秘密令牌(Consumer secret token)
  3.     用戶 OAuth 密匙
  4.     用戶 OAuth 秘密令牌

現(xiàn)在,在 Ruby 代碼內(nèi)部,您需要使用這些選項(xiàng)填充 Twitter.configure 對象。清單 3 顯示了相關(guān)代碼。
清單 3. 配置腳本進(jìn)行認(rèn)證

?
1
2
3
4
5
6
Twitter.configure do |config|
 config.consumer_key = "mT4atgBEKvNrrpV8GQKYnQ"
 config.consumer_secret = "BiQX47FXa938sySCLMxQCTHiTHjuTTRDT3v6HJD6s"
 config.oauth_token = "22652054-Yj6O38BSwhwTx9jnsPafhSzGhXvcvNQ"
 config.oauth_token_secret = "o9JuQuGxEVF3QDzMGPUQS0gmZNRECFGq12jKs"
end

注意,清單 3 中的條目是虛構(gòu)的:您需要在腳本中填充自己的內(nèi)容。順利完成認(rèn)證后,就可以搜索名為 Arpan 的人(參見下面的 清單 4)。
清單 4. 在 Twitter 上搜索用戶

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
require 'rubygems'
require 'Twitter'
 
Twitter.configure do |config|
 config.consumer_key = "mT4atgBEKvNrrpV8GQKYnQ"
 config.consumer_secret = "BiQX47FXa938sySCLMxQCTHiTHjuTTRDT3v6HJD6s"
 config.oauth_token = "22652054-Yj6O38BSwhwTx9jnsPafhSzGhXvcvNQ"
 config.oauth_token_secret = "o9JuQuGxEVF3QDzMGPUQS0gmZNRECFGq12jKs"
end
 
users = Twitter.user_search(ARGV[0])
users.each do |user|
 print "\n" + user.name + " => "
 print user.location unless user.location.nil?
end

現(xiàn)在,將腳本保存為 search_for.rb,并在命令行中以 ./search_for.rb Arpan 形式調(diào)用腳本后,您將獲得 清單 5 所示的用戶名稱。
清單 5. 清單 4 的代碼輸出

?
1
2
3
4
5
6
7
8
Arpan Jhaveri => New York
Arpan Boddishv =>
Arpan Peter => Bangalore,India
Arpan Podduturi => NYC
Arpan Kumar De => IIT Kharagpur
Arpan Shrestha => Kathmandu, Nepal
Arpan Divanjee => Mumbai,India
Arpan Bajaj => Bay Area, CA

您可能期望獲得更多結(jié)果。Arpan 這個(gè)名字(印度姓名)并不少見,那么為什么搜索結(jié)果這么少?最后您會(huì)發(fā)現(xiàn),user_search 使用了一個(gè)可選參數(shù)(一個(gè) Ruby hash 表),您也可以指定可產(chǎn)生更多結(jié)果的選項(xiàng)。因此,可以稍微修改一下清單 5 的代碼,傳遞可選的 hash 參數(shù)(#)并預(yù)填充它的值。例如,如果希望在一個(gè)頁面中填充 15 項(xiàng)結(jié)果,那么可以使用 清單 6 中的代碼。
清單 6. 在每個(gè)頁面顯示 15 項(xiàng)搜索條目

?
1
2
3
4
5
6
require 'rubygems'
require 'twitter'
 
#.. authentication code here
users = Twitter.user_search(ARGV[0], {:per_page => 15})
#... same as Listing 10

是不是可以在每個(gè)頁面中顯示 100 項(xiàng)條目?不行,Twitter.user_search 允許每頁顯示的最多條目為 20。清單 7 顯示了如何在每個(gè)頁面中顯示 20 個(gè)條目。
清單 7. 每個(gè)頁面顯示 20 個(gè)條目

?
1
2
3
4
5
6
7
8
9
10
11
#... usual authentication stuff
 
pagecount = 0
while pagecount < 10
 u = Twitter.user_search("#{ARGV[0]}", {:per_page => 20, :page => pagecount})
 u.each do |user|
 print "\n" + user.name + " => " + user.screen_name
 print " => " + user.location unless user.location.nil?
 end unless u.size < 20
 pagecount += 1
end

現(xiàn)在看上去好多了。您現(xiàn)在可以根據(jù)偏好名和用戶的屏幕名稱搜索用戶,下面讓我們做一些更有趣的事情。讓我們搜索居住在紐約的、喜歡 Ruby 的名為 Nick 的人。您可以從 user_search 獲得姓名和位置,但是如何處理喜歡 Ruby 的搜索要求?這引入了下一個(gè)需要學(xué)習(xí)的內(nèi)容:創(chuàng)建定制搜索客戶端。
使用 Twitter::Search 類

使用 Twitter::Search 類創(chuàng)建定制搜索客戶端。清單 8 顯示了相關(guān)代碼。
清單 8. 學(xué)習(xí)使用 Twitter::Search 類

?
1
2
3
4
5
6
7
8
9
10
11
12
#... user authentication
pagecount = 0
while pagecount < 10
 u = Twitter.user_search("#{ARGV[0]}", {:per_page => 20, :page => pagecount})
 u.each do |w|
 if w.location == "New York"
  results = Twitter::Search.new.from(w.screen_name).containing("ruby").fetch
  puts w.screen_name if results.size > 10
 end
 end unless u.size < 20
 pagecount += 1
end

這里發(fā)生了什么呢?代碼首先使用 Twitter::Search.new 創(chuàng)建了一個(gè)搜索客戶端。接下來,要求搜索客戶端從包含 ruby 的相應(yīng)用戶那里獲取所有 tweet。最后,代碼返回一組結(jié)果,如果在 tweet 中提到 Ruby 的次數(shù)超過十次,則將此人定義為喜歡 Ruby 的人。

讓我們嘗試為 hash 標(biāo)記 #ruby 獲取一組 tweet。下面是具體實(shí)現(xiàn):

?
1
2
3
4
5
#... user authentication code
results = search.hashtag("ruby").fetch
results.each do |r|
 puts r.text + " from " + r.from_user
end

不過,還可以實(shí)現(xiàn)更多內(nèi)容。對于 ruby 之類的 hash 標(biāo)記,您希望獲得數(shù)百個(gè)條目,不是嗎?對于這種情況,使用搜索客戶端也會(huì)帶來便利,因?yàn)槟梢詮乃阉骺蛻舳溯p松地檢索下一個(gè)頁面。清單 9 的代碼顯示了有關(guān) Ruby 的十頁 tweet。
清單 9. 顯示多個(gè)頁面

更多搜索選項(xiàng)

搜索客戶端可以讓您實(shí)現(xiàn)更出色的功能,比如使用特定語言或來自某個(gè)地方(比如德國)的 tweet。您甚至可以搜索提到特定用戶的 tweet,或搜索匹配特定條件的 tweet。例如,搜索所有提到 Ruby 但沒有提到 Rails 的 tweet?嘗試下面的代碼:

?
1
search.containing("ruby").not_containing("rails").fetch

當(dāng)然,您可以像下面這樣進(jìn)行串聯(lián):

?
1
search.containing("ruby").not_containing("rails").mentioning("username").from("place-id")

搜索短語非常直觀。例如,輸入以下代碼:

?
1
search.phrase("ruby on rails").fetch

現(xiàn)在,您已經(jīng)掌握了入門要領(lǐng)!
速度限制

關(guān)于 Twitter,您需要了解一件重要的事情,即速度限制,Twitter 非常重視這個(gè)問題。速度限制意味著 Twitter 只允許您的腳本每個(gè)小時(shí)執(zhí)行有限次數(shù)的查詢。您可能已經(jīng)發(fā)現(xiàn),對于某些應(yīng)用程序,您不需要進(jìn)行顯式的認(rèn)證,但是對于另外一些應(yīng)用程序,認(rèn)證則是必須的。對于不包含 OAuth 標(biāo)記的應(yīng)用程序,當(dāng)前的最大限制是每小時(shí)執(zhí)行 150 個(gè)調(diào)用;對于帶有該標(biāo)記的應(yīng)用程序,允許每小時(shí)執(zhí)行 350 個(gè)調(diào)用。有關(guān) Twitter 速率限制的最新信息,請查看 參考資源。要了解您的腳本認(rèn)證的當(dāng)前限制,請?zhí)砑右韵麓a:

?
1
puts Twitter.rate_limit_status

下面是輸出結(jié)果:

?
1
2
<#Hashie::Mash hourly_limit=350 remaining_hits=350 reset_time="Sat Aug 13 21:48:
59 +0000 2011" reset_time_in_seconds=1313272139>

如果您希望獲得更具體的結(jié)果,請用代碼查看下面的內(nèi)容:

?
1
Twitter.rate_limit.status.remaining_hits

下面的輸出禁用了認(rèn)證。注意,您已經(jīng)用完了可用限制的 50%:

?
1
2
<#Hashie::Mash hourly_limit=150 remaining_hits=77 reset_time="Sat Aug 13 21:13:5
0 +0000 2011" reset_time_in_seconds=1313270030>

更新 Twitter 的狀態(tài),重新發(fā)布 tweet 和其他內(nèi)容

搜索功能暫時(shí)告一段落。現(xiàn)在需要使用腳本更新 tweet 的狀態(tài)。只需一行代碼即可(當(dāng)然,您需要在腳本中包含認(rèn)證代碼):

?
1
2
#... authentication code
Twitter.update (ARGV [0])

將代碼保存為 update.rb,并以 ruby update.rb "Hello World from Ruby Script" 的形式從命令行調(diào)用它。現(xiàn)在,您的 Twitter 頁面已經(jīng)實(shí)現(xiàn)了更新!對話功能是 Twitter 的一個(gè)自然擴(kuò)展,向另一個(gè)用戶發(fā)送消息非常簡單:

?
1
2
#... authentication code
Twitter.direct_message_create("username", "Hi")

您可以選擇使用用戶的屏幕名或數(shù)字 ID 發(fā)送消息。Twitter 的另一個(gè)有趣特性是可以快速查看最近發(fā)送的和最近接收到的 20 條消息:

?
1
2
3
4
5
#... authentication code
Twitter.direct_messages_sent.each do | s |
 puts "Sent to: " + s.recipient_screen_name
 puts "Text: " + s.text
end

我們有時(shí)候需要強(qiáng)調(diào)某些 tweet 的重要性,一個(gè)好方法就是重新發(fā)布 tweet。下面顯示了重新發(fā)布的最近 20 個(gè) tweet:

?
1
2
3
4
5
#... authentication code
Twitter.retweets_of_me.each do |rt|
 print rt.text
 puts " retweet count = " + rt.retweet_count.to_s
end

當(dāng)然,如果能知道是誰在重新發(fā)布 tweet 就更好了,但是無法從 retweets_of_me API 直接獲取該信息。相反,您需要使用 retweeters_of API。注意,每個(gè) tweet 都有一個(gè)唯一的 ID,而 retweeters_of 需要獲得這一 ID。清單 10 展示了相關(guān)代碼:
清單 10. 誰在向我重新發(fā)布 tweet

?
1
2
3
4
5
6
7
8
#... authentication code
Twitter.retweets_of_me.each do |rt|
 print rt.text
 print " retweeted by "
 Twitter.retweeters_of(rt.id).each do |user|
 puts user.screen_name
 end
end

用 Twitter 實(shí)現(xiàn)有趣的功能

您可以利用自己的腳本做許多有趣的事情。例如,假如您很關(guān)心當(dāng)前 Twitter 中正在發(fā)生的事情,那么您可以獲取前十個(gè)趨勢:

?
1
2
3
Twitter.trends.each do | trend |
 puts trend.name
end

twitter.com 只能報(bào)告前十個(gè)趨勢。參考 參考資源,獲得有關(guān)的更多信息。通常,您可能只關(guān)心所在地的趨勢。只需要提供所在地的 where-on-earth ID (WOEID),Twitter 就可以提供這些信息。下面我展示了如何獲得印度的當(dāng)前趨勢:

?
1
2
3
Twitter.local_trends(12586534 ).each do | trend |
 puts trend #local_trends returns String
end

獲得 Twitter 推薦的用戶也很容易。首先查看以下腳本:

?
1
2
3
Twitter.suggestions("technology").users.each do | user |
 puts user.screen_name
end

我對這段代碼的輸出進(jìn)行了仔細(xì)檢查。前十個(gè)結(jié)果意味著這段代碼可以正常工作。Twitter 提供了不同的用戶感興趣的類別,通過調(diào)用 Twitter.suggestions(只需將 Twitter.suggestions 放在腳本里)便可獲得此信息。每個(gè)類別都有一個(gè)簡短名稱,在 Twitter 中稱為 slug,您需要將其傳遞給 Twitter.suggestions,然后便可獲得 Twitter 推薦的用戶。清單 11 展示了相關(guān)輸出。
清單 11. 技術(shù)類別中推薦的前幾名用戶

gruber
dannysullivan
AlecJRoss
timoreilly
Padmasree
tedtalks
OpenGov
twitter
BBCClick
woot
anildash
laughingsquid
digiphile
jennydeluxe
biz
ForbesTech
chadfowler
leolaporte

本文最后將介紹如何找到 Sachin Tendulkar(最棒的板球隊(duì)員)的最受歡迎的粉絲。首先,Sachin 的 ID 是 sachin_rt(在相關(guān)主題上,您可以使用 Twitter.user("sachin_rt").follower_count 查看其粉絲的數(shù)量,并使用 Twitter.user("sachin_rt").verified 確認(rèn)他的狀態(tài))。

現(xiàn)在,使用 Twitter.follower_ids("sachin_rt") 獲得 Sachin 粉絲的數(shù)量。默認(rèn)情況下,您將獲得 5000 名用戶,這足夠支持您完成下面的工作。確保您已經(jīng)閱讀 Twitter 文檔并參考了 Twitter 的 API resources for friends and followers,了解如何獲得完整的粉絲列表。下面是一個(gè)代碼示例:

?
1
2
#... authenticate yourself
puts Twitter.follower_ids("sachin_rt").ids.size

最后,根據(jù) follower_count 對這 5000 名用戶中的某些用戶進(jìn)行排序:

?
1
2
3
4
#... authenticate yourself
puts Twitter.follower_ids("sachin_rt").ids[0..49].sort!{|a, b| \
 Twitter.user(a).followers_count <=> \
 Twitter.user(b).followers_count}.reverse.first.name

在 sort 之后,"!" 表示排序?qū)λ{(diào)用的內(nèi)容修改了數(shù)組(并且沒有返回新的數(shù)組),花括號(hào)({})中的代碼是比較功能。這解釋了使用 Ruby 的另一個(gè)原因:能夠在一行代碼中實(shí)現(xiàn) 20 行 C++ 代碼完成的工作。

結(jié)束語

為 Twitter 編寫命令行腳本非常有趣,并且可以使您洞悉 Twitter 尚未提供的功能。此外,無論是搜索符合您的條件的特定用戶(從本地技術(shù)人員到領(lǐng)域中的主題專家),還是搜索令人興奮的新 tweet,都可以很方便地通過命令行來實(shí)現(xiàn)。在結(jié)束本文之前,我需要給出最后兩條忠告:首先,Twitter 非常在意每小時(shí)的速率限制,因此最好將搜索結(jié)果緩存到您的代碼中。其次,隨時(shí)關(guān)注 Twitter 的 REST API 資源,其中列出了您的 Twitter 客戶端的所有 API。最重要的是,盡情享受 Twitter 的樂趣!

延伸 · 閱讀

精彩推薦
  • RubyRuby環(huán)境下安裝使用bundler來管理多版本的gem

    Ruby環(huán)境下安裝使用bundler來管理多版本的gem

    這篇文章主要介紹了Ruby環(huán)境下安裝使用bundler來管理多版本的gem的方法,舉了Ruby On Rails中的應(yīng)用實(shí)例來進(jìn)行演示,需要的朋友可以參考下 ...

    日拱一卒4332020-05-10
  • RubyRuby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例

    這篇文章主要介紹了Ruby設(shè)計(jì)模式編程中使用Builder建造者模式的實(shí)例,建造者模式將一個(gè)復(fù)雜對象的構(gòu)造與它的表示分離,使同樣的構(gòu)建過程可以創(chuàng)建不同的表...

    范孝鵬2192020-05-07
  • RubyCentOS中配置Ruby on Rails環(huán)境

    CentOS中配置Ruby on Rails環(huán)境

    經(jīng)過一個(gè)上午的折騰,終于把ROR環(huán)境在CentOS中搞定,繞了很多彎路,把文章寫下來總結(jié)一下 ...

    可樂加糖4762020-04-12
  • RubyRuby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼

    Ruby進(jìn)行文件信息輸出實(shí)例代碼,數(shù)據(jù)是隨機(jī)的,所以每次的記錄都會(huì)不同。 ...

    ruby教程網(wǎng)2962020-04-10
  • RubyRuby簡潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對象

    Ruby簡潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對象

    這篇文章主要介紹了Ruby簡潔學(xué)習(xí)筆記(一):字符串、數(shù)字、類和對象,本文是學(xué)習(xí)筆記第一篇,需要的朋友可以參考下 ...

    腳本之家2472020-04-20
  • Ruby剖析 Ruby 訪問控制

    剖析 Ruby 訪問控制

    前面,我們說 Ruby 沒有函數(shù),只有方法.而且實(shí)際上有不止一種方法.這一節(jié)我們介紹 訪問控制 (accesscontrols). 想想當(dāng)我們在最高層而不是在一個(gè)類的定義里定義...

    ruby教程網(wǎng)3572020-04-08
  • RubyRuby迭代器的7種技巧分享

    Ruby迭代器的7種技巧分享

    這篇文章主要介紹了Ruby迭代器的7種技巧分享,Ruby中的迭代器非常人性化,本文既是講解了7個(gè)技巧也是講解了7種迭代器,需要的朋友可以參考下 ...

    腳本之家4782020-04-20
  • Ruby簡要說明Ruby中的迭代器

    簡要說明Ruby中的迭代器

    這篇文章主要介紹了Ruby中的迭代器,迭代器的概念在動(dòng)態(tài)語言的編程中十分重要,文章中介紹了Ruby中的each迭代器和collect迭代器,需要的朋友可以參考下 ...

    goldensun2772020-04-25
主站蜘蛛池模板: 2022国产在线观看 | 潘甜甜在线观看 | 免费观看在线 | 99这里只有精品在线 | 国产精品免费网站 | 青柠影视在线播放观看高清 | 摸咪网在线影院在线观看 | 日本在线小视频 | 秋霞在线观看成人高清视频51 | kkkk4444在线看片免费 | 四虎黄色网址 | 日本一区二区三区久久精品 | 亚洲精选在线观看 | 德国高清freexxxx性 | 日本狠狠操 | 波多野结衣之高校教师 | 爱欲荡漾在线观看 | 久久成人a毛片免费观看网站 | 欧美日本一区视频免费 | 国产精品一区二区三区免费 | 亚洲精品第五页 | 久久AV国产麻豆HD真实 | 久久亚洲精品专区蓝色区 | 大胸纲手被羞羞漫画网站 | 久久久无码精品无码国产人妻丝瓜 | 网址在线观看你懂我意思吧免费的 | 全彩成人18h漫画 | 国产精品亚洲精品观看不卡 | 国产嫩草视频 | 亚洲国产在线午夜视频无 | 福利视频一区青娱 | 99精彩免费观看 | 好吊色永久免费视频大全 | 国产情侣偷国语对白 | 国产高清专区 | 国产亚洲精品激情一区二区三区 | 欧美性一区二区三区 | 日本在线亚州精品视频在线 | 亚洲AV 中文字幕 国产 欧美 | 精品国产精品国产偷麻豆 | 亚洲欧美天堂 |