crown 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. data/ChangeLog +4 -0
  2. data/README.rdoc +14 -11
  3. data/VERSION +1 -1
  4. data/crown.gemspec +15 -5
  5. data/example/entrylist.rb +69 -0
  6. data/example/fbcount.rb +1 -1
  7. data/example/hbentry.rb +1 -1
  8. data/example/rtcount.rb +1 -0
  9. data/example/twcount.rb +1 -1
  10. data/example/{annual.rb → urilist.rb} +21 -26
  11. data/lib/crown.rb +1 -1
  12. data/{example/hbtrace.rb → lib/crown/amazon.rb} +8 -23
  13. data/lib/crown/amazon/crawler.rb +159 -0
  14. data/lib/crown/amazon/ecs.rb +385 -0
  15. data/lib/crown/amazon/entrylist.rb +171 -0
  16. data/lib/crown/backtype.rb +2 -2
  17. data/lib/crown/buzzurl.rb +2 -2
  18. data/lib/crown/cgm.rb +8 -0
  19. data/lib/crown/cgm/countable.rb +1 -1
  20. data/lib/crown/cgm/summarizable.rb +1 -1
  21. data/lib/crown/delicious.rb +2 -2
  22. data/lib/crown/facebook.rb +4 -4
  23. data/lib/crown/facebook/entry.rb +5 -3
  24. data/lib/crown/google.rb +38 -0
  25. data/lib/crown/google/plusone.rb +65 -0
  26. data/lib/crown/google/plusone/counter.rb +102 -0
  27. data/lib/crown/hatena/bookmark.rb +7 -7
  28. data/lib/crown/hatena/bookmark/entry.rb +70 -68
  29. data/lib/crown/hatena/bookmark/entrylist.rb +98 -0
  30. data/lib/crown/hatena/bookmark/urilist.rb +349 -0
  31. data/lib/crown/http-wrapper.rb +0 -1
  32. data/lib/crown/linkedin.rb +60 -0
  33. data/lib/crown/linkedin/counter.rb +81 -0
  34. data/lib/crown/livedoor/clip.rb +2 -2
  35. data/lib/crown/livedoor/clip/counter.rb +1 -1
  36. data/lib/crown/livedoor/reader.rb +2 -2
  37. data/lib/crown/topsy.rb +2 -3
  38. data/lib/crown/tweetmeme.rb +2 -2
  39. data/lib/crown/twitter.rb +1 -1
  40. data/lib/crown/twitter/uri.rb +2 -2
  41. data/lib/crown/twitter/user.rb +4 -4
  42. data/lib/crown/twitter/user/entry.rb +26 -6
  43. data/lib/crown/yahoo/bookmark.rb +3 -7
  44. data/test/crown-test.rb +34 -12
  45. metadata +17 -7
  46. data/lib/crown/hatena/bookmark/linktrace.rb +0 -135
@@ -0,0 +1,60 @@
1
+ # -*- coding: utf-8 -*-
2
+ # --------------------------------------------------------------------------- #
3
+ #
4
+ # linkedin.rb
5
+ #
6
+ # Copyright (c) 2008 - 2012, clown.
7
+ #
8
+ # Redistribution and use in source and binary forms, with or without
9
+ # modification, are permitted provided that the following conditions
10
+ # are met:
11
+ #
12
+ # - Redistributions of source code must retain the above copyright
13
+ # notice, this list of conditions and the following disclaimer.
14
+ # - Redistributions in binary form must reproduce the above copyright
15
+ # notice, this list of conditions and the following disclaimer in the
16
+ # documentation and/or other materials provided with the distribution.
17
+ # - No names of its contributors may be used to endorse or promote
18
+ # products derived from this software without specific prior written
19
+ # permission.
20
+ #
21
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24
+ # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25
+ # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
+ # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
27
+ # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28
+ # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
+ #
33
+ # --------------------------------------------------------------------------- #
34
+ module Crown
35
+ class LinkedIn
36
+ require 'crown/linkedin/counter'
37
+
38
+ # ------------------------------------------------------------------- #
39
+ #
40
+ # LinkedIn.count
41
+ #
42
+ # LinkedIn の API を介して,指定した URL へのシェア数を取得する.
43
+ #
44
+ # ------------------------------------------------------------------- #
45
+ def LinkedIn.count(uri, options = {})
46
+ return Crown::LinkedIn::URICounter.new.count(uri, options)
47
+ end
48
+
49
+ # ------------------------------------------------------------------- #
50
+ #
51
+ # count
52
+ #
53
+ # LinkedIn の API を介して,指定した URL へのシェア数を取得する.
54
+ #
55
+ # ------------------------------------------------------------------- #
56
+ def count(uri, options = {})
57
+ return Crown::LinkedIn::URICounter.new.count(uri, options)
58
+ end
59
+ end # LinkedIn
60
+ end # Crown
@@ -0,0 +1,81 @@
1
+ # -*- coding: utf-8 -*-
2
+ # --------------------------------------------------------------------------- #
3
+ #
4
+ # linkedin/counter.rb
5
+ #
6
+ # Copyright (c) 2008 - 2012, clown.
7
+ #
8
+ # Redistribution and use in source and binary forms, with or without
9
+ # modification, are permitted provided that the following conditions
10
+ # are met:
11
+ #
12
+ # - Redistributions of source code must retain the above copyright
13
+ # notice, this list of conditions and the following disclaimer.
14
+ # - Redistributions in binary form must reproduce the above copyright
15
+ # notice, this list of conditions and the following disclaimer in the
16
+ # documentation and/or other materials provided with the distribution.
17
+ # - No names of its contributors may be used to endorse or promote
18
+ # products derived from this software without specific prior written
19
+ # permission.
20
+ #
21
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24
+ # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25
+ # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26
+ # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
27
+ # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28
+ # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29
+ # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30
+ # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31
+ # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
+ #
33
+ # --------------------------------------------------------------------------- #
34
+ module Crown
35
+ class LinkedIn
36
+ class URICounter
37
+ require 'cgi'
38
+ require 'crown/cgm/countable'
39
+ require 'rubygems'
40
+ require 'json'
41
+
42
+ # ------------------------------------------------------------------- #
43
+ # Mix-in modules
44
+ # ------------------------------------------------------------------- #
45
+ include Crown::CGM::Countable
46
+
47
+ private
48
+ # --------------------------------------------------------------- #
49
+ # address
50
+ # --------------------------------------------------------------- #
51
+ def address()
52
+ return 'www.linkedin.com'
53
+ end
54
+
55
+ # --------------------------------------------------------------- #
56
+ # path
57
+ # --------------------------------------------------------------- #
58
+ def path()
59
+ return '/cws/share-count'
60
+ end
61
+
62
+ # --------------------------------------------------------------- #
63
+ # query
64
+ # --------------------------------------------------------------- #
65
+ def query(uri, options)
66
+ return '?url=' + CGI.escape(uri)
67
+ end
68
+
69
+ # --------------------------------------------------------------- #
70
+ # parse
71
+ # --------------------------------------------------------------- #
72
+ def parse(body)
73
+ body.scan(/\{.+\}/) { |s|
74
+ json = JSON.parse(s)
75
+ return json["count"].to_i
76
+ }
77
+ return error_value()
78
+ end
79
+ end # URICounter
80
+ end # LinkedIn
81
+ end # Crown
@@ -43,7 +43,7 @@ module Crown
43
43
  # 指定した URL のクリップ数(ブックマーク数)を取得する.
44
44
  #
45
45
  # --------------------------------------------------------------- #
46
- def Clip.count(uri, options = nil)
46
+ def Clip.count(uri, options = {})
47
47
  return Crown::Livedoor::ClipCounter.new.count(uri, options)
48
48
  end
49
49
 
@@ -54,7 +54,7 @@ module Crown
54
54
  # 指定した URL のクリップ数(ブックマーク数)を取得する.
55
55
  #
56
56
  # --------------------------------------------------------------- #
57
- def count(uri, options = nil)
57
+ def count(uri, options = {})
58
58
  return Crown::Livedoor::ClipCounter.new.count(uri, options)
59
59
  end
60
60
  end # Clip
@@ -58,7 +58,7 @@ module Crown
58
58
  # �ł��邽�߁Ccount ���\�b�h�𒼐ڍĒ�`����D
59
59
  #
60
60
  # --------------------------------------------------------------- #
61
- def count(uri, options = nil)
61
+ def count(uri, options = {})
62
62
  begin
63
63
  proxy_addr = nil
64
64
  proxy_port = nil
@@ -43,7 +43,7 @@ module Crown
43
43
  # 指定したフィード URL の購読者数を取得する.
44
44
  #
45
45
  # ------------------------------------------------------------------- #
46
- def Reader.count(feed_uri, options = nil)
46
+ def Reader.count(feed_uri, options = {})
47
47
  return Crown::Livedoor::ReadCounter.new.count(feed_uri, options)
48
48
  end
49
49
 
@@ -54,7 +54,7 @@ module Crown
54
54
  # 指定したフィード URL の購読者数を取得する.
55
55
  #
56
56
  # ------------------------------------------------------------------- #
57
- def count(feed_uri, options = nil)
57
+ def count(feed_uri, options = {})
58
58
  return Crown::Livedoor::ReadCounter.new.count(feed_uri, options)
59
59
  end
60
60
  end # Reader
@@ -42,7 +42,7 @@ module Crown
42
42
  # Topsy の API を介して,指定した URL へのツイート数を取得する.
43
43
  #
44
44
  # ------------------------------------------------------------------- #
45
- def Topsy.count(uri, options = nil)
45
+ def Topsy.count(uri, options = {})
46
46
  return Crown::Topsy::URICounter.new.count(uri, options)
47
47
  end
48
48
 
@@ -53,9 +53,8 @@ module Crown
53
53
  # Topsy の API を介して,指定した URL へのツイート数を取得する.
54
54
  #
55
55
  # ------------------------------------------------------------------- #
56
- def count(uri, options = nil)
56
+ def count(uri, options = {})
57
57
  return Crown::Topsy::URICounter.new.count(uri, options)
58
58
  end
59
-
60
59
  end # Topsy
61
60
  end # Crown
@@ -42,7 +42,7 @@ module Crown
42
42
  # TweetMeme の API を介して,指定した URL へのツイート数を取得する.
43
43
  #
44
44
  # ------------------------------------------------------------------- #
45
- def TweetMeme.count(uri, options = nil)
45
+ def TweetMeme.count(uri, options = {})
46
46
  return Crown::TweetMeme::URICounter.new.count(uri, options)
47
47
  end
48
48
 
@@ -53,7 +53,7 @@ module Crown
53
53
  # TweetMeme の API を介して,指定した URL へのツイート数を取得する.
54
54
  #
55
55
  # ------------------------------------------------------------------- #
56
- def count(uri, options = nil)
56
+ def count(uri, options = {})
57
57
  return Crown::TweetMeme::URICounter.new.count(uri, options)
58
58
  end
59
59
 
@@ -47,7 +47,7 @@ module Crown
47
47
  # 代替のメソッドを使用する事.
48
48
  #
49
49
  # ------------------------------------------------------------------- #
50
- def count(screen_name, options = nil)
50
+ def count(screen_name, options = {})
51
51
  return Crown::Twitter::User.summary(screen_name, options)
52
52
  end
53
53
 
@@ -46,14 +46,14 @@ module Crown
46
46
  # ----------------------------------------------------------- #
47
47
  # URI.count
48
48
  # ----------------------------------------------------------- #
49
- def URI.count(uri, options = nil)
49
+ def URI.count(uri, options = {})
50
50
  return Crown::Twitter::URICounter.new.count(uri, options)
51
51
  end
52
52
 
53
53
  # ----------------------------------------------------------- #
54
54
  # count
55
55
  # ----------------------------------------------------------- #
56
- def count(uri, options = nil)
56
+ def count(uri, options = {})
57
57
  return Crown::Twitter::URICounter.new.count(uri, options)
58
58
  end
59
59
  end # URI
@@ -47,28 +47,28 @@ module Crown
47
47
  # ----------------------------------------------------------- #
48
48
  # User.count
49
49
  # ----------------------------------------------------------- #
50
- def User.count(screen_name, options = nil)
50
+ def User.count(screen_name, options = {})
51
51
  return Crown::Twitter::TweetCounter.new.count(screen_name, options)
52
52
  end
53
53
 
54
54
  # ----------------------------------------------------------- #
55
55
  # User.summary
56
56
  # ----------------------------------------------------------- #
57
- def User.summary(screen_name, options = nil)
57
+ def User.summary(screen_name, options = {})
58
58
  return Crown::Twitter::UserEntry.new.summary(screen_name, options)
59
59
  end
60
60
 
61
61
  # ----------------------------------------------------------- #
62
62
  # count
63
63
  # ----------------------------------------------------------- #
64
- def count(screen_name, options = nil)
64
+ def count(screen_name, options = {})
65
65
  return Crown::Twitter::TweetCounter.new.count(screen_name, options)
66
66
  end
67
67
 
68
68
  # ----------------------------------------------------------- #
69
69
  # summary
70
70
  # ----------------------------------------------------------- #
71
- def summary(screen_name, options = nil)
71
+ def summary(screen_name, options = {})
72
72
  return Crown::Twitter::UserEntry.new.summary(screen_name, options)
73
73
  end
74
74
  end # User
@@ -49,7 +49,20 @@ module Crown
49
49
  # ------------------------------------------------------------------- #
50
50
  # structures
51
51
  # ------------------------------------------------------------------- #
52
- Response = Struct.new(:status, :favorite, :friend, :follower, :list)
52
+ Response = Struct.new(
53
+ :id, # Twitter ID
54
+ :lang, # �ݒ肳��Ă��錾��
55
+ :protected, # ����J�A�J�E���g���ǂ���
56
+ :name, # ���[�U��
57
+ :screen_name, # URL �ɕ\������閼�O
58
+ :image, # �v���t�B�[���A�C�R���� URL
59
+ :description, # ���ȏЉ
60
+ :status, # �c�C�[�g��
61
+ :favorite, # ���C�ɓ��萔
62
+ :friend, # �t�H���[��
63
+ :follower, # �t�H�����[��
64
+ :list # �o�^���ꂽ���X�g��
65
+ )
53
66
 
54
67
  # ------------------------------------------------------------------- #
55
68
  # Mix-in
@@ -84,11 +97,18 @@ module Crown
84
97
  def parse(body)
85
98
  json = JSON.parse(body)
86
99
  result = Response.new
87
- result.status = json["statuses_count"].to_i
88
- result.favorite = json["favourites_count"].to_i
89
- result.friend = json["friends_count"].to_i
90
- result.follower = json["followers_count"].to_i
91
- result.list = json["listed_count"].to_i
100
+ result.id = json["id"].to_i
101
+ result.lang = json["lang"]
102
+ result.protected = json["protected"]
103
+ result.name = json["name"]
104
+ result.screen_name = json["screen_name"]
105
+ result.image = json["profile_image_url"]
106
+ result.description = json["description"]
107
+ result.status = json["statuses_count"].to_i
108
+ result.favorite = json["favourites_count"].to_i
109
+ result.friend = json["friends_count"].to_i
110
+ result.follower = json["followers_count"].to_i
111
+ result.list = json["listed_count"].to_i
92
112
  return result
93
113
  end
94
114
  end # UserEntry
@@ -34,11 +34,7 @@
34
34
  module Crown
35
35
  module Yahoo
36
36
  # ------------------------------------------------------------------- #
37
- #
38
- # BookmarkCounter
39
- #
40
- # Yahoo! Japan ブックマーク API 経由の各種情報を取得するクラス.
41
- #
37
+ # Bookmark
42
38
  # ------------------------------------------------------------------- #
43
39
  class Bookmark
44
40
  require 'crown/yahoo/bookmark/counter'
@@ -50,7 +46,7 @@ module Crown
50
46
  # 指定した URL のブックマーク数を取得する
51
47
  #
52
48
  # --------------------------------------------------------------- #
53
- def Bookmark.count(uri, options = nil)
49
+ def Bookmark.count(uri, options = {})
54
50
  return Crown::Yahoo::BookmarkCounter.new.count(uri, options)
55
51
  end
56
52
 
@@ -61,7 +57,7 @@ module Crown
61
57
  # 指定した URL のブックマーク数を取得する
62
58
  #
63
59
  # --------------------------------------------------------------- #
64
- def count(uri, options = nil)
60
+ def count(uri, options = {})
65
61
  return Crown::Yahoo::BookmarkCounter.new.count(uri, options)
66
62
  end
67
63
  end # Bookmark
@@ -62,7 +62,7 @@ class CrownTest < Test::Unit::TestCase
62
62
  def test_delicious_count
63
63
  # normal test
64
64
  @@valid_uris.each { |uri|
65
- assert(Crown::Delicious.count(uri) != nil, "failed in " + uri)
65
+ assert(Crown::Delicious.count(uri) >= 0, "failed in " + uri)
66
66
  }
67
67
  end
68
68
 
@@ -72,7 +72,7 @@ class CrownTest < Test::Unit::TestCase
72
72
  def test_livedoor_count
73
73
  # normal test
74
74
  @@valid_uris.each { |uri|
75
- assert(Crown::Livedoor::Clip.count(uri) != nil, "failed in " + uri)
75
+ assert(Crown::Livedoor::Clip.count(uri) >= 0, "failed in " + uri)
76
76
  }
77
77
  end
78
78
 
@@ -82,7 +82,7 @@ class CrownTest < Test::Unit::TestCase
82
82
  def test_buzzurl_count
83
83
  # normal test
84
84
  @@valid_uris.each { |uri|
85
- assert(Crown::Buzzurl.count(uri) != nil, "failed in " + uri)
85
+ assert(Crown::Buzzurl.count(uri) >= 0, "failed in " + uri)
86
86
  }
87
87
  end
88
88
 
@@ -92,7 +92,7 @@ class CrownTest < Test::Unit::TestCase
92
92
  def test_yahoo_count
93
93
  # normal test
94
94
  @@valid_uris.each { |uri|
95
- assert(Crown::Yahoo::Bookmark.count(uri) != nil, "failed in " + uri)
95
+ assert(Crown::Yahoo::Bookmark.count(uri) >= 0, "failed in " + uri)
96
96
  }
97
97
  end
98
98
 
@@ -117,7 +117,7 @@ class CrownTest < Test::Unit::TestCase
117
117
  def test_topsy_count
118
118
  # normal test
119
119
  @@valid_uris.each { |uri|
120
- assert(Crown::Topsy.count(uri) != nil, "failed in " + uri)
120
+ assert(Crown::Topsy.count(uri) >= 0, "failed in " + uri)
121
121
  }
122
122
  end
123
123
 
@@ -127,7 +127,7 @@ class CrownTest < Test::Unit::TestCase
127
127
  def test_tweetmeme_count
128
128
  # normal test
129
129
  @@valid_uris.each { |uri|
130
- assert(Crown::TweetMeme.count(uri) != nil, "failed in " + uri)
130
+ assert(Crown::TweetMeme.count(uri) >= 0, "failed in " + uri)
131
131
  }
132
132
  end
133
133
 
@@ -142,10 +142,30 @@ class CrownTest < Test::Unit::TestCase
142
142
  #def test_backtype_count
143
143
  # Crown::BackType.api_key = "your_api_key"
144
144
  # @@valid_uris.each { |uri|
145
- # assert(Crown::BackType.count(uri) != nil, "failed in " + uri)
145
+ # assert(Crown::BackType.count(uri) >= 0, "failed in " + uri)
146
146
  # }
147
147
  #end
148
148
 
149
+ # ----------------------------------------------------------------------- #
150
+ # test_linkedin_count
151
+ # ----------------------------------------------------------------------- #
152
+ def test_linkedin_count
153
+ # normal test
154
+ @@valid_uris.each { |uri|
155
+ assert(Crown::LinkedIn.count(uri) >= 0, "failed in " + uri)
156
+ }
157
+ end
158
+
159
+ # ----------------------------------------------------------------------- #
160
+ # test_google_plus1_count
161
+ # ----------------------------------------------------------------------- #
162
+ def test_google_plus1_count
163
+ # normal test
164
+ @@valid_uris.each { |uri|
165
+ assert(Crown::Google::PlusOne.count(uri) >= 0, "failed in " + uri)
166
+ }
167
+ end
168
+
149
169
  # ----------------------------------------------------------------------- #
150
170
  # test_cgm
151
171
  # ----------------------------------------------------------------------- #
@@ -156,6 +176,8 @@ class CrownTest < Test::Unit::TestCase
156
176
  :tweetmeme, # TweetMeme
157
177
  # :backtype, # BackTweets (要 API key)
158
178
  :facebook, # Facebook
179
+ :google_plus1, # Google+1
180
+ :linkedin, # LinkedIn
159
181
  :hatena_bookmark, # はてなブックマーク
160
182
  :livedoor_clip, # Livedoor クリップ
161
183
  :delicious, # Delicious
@@ -165,19 +187,19 @@ class CrownTest < Test::Unit::TestCase
165
187
 
166
188
  @@valid_uris.each { |uri|
167
189
  services.each { |service|
168
- assert(Crown::CGM.proxy(service).count(uri) >= 0, "failed in " + uri)
190
+ assert(Crown::CGM.proxy(service).count(uri) >= 0, "failed in " + service.to_s + "," + uri)
169
191
  }
170
192
  }
171
193
  end
172
194
 
173
195
  # ----------------------------------------------------------------------- #
174
- # test_twitter_count
196
+ # test_twitter_user_summary
175
197
  # ----------------------------------------------------------------------- #
176
- def test_twitter_count
198
+ def test_twitter_user_summary
177
199
  # normal test
178
200
  @@valid_users.each { |screen_name|
179
- counter = Crown::Twitter.count(screen_name)
180
- assert(counter != nil, "failed in Crown::Twitter.count: " + screen_name)
201
+ counter = Crown::Twitter::User.summary(screen_name)
202
+ assert(counter != nil, "failed in Crown::Twitter::User.summary: " + screen_name)
181
203
  assert(counter.status > 0, "wrong statuses count: " + screen_name)
182
204
  assert(counter.favorite > 0, "wrong favorites count: " + screen_name)
183
205
  assert(counter.friend > 0, "wrong friends count: " + screen_name)