browser2 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +5 -0
  3. data/.hound.yml +90 -0
  4. data/.rubocop.yml +90 -0
  5. data/.travis.yml +14 -0
  6. data/CONTRIBUTING.md +44 -0
  7. data/Gemfile +2 -0
  8. data/LICENSE +20 -0
  9. data/README.md +125 -0
  10. data/Rakefile +33 -0
  11. data/browser2.gemspec +42 -0
  12. data/config.ru +2 -0
  13. data/data/bots.json +176 -0
  14. data/data/languages.json +115 -0
  15. data/gemfiles/rails3.gemfile +4 -0
  16. data/lib/browser/action_controller.rb +20 -0
  17. data/lib/browser/data/bots.rb +5 -0
  18. data/lib/browser/data/languages.rb +5 -0
  19. data/lib/browser/data/search_engines.rb +14 -0
  20. data/lib/browser/meta/base.rb +20 -0
  21. data/lib/browser/meta/generic_browser.rb +15 -0
  22. data/lib/browser/meta/id.rb +9 -0
  23. data/lib/browser/meta/ie.rb +18 -0
  24. data/lib/browser/meta/ios.rb +9 -0
  25. data/lib/browser/meta/mobile.rb +9 -0
  26. data/lib/browser/meta/modern.rb +9 -0
  27. data/lib/browser/meta/platform.rb +9 -0
  28. data/lib/browser/meta/safari.rb +9 -0
  29. data/lib/browser/meta/webkit.rb +9 -0
  30. data/lib/browser/methods/blackberry.rb +51 -0
  31. data/lib/browser/methods/bots.rb +37 -0
  32. data/lib/browser/methods/consoles.rb +43 -0
  33. data/lib/browser/methods/devices.rb +41 -0
  34. data/lib/browser/methods/ie.rb +104 -0
  35. data/lib/browser/methods/language.rb +16 -0
  36. data/lib/browser/methods/mobile.rb +30 -0
  37. data/lib/browser/methods/platform.rb +142 -0
  38. data/lib/browser/methods/tv.rb +8 -0
  39. data/lib/browser/middleware/context/additions.rb +16 -0
  40. data/lib/browser/middleware/context/url_methods.rb +13 -0
  41. data/lib/browser/middleware/context.rb +20 -0
  42. data/lib/browser/middleware.rb +66 -0
  43. data/lib/browser/rails.rb +14 -0
  44. data/lib/browser/version.rb +8 -0
  45. data/lib/browser.rb +255 -0
  46. data/test/benchmark_test.rb +83 -0
  47. data/test/browser_test.rb +248 -0
  48. data/test/middleware_test.rb +50 -0
  49. data/test/sample_app.rb +31 -0
  50. data/test/test_helper.rb +20 -0
  51. data/test/ua.yml +122 -0
  52. data/test/unit/adobe_air_test.rb +13 -0
  53. data/test/unit/android_test.rb +93 -0
  54. data/test/unit/blackberry_test.rb +104 -0
  55. data/test/unit/bots_test.rb +116 -0
  56. data/test/unit/chrome_test.rb +56 -0
  57. data/test/unit/console_test.rb +67 -0
  58. data/test/unit/firefox_test.rb +37 -0
  59. data/test/unit/ie_test.rb +377 -0
  60. data/test/unit/ios_test.rb +139 -0
  61. data/test/unit/kindle_test.rb +37 -0
  62. data/test/unit/opera_test.rb +42 -0
  63. data/test/unit/windows_phone_test.rb +50 -0
  64. data/test/unit/windows_test.rb +60 -0
  65. metadata +240 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1f463a934b5cc3ec414a8debede9490463e3dcf8
4
+ data.tar.gz: 127527af01bb462ee962d38e916e16feb1b69f1e
5
+ SHA512:
6
+ metadata.gz: bf27a91d2597fbaa69aa7a8b07dc8e83af25653f8103d280e280a6bafbe747516ed9fec68448ceffd1ea21979ffc0124b57a302fe49aea7b25918320e2154bfa
7
+ data.tar.gz: ed779470b797788c4e4ffadda24a37723db85d79d3f1cc8e1b414891d0e1142c28d57808c778ff90aab5b75486966ab5b3ba83a942e76a8786628cc53d36ad84
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ pkg
2
+ coverage
3
+ doc
4
+ log
5
+ *.lock
data/.hound.yml ADDED
@@ -0,0 +1,90 @@
1
+ ClassLength:
2
+ Enabled: false
3
+
4
+ CyclomaticComplexity:
5
+ Enabled: false
6
+
7
+ Documentation:
8
+ Enabled: false
9
+
10
+ Encoding:
11
+ Enabled: false
12
+
13
+ FileName:
14
+ Enabled: false
15
+
16
+ IfUnlessModifier:
17
+ Enabled: false
18
+
19
+ MethodLength:
20
+ Enabled: false
21
+
22
+ ModuleFunction:
23
+ Enabled: false
24
+
25
+ OneLineConditional:
26
+ Enabled: false
27
+
28
+ ParameterLists:
29
+ Enabled: false
30
+
31
+ Proc:
32
+ Enabled: false
33
+
34
+ SingleLineBlockParams:
35
+ Enabled: false
36
+
37
+ VariableInterpolation:
38
+ Enabled: false
39
+
40
+ TrailingComma:
41
+ Enabled: false
42
+
43
+ WhileUntilModifier:
44
+ Enabled: false
45
+
46
+ PredicateName:
47
+ NamePrefixBlacklist:
48
+ - is_
49
+
50
+ StringLiterals:
51
+ EnforcedStyle: double_quotes
52
+ SupportedStyles:
53
+ - single_quotes
54
+ - double_quotes
55
+
56
+ DotPosition:
57
+ EnforcedStyle: leading
58
+
59
+ SpaceBeforeBlockBraces:
60
+ EnforcedStyle: space
61
+
62
+ SpaceInsideBlockBraces:
63
+ EnforcedStyle: no_space
64
+
65
+ DoubleNegation:
66
+ Enabled: false
67
+
68
+ SpaceInsideBlockBraces:
69
+ SpaceBeforeBlockParameters: false
70
+
71
+ LineLength:
72
+ Max: 130
73
+
74
+ RegexpLiteral:
75
+ MaxSlashes: 0
76
+
77
+ SpaceInsideHashLiteralBraces:
78
+ Enabled: false
79
+
80
+ PercentLiteralDelimiters:
81
+ PreferredDelimiters:
82
+ '%': '[]'
83
+ '%i': '[]'
84
+ '%q': '[]'
85
+ '%Q': '[]'
86
+ '%r': '[]'
87
+ '%s': '[]'
88
+ '%w': '[]'
89
+ '%W': '[]'
90
+ '%x': '[]'
data/.rubocop.yml ADDED
@@ -0,0 +1,90 @@
1
+ ClassLength:
2
+ Enabled: false
3
+
4
+ CyclomaticComplexity:
5
+ Enabled: false
6
+
7
+ Documentation:
8
+ Enabled: false
9
+
10
+ Encoding:
11
+ Enabled: false
12
+
13
+ FileName:
14
+ Enabled: false
15
+
16
+ IfUnlessModifier:
17
+ Enabled: false
18
+
19
+ MethodLength:
20
+ Enabled: false
21
+
22
+ ModuleFunction:
23
+ Enabled: false
24
+
25
+ OneLineConditional:
26
+ Enabled: false
27
+
28
+ ParameterLists:
29
+ Enabled: false
30
+
31
+ Proc:
32
+ Enabled: false
33
+
34
+ SingleLineBlockParams:
35
+ Enabled: false
36
+
37
+ VariableInterpolation:
38
+ Enabled: false
39
+
40
+ TrailingComma:
41
+ Enabled: false
42
+
43
+ WhileUntilModifier:
44
+ Enabled: false
45
+
46
+ PredicateName:
47
+ NamePrefixBlacklist:
48
+ - is_
49
+
50
+ StringLiterals:
51
+ EnforcedStyle: double_quotes
52
+ SupportedStyles:
53
+ - single_quotes
54
+ - double_quotes
55
+
56
+ DotPosition:
57
+ EnforcedStyle: leading
58
+
59
+ SpaceBeforeBlockBraces:
60
+ EnforcedStyle: space
61
+
62
+ SpaceInsideBlockBraces:
63
+ EnforcedStyle: no_space
64
+
65
+ DoubleNegation:
66
+ Enabled: false
67
+
68
+ SpaceInsideBlockBraces:
69
+ SpaceBeforeBlockParameters: false
70
+
71
+ LineLength:
72
+ Max: 130
73
+
74
+ RegexpLiteral:
75
+ MaxSlashes: 0
76
+
77
+ SpaceInsideHashLiteralBraces:
78
+ Enabled: false
79
+
80
+ PercentLiteralDelimiters:
81
+ PreferredDelimiters:
82
+ '%': '[]'
83
+ '%i': '[]'
84
+ '%q': '[]'
85
+ '%Q': '[]'
86
+ '%r': '[]'
87
+ '%s': '[]'
88
+ '%w': '[]'
89
+ '%W': '[]'
90
+ '%x': '[]'
data/.travis.yml ADDED
@@ -0,0 +1,14 @@
1
+ language: ruby
2
+ sudo: false
3
+ cache: bundler
4
+ rvm:
5
+ - 'ruby-2.3.0'
6
+ - '2.2'
7
+ - '2.1'
8
+ - '2.0'
9
+ gemfile:
10
+ - Gemfile
11
+ - gemfiles/rails3.gemfile
12
+ script: "bundle exec rake spec"
13
+ notifications:
14
+ email: false
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,44 @@
1
+ # Contributing
2
+
3
+ ## Issues
4
+
5
+ If you want to request a feature or report a bug, please use the following template.
6
+
7
+ ```markdown
8
+ ## Description
9
+
10
+ [Add feature/bug description here]
11
+
12
+ ## How to reproduce
13
+
14
+ [Add steps on how to reproduce this issue]
15
+
16
+ ## What do you expect
17
+
18
+ [Describe what do you expect to happen]
19
+
20
+ ## What happened instead
21
+
22
+ [Describe the actual results]
23
+
24
+ ## Gem version:
25
+
26
+ Browser version: [Add browser gem version here]
27
+
28
+ ## Report
29
+
30
+ Visit <http://user-agent.herokuapp.com> and paste the URL here.
31
+ ```
32
+
33
+ ## Writing code
34
+
35
+ Once you've made your great commits (include tests, please):
36
+
37
+ 1. [Fork](http://help.github.com/forking/) browser
38
+ 2. Create a topic branch - `git checkout -b my_branch`
39
+ 3. Push to your branch - `git push origin my_branch`
40
+ 4. [Create an Issue](http://github.com/fnando/browser/issues) with a link to your branch
41
+ 5. That's it!
42
+
43
+ Please respect the indentation rules and code style.
44
+ And use 2 spaces, not tabs. And don't touch the versioning thing.
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source "http://rubygems.org"
2
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ 'Software'), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
17
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
18
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
19
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
20
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,125 @@
1
+ # Browser
2
+
3
+ [![Travis-CI](https://travis-ci.org/dirk/browser2.png)](https://travis-ci.org/dirk/browser2)
4
+
5
+ Performance-optimized fork of the [`browser`](https://github.com/fnando/browser) Ruby gem.
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ gem install browser
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```ruby
16
+ require 'rubygems'
17
+ require 'browser2'
18
+
19
+ browser = Browser.new ua: 'some string', accept_language: 'en-us'
20
+ browser.name # readable browser name
21
+ browser.version # major version number
22
+ browser.full_version
23
+ browser.safari?
24
+ browser.opera?
25
+ browser.chrome?
26
+ browser.chrome_os?
27
+ browser.mobile?
28
+ browser.tablet?
29
+ browser.console?
30
+ browser.firefox?
31
+ browser.ie?
32
+ browser.ie?(6) # detect specific IE version
33
+ browser.edge? # Newest MS browser
34
+ browser.modern? # Webkit, Firefox 17+, IE 9+ and Opera 12+
35
+ browser.platform # return :mac, :windows, :linux or :other
36
+ browser.ios? # detect iOS
37
+ browser.ios?(9) # detect specific iOS version
38
+ browser.mac?
39
+ browser.windows?
40
+ browser.windows_x64?
41
+ browser.linux?
42
+ browser.blackberry?
43
+ browser.blackberry?(10) # detect specific BlackBerry version
44
+ browser.bot?
45
+ browser.search_engine?
46
+ browser.phantom_js?
47
+ browser.quicktime?
48
+ browser.core_media?
49
+ browser.silk?
50
+ browser.android?
51
+ browser.android?(4.2) # detect Android Jelly Bean 4.2
52
+ browser.known? # has the browser been successfully detected?
53
+ browser.meta # an array with several attributes
54
+ browser.to_s # the meta info joined by space
55
+ ```
56
+
57
+ See the [tests](https://github.com/dirk/browser2/blob/master/test/browser_test.rb) and [implementation](https://github.com/dirk/browser2/blob/master/lib/browser.rb) for more examples.
58
+
59
+ ### Integrations
60
+
61
+ Browser comes out-of-the-box with helpers for use in Ruby on Rails applications and Rack servers. See [`doc/rails_and_rack.md`](doc/rails_and_rack.md) for more details.
62
+
63
+ ### What defines a modern browser?
64
+
65
+ The current rules that define a modern browser are pretty loose:
66
+
67
+ * Webkit
68
+ * IE9+
69
+ * Microsoft Edge
70
+ * Firefox 17+
71
+ * Firefox Tablet 14+
72
+ * Opera 12+
73
+
74
+ You can define your own rules. A rule must be a proc/lambda or any object that implements the method === and accepts the browser object. To redefine all rules, clear the existing rules before adding your own.
75
+
76
+ ```ruby
77
+ # Only Chrome Canary is considered modern.
78
+ Browser.modern_rules.clear
79
+ Browser.modern_rules << -> b { b.chrome? && b.version.to_i >= 37 }
80
+ ```
81
+
82
+ ### Internet Explorer
83
+
84
+ Internet Explorer has a compatibility view mode that allows newer versions (IE8+) to run as an older version. Browser will always return the navigator version, ignoring the compatibility view version, when defined. If you need to get the engine's version, you have to use `Browser#msie_version` and `Browser#msie_full_version`.
85
+
86
+ So, let's say an user activates compatibility view in a IE11 browser. This is what you'll get:
87
+
88
+ ```ruby
89
+ browser.version
90
+ #=> 11
91
+
92
+ browser.full_version
93
+ #=> 11.0
94
+
95
+ browser.msie_version
96
+ #=> 7
97
+
98
+ browser.msie_full_version
99
+ #=> 7.0
100
+
101
+ browser.compatibility_view?
102
+ #=> true
103
+
104
+ browser.modern?
105
+ #=> false
106
+ ```
107
+
108
+ This behavior changed in `v1.0.0`; previously there wasn't a way of getting the real browser version.
109
+
110
+ ### Bots
111
+
112
+ Browser used to detect empty user agents as bots, but this behavior has changed. If you want to bring this detection back, you can activate it through the following call:
113
+
114
+ ```ruby
115
+ Browser::Bots.detect_empty_ua!
116
+ ```
117
+
118
+ ## Authors
119
+
120
+ * [Dirk Gadsden](https://dirk.to) (`browser2` maintainer)
121
+ * [Nando Vieira](http://nandovieira.com.br) (original author of `browser`)
122
+
123
+ ## License
124
+
125
+ Licensed under the MIT license. See [LICENSE](LICENSE) for details.
data/Rakefile ADDED
@@ -0,0 +1,33 @@
1
+ require "bundler"
2
+ require "bundler/setup"
3
+ Bundler::GemHelper.install_tasks
4
+
5
+ require "rake/testtask"
6
+
7
+ Rake::TestTask.new(:spec) do |t|
8
+ t.libs << "lib"
9
+ t.libs << "test"
10
+ # t.verbose = true
11
+ t.ruby_opts = %w[-rubygems]
12
+
13
+ t.test_files = FileList["test/**/*_test.rb"]
14
+ .exclude('test/benchmark_test.rb')
15
+ end
16
+
17
+ Rake::TestTask.new('spec:benchmark') do |t|
18
+ t.libs << 'test'
19
+ t.test_files = FileList.new 'test/benchmark_test.rb'
20
+ end
21
+
22
+ desc "Run specs against all gemfiles"
23
+ task "spec:all" do
24
+ %w[
25
+ Gemfile
26
+ gemfiles/rails3.gemfile
27
+ ].each do |gemfile|
28
+ puts "=> Running with Gemfile: #{gemfile}"
29
+ system "BUNDLE_GEMFILE=#{gemfile} rake spec"
30
+ end
31
+ end
32
+
33
+ task :default => "spec"
data/browser2.gemspec ADDED
@@ -0,0 +1,42 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path('../lib', __FILE__)
3
+ require 'browser/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'browser2'
7
+ s.version = Browser::Version::STRING
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ['Dirk Gadsden', 'Nando Vieira']
10
+ s.email = ['dirk@esherido.com', 'fnando.vieira@gmail.com']
11
+ s.homepage = 'http://github.com/dirk/browser2'
12
+ s.summary = 'Optimized browser user agent detection library.'
13
+ s.description = s.summary
14
+ s.license = 'MIT'
15
+
16
+ s.files = `git ls-files`.split "\n"
17
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split "\n"
18
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
19
+ s.require_paths = ['lib']
20
+
21
+ # s.post_install_message = [
22
+ # "",
23
+ # "#################### WARNING ##############################" ,
24
+ # "# #" ,
25
+ # "# Internet Explorer detection has changed on v1.0.0+. #" ,
26
+ # "# If this is important for you, please read #" ,
27
+ # "# https://github.com/fnando/browser#internet-explorer #" ,
28
+ # "# #" ,
29
+ # "###########################################################" ,
30
+ # "\n"
31
+ # ].join("\n")
32
+
33
+ s.add_dependency 'multi_json', '~> 1.11'
34
+
35
+ s.add_development_dependency "bundler", ">= 0"
36
+ s.add_development_dependency "rake"
37
+ s.add_development_dependency "rails"
38
+ s.add_development_dependency "rack-test"
39
+ s.add_development_dependency "minitest"
40
+ s.add_development_dependency "minitest-utils"
41
+ s.add_development_dependency "pry-meta"
42
+ end
data/config.ru ADDED
@@ -0,0 +1,2 @@
1
+ require "./test/sample_app"
2
+ run Rails.application
data/data/bots.json ADDED
@@ -0,0 +1,176 @@
1
+ {
2
+ "360Spider": "360Spider",
3
+ "AddThis": "AddThis",
4
+ "ADmantX": "ADmantX Platform Semantic Analyzer",
5
+ "AdsBot-Google": "Google Adwords",
6
+ "AhrefsBot": "Ahrefs backlinks research tool",
7
+ "alexa": "Alexa Crawler",
8
+ "Apache-HttpClient": "Java http library",
9
+ "ApacheBench": "ApacheBench (ab)",
10
+ "AppEngine-Google": "Google App Engine",
11
+ "Applebot": "Apple Bot",
12
+ "Ask Jeeves": "Ask Jeeves",
13
+ "AsyncHttpClient": "Java http and WebSocket client library",
14
+ "awe.sm": "Awe.sm URL expander",
15
+ "Baidu": "baidu",
16
+ "Baiduspider": "Chinese search engine",
17
+ "bingbot": "Microsoft bing bot",
18
+ "bitlybot": "bit.ly bot",
19
+ "BLEXBot": "webmeup-crawler.com",
20
+ "bot@linkfluence.net": "Linkfluence bot",
21
+ "BuiBui-CheckBot": "email: buibui[at]dadapro[dot]com",
22
+ "Butterfly": "Topsy Labs",
23
+ "buzztalk": "buzztalk",
24
+ "check_http": "Nagios monitor",
25
+ "CMRadar/0.1": "CMRadar/0.1",
26
+ "ColdFusion": "ColdFusion http library",
27
+ "Crowsnest": "crowsnest.tv news portal bot",
28
+ "curl": "curl unix CLI http client",
29
+ "Daumoa": "Korean portal and search engine indexing bot",
30
+ "DAP/NetHTTP": "DAP/NetHTTP",
31
+ "developers.google.com/+/web/snippet/": "Google Plus",
32
+ "DigitalPersona Fingerprint Software": "HP Fingerprint scanner",
33
+ "Domain Re-Animator Bot": "Domain Re-Animator Bot (http://domainreanimator.com) - support@domainreanimator.com",
34
+ "DotBot": "Dot Bot",
35
+ "DuckDuckBot": "Duck Duck Go",
36
+ "Embedly": "Embedly",
37
+ "EOAAgent": "EOAAgent",
38
+ "EventMachine HttpClient": "Ruby http library",
39
+ "EvriNid": "Evri bot",
40
+ "Exabot": "Exalead's bot",
41
+ "ExaleadCloudView": "ExaleadCloudView",
42
+ "facebookexternalhit": "Facebook Bot",
43
+ "Facebot": "Facebook Bot",
44
+ "FeedBurner": "RSS bot",
45
+ "Feedfetcher-Google": "Google Feedfetcher",
46
+ "FlipboardProxy": "FlipboardProxy",
47
+ "Genieo": "Genieo Web filter bot",
48
+ "getprismatic.com": "getprismatic.com",
49
+ "Gigabot": "Gigabot spider",
50
+ "Go http package": "Go http library",
51
+ "Google Web Preview": "Google Instant Previews crawler",
52
+ "Google Page Speed Insights": "Google Page Speed Insights",
53
+ "Googlebot": "Google spider",
54
+ "GrapeshotCrawler": "Mozilla/5.0 (compatible; GrapeshotCrawler/2.0; +http://www.grapeshot.co.uk/crawler.php)",
55
+ "Hatena::Bookmark": "Hatena::Bookmark",
56
+ "heritrix": "heritrix",
57
+ "HTMLParser": "HTMLParser",
58
+ "HTTPClient": "HTTPClient",
59
+ "https://developers.google.com/+/web/snippet": "Google+ Snippet Fetcher",
60
+ "HTTP_Request2": "HTTP_Request2",
61
+ "HubSpot Connect": "HubSpot Connect",
62
+ "ia_archiver(OS-Wayback)": "ia_archiver(OS-Wayback)",
63
+ "iCoreService": "iCoreService",
64
+ "InAGist": "URL resolver",
65
+ "Insieve Bot": "Insieve Bot",
66
+ "InsieveBot": "InsieveBot",
67
+ "Instapaper": "Instapaper",
68
+ "Insitesbot": "Insitesbot",
69
+ "IstellaBot": "IstellaBot",
70
+ "jack": "jack",
71
+ "Jakarta Commons-HttpClient": "Jakarta Commons-HttpClient",
72
+ "Jakarta Commons": "Jakarta Commons HttpClient",
73
+ "Java": "Generic Java http library",
74
+ "Jetslide": "Jetslide",
75
+ "JS-Kit": "URL resolver",
76
+ "Kimengi/nineconnections.com": "Kimengi/nineconnections.com",
77
+ "Kimengi": "nineconnections.com bot",
78
+ "knows.is": "knows.is",
79
+ "kraken": "kraken",
80
+ "Laconica": "Laconica",
81
+ "libwww-perl": "Perl client-server library loved by script kids",
82
+ "linkdexbot": "Linkdex Bot",
83
+ "LinkedInBot": "LinkedIn",
84
+ "LinksCrawler": "LinksCrawler",
85
+ "Linode": "Linode Longview",
86
+ "Lipperhey": "Lipperhey",
87
+ "Livelapbot": "Livelapbot",
88
+ "LoadTimeBot": "Load Time Bot",
89
+ "LongURL": "URL expander service",
90
+ "Lumibot": "Lumibot",
91
+ "lwp-trivial": "Another Perl library loved by script kids",
92
+ "magpie-crawler": "magpie-crawler",
93
+ "Mail.RU_Bot": "Mail.ru Bot",
94
+ "Mediapartners-Google": "Google Adsense bot",
95
+ "MegaIndex.ru": "Mozilla/5.0 (compatible; MegaIndex.ru/2.0; +https://www.megaindex.ru/?tab=linkAnalyze)",
96
+ "MetaURI": "URI meta information extractor bot",
97
+ "MFE_expand": "Mcafee spider",
98
+ "MJ12bot": "Majestic-12 spider",
99
+ "MojeekBot": "Mojeek UK search crawler",
100
+ "msnbot": "Microsoft bot",
101
+ "netState": "netEstate NE Crawler",
102
+ "Netvibes": "Personalized dashboard bot",
103
+ "NewRelicPinger": "NewRelic monitor",
104
+ "newsme": "newsme",
105
+ "NING": "NING - Yet Another Twitter Swarmer",
106
+ "Nutch": "Apache search spider",
107
+ "Panopta": "Monitoring service",
108
+ "PaperLiBot": "PaperLi is another content curation service",
109
+ "peerindex": "peerindex",
110
+ "PercolateCrawler": "PercolateCrawler",
111
+ "PhantomJS": "PhantomJS",
112
+ "Pingdom": "Pingdom monitoring",
113
+ "Pinterest": "Pinterest",
114
+ "publiclibraryarchive.org": "publiclibraryarchive.org",
115
+ "PycURL": "Python http library",
116
+ "Python-httplib2": "Python-httplib2",
117
+ "python-requests": "python-requests",
118
+ "Python-urllib": "Python http library",
119
+ "QuerySeeker": "QuerySeekerSpider ( http://queryseeker.com/bot.html )",
120
+ "QuickLook": "QuickLook",
121
+ "Readability": "Readability",
122
+ "RebelMouse": "RebelMouse",
123
+ "redditbot": "Reddit Bot",
124
+ "RelateIQ": "RelateIQ",
125
+ "Riddler": "Riddler Bot",
126
+ "rogerbot": "SeoMoz spider",
127
+ "Ruby/1.9.3": "Ruby/1.9.3",
128
+ "Ruby": "Ruby",
129
+ "Scrapy": "Scrapy",
130
+ "Screaming Frog SEO Spider": "Screaming Frog SEO Spider",
131
+ "SearchmetricsBot": "SearchmetricsBot",
132
+ "SemrushBot": "SEO analysis bot",
133
+ "SeznamBot": "SeznamBot",
134
+ "ShopWiki": "ShopWiki",
135
+ "ShortLinkTranslate": "Link shortener",
136
+ "ShowyouBot": "Showyou iOS app spider",
137
+ "Siege": "Joe Dog Siege",
138
+ "SiteUptime": "Site monitoring services",
139
+ "Slack": "Slackbot-LinkExpanding",
140
+ "Slurp": "Yahoo spider",
141
+ "Sogou": "Chinese search engine",
142
+ "spider": "generic web spider",
143
+ "Spinn3r": "Spinn3r aggregator",
144
+ "StatusCake": "StatusCake",
145
+ "Test Certificate Info": "C http library?",
146
+ "TinEye": "TinEye-bot/0.51 (see http://www.tineye.com/crawler.html)",
147
+ "trendictionbot": "trendiction search",
148
+ "TurnitinBot": "TurnitinBot",
149
+ "TweetmemeBot": "TweetMeMe Crawler",
150
+ "Twikle": "Social web search bot",
151
+ "TwitJobSearch": "TwitJobSearch",
152
+ "Twitmunin": "Twitmunin",
153
+ "Twitterbot": "Twitter URL expander",
154
+ "Twurly": "Twurly",
155
+ "Typhoeus": "Typhoeus",
156
+ "UnwindFetch": "Gnip URL expander",
157
+ "UnwindFetchor": "Gnip crawler",
158
+ "Vagabondo": "Vagabondo",
159
+ "VB Project": "Visual Basic",
160
+ "vkShare": "VKontake Sharer",
161
+ "VoilaBot": "VoilaBot",
162
+ "Webscout": "Webscout",
163
+ "Wget": "wget unix CLI http client",
164
+ "WordPress": "WordPress spider",
165
+ "Wormly": "WormlyBot",
166
+ "Xenu Link Sleuth": "Xenu Link Sleuth",
167
+ "XoviBot": "XoviBot",
168
+ "YandexBot": "Yandex spider",
169
+ "YandexDirect": "Yandex Direct spider",
170
+ "YandexMetrika": "Yandex Metrika spider",
171
+ "YOURLS": "YOURLS",
172
+ "zelist.ro": "feed parser",
173
+ "ZIBB": "ZIBB spider",
174
+ "ZyBorg": "Zyborg? Hmmm....",
175
+ "StructuredDataTestingTool": "Google-StructuredDataTestingTool"
176
+ }