bitly 2.0.0.beta.1 → 2.0.0.beta.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/History.txt +4 -0
- data/Rakefile +2 -0
- data/bitly.gemspec +16 -7
- data/lib/bitly.rb +7 -4
- data/lib/bitly/api.rb +11 -9
- data/lib/bitly/api/bitlink.rb +5 -4
- data/lib/bitly/api/group.rb +2 -2
- data/lib/bitly/http.rb +8 -4
- data/lib/bitly/http/adapters.rb +9 -0
- data/lib/bitly/version.rb +1 -1
- metadata +16 -25
- data/bin/console +0 -14
- data/bin/oauth +0 -10
- data/bin/setup +0 -8
- data/docs/authentication.md +0 -51
- data/docs/bitlinks.md +0 -2
- data/docs/branded_short_domains.md +0 -20
- data/docs/groups.md +0 -80
- data/docs/oauth_apps.md +0 -20
- data/docs/organizations.md +0 -74
- data/docs/premium_apis.md +0 -0
- data/docs/users.md +0 -1
- data/lib/bitly/client.rb +0 -145
- data/lib/bitly/config.rb +0 -29
- data/lib/bitly/v3/client.rb +0 -207
- data/lib/bitly/v3/user.rb +0 -134
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4936c99089af48f7096225e8f9a320978a52152d7650644099f1c2e79bfdb212
|
4
|
+
data.tar.gz: 246fc9e55eeb72aabcdba418cf7fa9df8b29f02fc5e6079fa0ed32979b6c5c37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 16a268a0383fff569797929ad3fe90bcf46d38897b1aed760bfe878f5e0dd22b7d9ce126e725c59b76a43d5d96fe571e0d46ffab083af008cabc35bf5a05228e
|
7
|
+
data.tar.gz: d1700910090cd61c35438dafb6050f6d3bdaf8dace92b3d790741f13f6a21e5b2b6e7237d3f4575e469c9f501b44a17e48e4f0981a12e5fc8969f83726efafff
|
data/.travis.yml
CHANGED
data/History.txt
CHANGED
data/Rakefile
CHANGED
data/bitly.gemspec
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
3
|
lib = File.expand_path("../lib", __FILE__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
@@ -9,22 +10,30 @@ Gem::Specification.new do |spec|
|
|
9
10
|
spec.authors = ["Phil Nash"]
|
10
11
|
spec.email = ["philnash@gmail.com"]
|
11
12
|
|
12
|
-
spec.summary = %q{Use the
|
13
|
-
spec.description = %q{Use the
|
13
|
+
spec.summary = %q{Use the Bitly API to shorten or expand URLs}
|
14
|
+
spec.description = %q{Use the Bitly API version 4 to shorten or expand URLs. Check out the API documentation at https://dev.bitly.com/.}
|
14
15
|
spec.homepage = "https://github.com/philnash/bitly"
|
15
16
|
spec.license = "MIT"
|
16
17
|
|
18
|
+
spec.metadata = {
|
19
|
+
"bug_tracker_uri" => "https://github.com/philnash/bitly/issues",
|
20
|
+
"changelog_uri" => "https://github.com/philnash/bitly/blob/master/History.txt",
|
21
|
+
"documentation_uri" => "https://www.rubydoc.info/gems/bitly/",
|
22
|
+
"homepage_uri" => "https://github.com/philnash/bitly",
|
23
|
+
"source_code_uri" => "https://github.com/philnash/bitly"
|
24
|
+
}
|
25
|
+
|
17
26
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
18
|
-
f.match(%r{^(test|spec|features)/})
|
27
|
+
f.match(%r{^(test|spec|features|bin|docs)/})
|
19
28
|
end
|
20
|
-
spec.bindir = "exe"
|
21
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
29
|
spec.require_paths = ["lib"]
|
23
30
|
|
24
|
-
spec.
|
31
|
+
spec.required_ruby_version = ">= 2.3.0"
|
32
|
+
|
33
|
+
spec.add_runtime_dependency "oauth2", "< 2.0", ">= 0.5.0"
|
25
34
|
|
26
35
|
spec.add_development_dependency "bundler", "~> 2.0"
|
27
|
-
spec.add_development_dependency "rake", "~>
|
36
|
+
spec.add_development_dependency "rake", "~> 13.0"
|
28
37
|
spec.add_development_dependency "rspec", "~> 3.0"
|
29
38
|
spec.add_development_dependency "simplecov", "~> 0.17.1"
|
30
39
|
spec.add_development_dependency "webmock", "~> 3.7.6"
|
data/lib/bitly.rb
CHANGED
@@ -1,7 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "bitly/version"
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
|
5
|
+
module Bitly
|
6
|
+
autoload :Error, "bitly/error"
|
7
|
+
autoload :OAuth, "bitly/oauth"
|
8
|
+
autoload :HTTP, "bitly/http"
|
9
|
+
autoload :API, "bitly/api"
|
10
|
+
end
|
data/lib/bitly/api.rb
CHANGED
@@ -3,14 +3,16 @@
|
|
3
3
|
module Bitly
|
4
4
|
module API
|
5
5
|
BASE_URL = URI("https://api-ssl.bitly.com/v4")
|
6
|
+
|
7
|
+
autoload :Base, File.join(File.dirname(__FILE__), "api/base.rb")
|
8
|
+
autoload :Client, File.join(File.dirname(__FILE__), "api/client.rb")
|
9
|
+
autoload :ClickMetric, File.join(File.dirname(__FILE__), "api/click_metric.rb")
|
10
|
+
autoload :Bitlink, File.join(File.dirname(__FILE__), "api/bitlink.rb")
|
11
|
+
autoload :Organization, File.join(File.dirname(__FILE__), "api/organization.rb")
|
12
|
+
autoload :Group, File.join(File.dirname(__FILE__), "api/group.rb")
|
13
|
+
autoload :User, File.join(File.dirname(__FILE__), "api/user.rb")
|
14
|
+
autoload :BSD, File.join(File.dirname(__FILE__), "api/bsd.rb")
|
15
|
+
autoload :OAuthApp, File.join(File.dirname(__FILE__), "api/oauth_app.rb")
|
16
|
+
autoload :ShortenCounts, File.join(File.dirname(__FILE__), "api/shorten_counts.rb")
|
6
17
|
end
|
7
18
|
end
|
8
|
-
|
9
|
-
require_relative "./api/client"
|
10
|
-
require_relative "./api/click_metric"
|
11
|
-
require_relative "./api/bitlink"
|
12
|
-
require_relative "./api/organization"
|
13
|
-
require_relative "./api/group"
|
14
|
-
require_relative "./api/user"
|
15
|
-
require_relative "./api/bsd"
|
16
|
-
require_relative "./api/oauth_app"
|
data/lib/bitly/api/bitlink.rb
CHANGED
@@ -1,16 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require_relative "./base"
|
3
3
|
require_relative "./list"
|
4
|
-
require_relative "./bitlink/paginated_list"
|
5
|
-
require_relative "./bitlink/deeplink"
|
6
|
-
require_relative "./bitlink/clicks_summary"
|
7
|
-
require_relative "./bitlink/link_click"
|
8
4
|
|
9
5
|
module Bitly
|
10
6
|
module API
|
11
7
|
##
|
12
8
|
# A Bitlink represents a shortened link within Bitly.
|
13
9
|
class Bitlink
|
10
|
+
autoload :PaginatedList, File.join(File.dirname(__FILE__), "bitlink/paginated_list.rb")
|
11
|
+
autoload :Deeplink, File.join(File.dirname(__FILE__), "bitlink/deeplink.rb")
|
12
|
+
autoload :ClicksSummary, File.join(File.dirname(__FILE__), "bitlink/clicks_summary.rb")
|
13
|
+
autoload :LinkClick, File.join(File.dirname(__FILE__), "bitlink/link_click.rb")
|
14
|
+
|
14
15
|
include Base
|
15
16
|
|
16
17
|
class List < Bitly::API::List ; end
|
data/lib/bitly/api/group.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require_relative "./base"
|
3
3
|
require_relative "./list"
|
4
|
-
require_relative "./group/preferences"
|
5
|
-
require_relative "./shorten_counts"
|
6
4
|
|
7
5
|
module Bitly
|
8
6
|
module API
|
@@ -11,6 +9,8 @@ module Bitly
|
|
11
9
|
# taken on behalf of a user and group and groups become a container for
|
12
10
|
# Bitlinks and metrics.
|
13
11
|
class Group
|
12
|
+
autoload :Preferences, File.join(File.dirname(__FILE__), "group/preferences.rb")
|
13
|
+
|
14
14
|
include Base
|
15
15
|
|
16
16
|
##
|
data/lib/bitly/http.rb
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
module Bitly
|
4
|
+
module HTTP
|
5
|
+
autoload :Adapters, File.join(File.dirname(__FILE__), "http/adapters.rb")
|
6
|
+
autoload :Response, File.join(File.dirname(__FILE__), "http/response.rb")
|
7
|
+
autoload :Request, File.join(File.dirname(__FILE__), "http/request.rb")
|
8
|
+
autoload :Client, File.join(File.dirname(__FILE__), "http/client.rb")
|
9
|
+
end
|
10
|
+
end
|
data/lib/bitly/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bitly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.0.beta.
|
4
|
+
version: 2.0.0.beta.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Phil Nash
|
8
8
|
autorequire:
|
9
|
-
bindir:
|
9
|
+
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-02
|
11
|
+
date: 2020-03-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oauth2
|
@@ -50,14 +50,14 @@ dependencies:
|
|
50
50
|
requirements:
|
51
51
|
- - "~>"
|
52
52
|
- !ruby/object:Gem::Version
|
53
|
-
version: '
|
53
|
+
version: '13.0'
|
54
54
|
type: :development
|
55
55
|
prerelease: false
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
57
|
requirements:
|
58
58
|
- - "~>"
|
59
59
|
- !ruby/object:Gem::Version
|
60
|
-
version: '
|
60
|
+
version: '13.0'
|
61
61
|
- !ruby/object:Gem::Dependency
|
62
62
|
name: rspec
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
@@ -128,8 +128,8 @@ dependencies:
|
|
128
128
|
- - ">="
|
129
129
|
- !ruby/object:Gem::Version
|
130
130
|
version: '0'
|
131
|
-
description: Use the
|
132
|
-
at https://dev.bitly.com/.
|
131
|
+
description: Use the Bitly API version 4 to shorten or expand URLs. Check out the
|
132
|
+
API documentation at https://dev.bitly.com/.
|
133
133
|
email:
|
134
134
|
- philnash@gmail.com
|
135
135
|
executables: []
|
@@ -145,19 +145,8 @@ files:
|
|
145
145
|
- LICENSE.md
|
146
146
|
- README.md
|
147
147
|
- Rakefile
|
148
|
-
- bin/console
|
149
|
-
- bin/oauth
|
150
|
-
- bin/setup
|
151
148
|
- bitly.gemspec
|
152
149
|
- config/env.yml.example
|
153
|
-
- docs/authentication.md
|
154
|
-
- docs/bitlinks.md
|
155
|
-
- docs/branded_short_domains.md
|
156
|
-
- docs/groups.md
|
157
|
-
- docs/oauth_apps.md
|
158
|
-
- docs/organizations.md
|
159
|
-
- docs/premium_apis.md
|
160
|
-
- docs/users.md
|
161
150
|
- lib/bitly.rb
|
162
151
|
- lib/bitly/api.rb
|
163
152
|
- lib/bitly/api/base.rb
|
@@ -176,22 +165,24 @@ files:
|
|
176
165
|
- lib/bitly/api/organization.rb
|
177
166
|
- lib/bitly/api/shorten_counts.rb
|
178
167
|
- lib/bitly/api/user.rb
|
179
|
-
- lib/bitly/client.rb
|
180
|
-
- lib/bitly/config.rb
|
181
168
|
- lib/bitly/error.rb
|
182
169
|
- lib/bitly/http.rb
|
170
|
+
- lib/bitly/http/adapters.rb
|
183
171
|
- lib/bitly/http/adapters/net_http.rb
|
184
172
|
- lib/bitly/http/client.rb
|
185
173
|
- lib/bitly/http/request.rb
|
186
174
|
- lib/bitly/http/response.rb
|
187
175
|
- lib/bitly/oauth.rb
|
188
|
-
- lib/bitly/v3/client.rb
|
189
|
-
- lib/bitly/v3/user.rb
|
190
176
|
- lib/bitly/version.rb
|
191
177
|
homepage: https://github.com/philnash/bitly
|
192
178
|
licenses:
|
193
179
|
- MIT
|
194
|
-
metadata:
|
180
|
+
metadata:
|
181
|
+
bug_tracker_uri: https://github.com/philnash/bitly/issues
|
182
|
+
changelog_uri: https://github.com/philnash/bitly/blob/master/History.txt
|
183
|
+
documentation_uri: https://www.rubydoc.info/gems/bitly/
|
184
|
+
homepage_uri: https://github.com/philnash/bitly
|
185
|
+
source_code_uri: https://github.com/philnash/bitly
|
195
186
|
post_install_message:
|
196
187
|
rdoc_options: []
|
197
188
|
require_paths:
|
@@ -200,7 +191,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
200
191
|
requirements:
|
201
192
|
- - ">="
|
202
193
|
- !ruby/object:Gem::Version
|
203
|
-
version:
|
194
|
+
version: 2.3.0
|
204
195
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
205
196
|
requirements:
|
206
197
|
- - ">"
|
@@ -210,5 +201,5 @@ requirements: []
|
|
210
201
|
rubygems_version: 3.0.3
|
211
202
|
signing_key:
|
212
203
|
specification_version: 4
|
213
|
-
summary: Use the
|
204
|
+
summary: Use the Bitly API to shorten or expand URLs
|
214
205
|
test_files: []
|
data/bin/console
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/setup"
|
4
|
-
require "bitly"
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start(__FILE__)
|
data/bin/oauth
DELETED
@@ -1,10 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/setup"
|
4
|
-
require "bitly"
|
5
|
-
require "envyable"
|
6
|
-
|
7
|
-
Envyable.load('./config/env.yml')
|
8
|
-
|
9
|
-
oauth = Bitly::OAuth.new(client_id: ENV['CLIENT_ID'], client_secret: ENV['CLIENT_SECRET'])
|
10
|
-
puts oauth.authorize_uri('http://example.com/oauth/redirect')
|
data/bin/setup
DELETED
data/docs/authentication.md
DELETED
@@ -1,51 +0,0 @@
|
|
1
|
-
# Authentication
|
2
|
-
|
3
|
-
Bitly requires OAuth access tokens to use the API. You will need to [register your application with the Bitly API](bitly.com/a/oauth_apps), you will get a `client_id` and `client_secret`.
|
4
|
-
|
5
|
-
There are 3 methods you can use to get an OAuth access token:
|
6
|
-
|
7
|
-
- [Account Generic Access Token](#account-generic-access-token)
|
8
|
-
- [OAuth Web Flow](#oauth-web-flow)
|
9
|
-
- [Resource Owner Credential Grant Flow](#resource-owner-credential-grant-flow)
|
10
|
-
|
11
|
-
## Account Generic Access Token
|
12
|
-
|
13
|
-
You can get your own OAuth token for your account from the [Bitly console](https://app.bitly.com/). Click on the account drop down menu, then _Profile Settings_ then _Generic Access Token_. Fill in your password and you can generate an OAuth access token.
|
14
|
-
|
15
|
-
## OAuth Web Flow
|
16
|
-
|
17
|
-
Redirect the user to the Bitly authorization page using your `client_id` and a `redirect_uri` that Bitly should redirect your user to after authorization. You can get the URL like so:
|
18
|
-
|
19
|
-
```ruby
|
20
|
-
oauth = Bitly::OAuth.new(client_id: client_id, client_secret: client_secret)
|
21
|
-
oauth.authorize_uri("http://myexamplewebapp.com/oauth_page")
|
22
|
-
#=> "https://bitly.com/oauth/authorize?client_id=client_id&redirect_uri=http%3A%2F%2Fmyexamplewebapp.com%2Foauth_page"
|
23
|
-
```
|
24
|
-
|
25
|
-
You can pass an optional `state` parameter that will be included, unchanged, in the redirect.
|
26
|
-
|
27
|
-
```ruby
|
28
|
-
oauth.authorize_uri("http://myexamplewebapp.com/oauth_page", state: "state")
|
29
|
-
#=> "https://bitly.com/oauth/authorize?client_id=client_id&redirect_uri=http%3A%2F%2Fmyexamplewebapp.com%2Foauth_page&state=state"
|
30
|
-
```
|
31
|
-
|
32
|
-
Once the user has authorized you to use their Bitly account, you will get a
|
33
|
-
`code` parameter in the redirect. You can exchange that code, along with the
|
34
|
-
redirect_uri, for the access token.
|
35
|
-
|
36
|
-
```ruby
|
37
|
-
oauth.access_token(redirect_uri: "http://myexamplewebapp.com/oauth_page", code: "code")
|
38
|
-
#=> "<ACCESS_TOKEN>"
|
39
|
-
```
|
40
|
-
|
41
|
-
## Resource Owner Credential Grant Flow
|
42
|
-
|
43
|
-
If you cannot perform a web flow, the resource owner credential grant flow allows you to take a user's username and password and exchange it for an OAuth access token. If you use this method you _should_ store only the user's access token and never the password.
|
44
|
-
|
45
|
-
To use the resource owner credential grant flow, create an OAuth client object then request the access token with the username and password:
|
46
|
-
|
47
|
-
```ruby
|
48
|
-
oauth = Bitly::OAuth.new(client_id: client_id, client_secret: client_secret)
|
49
|
-
oauth.access_token(username: username, password: password)
|
50
|
-
#=> "<ACCESS_TOKEN>"
|
51
|
-
```
|
data/docs/bitlinks.md
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
# Branded Short Domains
|
2
|
-
|
3
|
-
BSDs is an acronym for branded short domains. A branded short domain is a custom 15 character or less domain for bitlinks. This allows you to customize the domain to your brand.
|
4
|
-
|
5
|
-
See the full [Bitly API documentation for BSDs](https://dev.bitly.com/v4/#tag/BSDs).
|
6
|
-
|
7
|
-
## List BSDs
|
8
|
-
|
9
|
-
With an API client you can list the BSDs available to the authorized user.
|
10
|
-
|
11
|
-
```ruby
|
12
|
-
client = Bitly::API::Client.new(token: token)
|
13
|
-
bsds = client.bsds
|
14
|
-
```
|
15
|
-
|
16
|
-
Or with the class method
|
17
|
-
|
18
|
-
```ruby
|
19
|
-
bsds = Bitly::API::BSD.list(client: client)
|
20
|
-
```
|
data/docs/groups.md
DELETED
@@ -1,80 +0,0 @@
|
|
1
|
-
# Groups
|
2
|
-
|
3
|
-
Groups are a subdivision within an [organization](./organizations.md). A [user](./users.md) belongs to a group within an organization. Most actions in the API are on behalf of a group. For example, when you shorten a link, it will be on behalf of a user and a group.
|
4
|
-
|
5
|
-
See the full [Bitly API documentation for Groups](https://dev.bitly.com/v4/#tag/Groups).
|
6
|
-
|
7
|
-
## List Groups
|
8
|
-
|
9
|
-
With an API client you can list the groups available to the authorized user.
|
10
|
-
|
11
|
-
```ruby
|
12
|
-
client = Bitly::API::Client.new(token: token)
|
13
|
-
groups = client.groups
|
14
|
-
```
|
15
|
-
|
16
|
-
Or with the class method
|
17
|
-
|
18
|
-
```ruby
|
19
|
-
groups = Bitly::API::Group.list(client: client)
|
20
|
-
```
|
21
|
-
|
22
|
-
You can also filter groups by an organization guid or an organization object, using the client.
|
23
|
-
|
24
|
-
```ruby
|
25
|
-
groups = client.groups(organization: organization_guid)
|
26
|
-
groups = client.groups(organization: organization)
|
27
|
-
```
|
28
|
-
|
29
|
-
Or the class method
|
30
|
-
|
31
|
-
```ruby
|
32
|
-
groups = Bitly::API::Group.list(client: client, organization: organization_guid)
|
33
|
-
groups = Bitly::API::Group.list(client: client, organization: organization)
|
34
|
-
```
|
35
|
-
|
36
|
-
## Fetch a Group
|
37
|
-
|
38
|
-
If you have the guid of an group, you can fetch it directly.
|
39
|
-
|
40
|
-
```ruby
|
41
|
-
group = client.group(guid)
|
42
|
-
```
|
43
|
-
|
44
|
-
Or with the class method
|
45
|
-
|
46
|
-
```ruby
|
47
|
-
group = Bitly::API::Group.fetch(client: client, guid: guid)
|
48
|
-
```
|
49
|
-
|
50
|
-
## Group attributes
|
51
|
-
|
52
|
-
Groups have the following attributes:
|
53
|
-
|
54
|
-
* `name`
|
55
|
-
* `guid`
|
56
|
-
* `is_active`
|
57
|
-
* `role`
|
58
|
-
* `bsds`
|
59
|
-
* `organization_guid`
|
60
|
-
* `created`
|
61
|
-
* `modified`
|
62
|
-
|
63
|
-
### A Group's organization
|
64
|
-
|
65
|
-
With the `organization_guid` we can get the group's organization directly from the group object.
|
66
|
-
|
67
|
-
```ruby
|
68
|
-
organization = group.organization
|
69
|
-
```
|
70
|
-
|
71
|
-
### Group preferences
|
72
|
-
|
73
|
-
You can set one preference for a group, the domain that is used to shorten links. Free accounts can only choose `bit.ly` and pro accounts can use any domains they have set up.
|
74
|
-
|
75
|
-
```ruby
|
76
|
-
preferences = group.preferences
|
77
|
-
puts preferences.domain_preference
|
78
|
-
|
79
|
-
preferences.update(domain_preference: 'bit.ly')
|
80
|
-
```
|
data/docs/oauth_apps.md
DELETED
@@ -1,20 +0,0 @@
|
|
1
|
-
# OAuth Apps
|
2
|
-
|
3
|
-
You can fetch the details of an OAuth app you have in your account by the `client_id`.
|
4
|
-
|
5
|
-
See the full [Bitly documentation for OAuth apps](https://dev.bitly.com/v4/#operation/getOAuthApp)
|
6
|
-
|
7
|
-
## Fetch an OAuth app
|
8
|
-
|
9
|
-
With the `client_id` of an OAuth app, you can fetch it directly.
|
10
|
-
|
11
|
-
```ruby
|
12
|
-
client = Bitly::API::Client.new(token: token)
|
13
|
-
oauth_app = client.oauth_app(client_id: client_id)
|
14
|
-
```
|
15
|
-
|
16
|
-
Or with the class method
|
17
|
-
|
18
|
-
```ruby
|
19
|
-
oauth_app = Bitly::API::OAuthApp.fetch(client: client, client_id: client_id)
|
20
|
-
```
|
data/docs/organizations.md
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
# Organizations
|
2
|
-
|
3
|
-
An organization is the top level of the Bitly user hierarchy. Both [Users](./users.md) and [Groups](./groups.md) live within an organization.
|
4
|
-
|
5
|
-
See the full [Bitly API documentation for Organizations](https://dev.bitly.com/v4/#tag/Organizations).
|
6
|
-
|
7
|
-
## List Organizations
|
8
|
-
|
9
|
-
With an API client you can list the organizations available to the authorized user.
|
10
|
-
|
11
|
-
```ruby
|
12
|
-
client = Bitly::API::Client.new(token: token)
|
13
|
-
organizations = client.organizations
|
14
|
-
```
|
15
|
-
|
16
|
-
Or with the class method:
|
17
|
-
|
18
|
-
```ruby
|
19
|
-
organizations = Bitly::API::Organization.list(client: client)
|
20
|
-
```
|
21
|
-
|
22
|
-
## Fetch an Organization
|
23
|
-
|
24
|
-
If you have the guid of an organization, you can fetch it directly.
|
25
|
-
|
26
|
-
```ruby
|
27
|
-
client = Bitly::API::Client.new(token: token)
|
28
|
-
organization = client.organization(guid)
|
29
|
-
```
|
30
|
-
|
31
|
-
Or with the class method
|
32
|
-
|
33
|
-
```ruby
|
34
|
-
organization = Bitly::API::Organization.fetch(client: client, organization_guid: guid)
|
35
|
-
```
|
36
|
-
|
37
|
-
## Organization attributes
|
38
|
-
|
39
|
-
Organizations have the following attributes:
|
40
|
-
|
41
|
-
* `name`
|
42
|
-
* `guid`
|
43
|
-
* `is_active`
|
44
|
-
* `tier`
|
45
|
-
* `tier_family`
|
46
|
-
* `tier_display_name`
|
47
|
-
* `role`
|
48
|
-
* `bsds`
|
49
|
-
* `created`
|
50
|
-
* `modified`
|
51
|
-
|
52
|
-
### Organization groups
|
53
|
-
|
54
|
-
With an organization you can fetch its related [groups](./groups.md).
|
55
|
-
|
56
|
-
```ruby
|
57
|
-
client = Bitly::API::Client.new(token: token)
|
58
|
-
organization = client.organization(guid)
|
59
|
-
groups = organization.groups
|
60
|
-
```
|
61
|
-
|
62
|
-
This is the same as fetching groups and filtering by an organization guid.
|
63
|
-
|
64
|
-
```ruby
|
65
|
-
client = Bitly::API::Client.new(token: token)
|
66
|
-
organization = client.organization(guid)
|
67
|
-
groups = client.groups(organization: organization)
|
68
|
-
```
|
69
|
-
|
70
|
-
Or filtering in the class method directly.
|
71
|
-
|
72
|
-
```ruby
|
73
|
-
groups = Bitly::API::Group.list(client: client, organization: organization)
|
74
|
-
```
|
data/docs/premium_apis.md
DELETED
File without changes
|
data/docs/users.md
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
# Users
|
data/lib/bitly/client.rb
DELETED
@@ -1,145 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'net/http'
|
3
|
-
require 'uri'
|
4
|
-
|
5
|
-
module Bitly
|
6
|
-
extend Config
|
7
|
-
API_URL = 'https://api-ssl.bitly.com/'
|
8
|
-
API_VERSION = '2.0.1'
|
9
|
-
|
10
|
-
def self.new(login, api_key = nil, timeout=nil)
|
11
|
-
if api_version == 3
|
12
|
-
Bitly::V3::Client.new(login, api_key, timeout)
|
13
|
-
else
|
14
|
-
Bitly::Client.new(login,api_key)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.use_api_version_3
|
19
|
-
self.api_version = 3
|
20
|
-
end
|
21
|
-
|
22
|
-
def self.use_api_version_2
|
23
|
-
self.api_version = 2
|
24
|
-
end
|
25
|
-
|
26
|
-
# get and initialize a client if configured using Config
|
27
|
-
def self.client
|
28
|
-
# api_verison, login, and api_key are set in Config
|
29
|
-
if api_version == 3
|
30
|
-
Bitly::V3::Client.new(login, api_key, timeout)
|
31
|
-
else
|
32
|
-
Bitly::Client.new(login, api_key)
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
class Client
|
37
|
-
|
38
|
-
include Bitly::Utils
|
39
|
-
attr_accessor(*Config::OPTION_KEYS)
|
40
|
-
|
41
|
-
def initialize(login,api_key)
|
42
|
-
warn "[DEPRECATION] The bit.ly version 2 API has been superseded by version 3 and will be removed. See the README for details"
|
43
|
-
@login = login
|
44
|
-
@api_key = api_key
|
45
|
-
end
|
46
|
-
|
47
|
-
def shorten(input, opts={})
|
48
|
-
if input.is_a? String
|
49
|
-
request = create_url("shorten", :longUrl => input, :history => (opts[:history] ? 1 : nil))
|
50
|
-
result = get_result(request)
|
51
|
-
result = {:long_url => input}.merge result[input]
|
52
|
-
Bitly::Url.new(@login,@api_key,result)
|
53
|
-
elsif input.is_a? Array
|
54
|
-
request = create_url("shorten", :history => (opts[:history] ? 1 : nil))
|
55
|
-
request.query << "&" + input.map { |long_url| "longUrl=#{CGI.escape(long_url)}" }.join("&") unless input.nil?
|
56
|
-
result = get_result(request)
|
57
|
-
input.map do |long_url|
|
58
|
-
new_url = {:long_url => long_url}.merge result[long_url]
|
59
|
-
long_url = Bitly::Url.new(@login,@api_key,new_url)
|
60
|
-
end
|
61
|
-
else
|
62
|
-
raise ArgumentError.new("Shorten requires either a url or an array of urls")
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
def expand(input)
|
67
|
-
if input.is_a? String
|
68
|
-
if input.include?('bit.ly/') || input.include?('j.mp/')
|
69
|
-
hash = create_hash_from_url(input)
|
70
|
-
request = create_url "expand", :hash => hash
|
71
|
-
result = get_result(request)
|
72
|
-
result = { :short_url => input, :hash => hash }.merge result[hash]
|
73
|
-
else
|
74
|
-
request = create_url "expand", :hash => input
|
75
|
-
result = get_result(request)
|
76
|
-
result = { :hash => input, :short_url => "http://bit.ly/#{input}" }.merge result[input]
|
77
|
-
end
|
78
|
-
Bitly::Url.new(@login,@api_key,result)
|
79
|
-
elsif input.is_a? Array
|
80
|
-
request = create_url "expand", :hash => input.join(',')
|
81
|
-
result = get_result(request)
|
82
|
-
input.map do |hsh|
|
83
|
-
new_url = {:hash => hsh, :short_url => "http://bit.ly/#{hsh}"}.merge result[hsh]
|
84
|
-
hsh = Bitly::Url.new(@login,@api_key,new_url)
|
85
|
-
end
|
86
|
-
else
|
87
|
-
raise ArgumentError('Expand requires either a short url, a hash or an array of hashes')
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def info(input)
|
92
|
-
if input.is_a? String
|
93
|
-
if input.include? "bit.ly/"
|
94
|
-
hash = create_hash_from_url(input)
|
95
|
-
request = create_url 'info', :hash => hash
|
96
|
-
result = get_result(request)
|
97
|
-
result = { :short_url => "http://bit.ly/#{hash}", :hash => hash }.merge result[hash]
|
98
|
-
else
|
99
|
-
request = create_url 'info', :hash => input
|
100
|
-
result = get_result(request)
|
101
|
-
result = { :short_url => "http://bit.ly/#{input}", :hash => input }.merge result[input]
|
102
|
-
end
|
103
|
-
Bitly::Url.new(@login,@api_key,result)
|
104
|
-
elsif input.is_a? Array
|
105
|
-
request = create_url "info", :hash => input.join(',')
|
106
|
-
result = get_result(request)
|
107
|
-
input.map do |hsh|
|
108
|
-
new_url = {:hash => hsh, :short_url => "http://bit.ly/#{hsh}"}.merge result[hsh]
|
109
|
-
hsh = Bitly::Url.new(@login,@api_key,:info => new_url)
|
110
|
-
end
|
111
|
-
else
|
112
|
-
raise ArgumentError.new('Info requires either a short url, a hash or an array of hashes')
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
116
|
-
def stats(input)
|
117
|
-
if input.is_a? String
|
118
|
-
if input.include? "bit.ly/"
|
119
|
-
hash = create_hash_from_url(input)
|
120
|
-
request = create_url 'stats', :hash => hash
|
121
|
-
result = get_result(request)
|
122
|
-
result = { :short_url => "http://bit.ly/#{hash}", :hash => hash }.merge result
|
123
|
-
else
|
124
|
-
request = create_url 'stats', :hash => input
|
125
|
-
result = get_result(request)
|
126
|
-
result = { :short_url => "http://bit.ly/#{input}", :hash => input }.merge result
|
127
|
-
end
|
128
|
-
Bitly::Url.new(@login,@api_key,:stats => result)
|
129
|
-
else
|
130
|
-
raise ArgumentError.new("Stats requires either a short url or a hash")
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
end
|
135
|
-
|
136
|
-
end
|
137
|
-
|
138
|
-
class BitlyError < StandardError
|
139
|
-
attr_reader :code
|
140
|
-
alias :msg :message
|
141
|
-
def initialize(msg, code)
|
142
|
-
@code = code
|
143
|
-
super("#{msg} - '#{code}'")
|
144
|
-
end
|
145
|
-
end
|
data/lib/bitly/config.rb
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
module Bitly
|
2
|
-
module Config
|
3
|
-
|
4
|
-
# bitly client options
|
5
|
-
OPTION_KEYS = [
|
6
|
-
:login,
|
7
|
-
:api_key,
|
8
|
-
:api_version,
|
9
|
-
:timeout
|
10
|
-
]
|
11
|
-
|
12
|
-
attr_accessor(*OPTION_KEYS)
|
13
|
-
|
14
|
-
alias_method :access_token, :login
|
15
|
-
alias_method :access_token=, :login=
|
16
|
-
|
17
|
-
def configure
|
18
|
-
yield self
|
19
|
-
self
|
20
|
-
end
|
21
|
-
|
22
|
-
def options
|
23
|
-
options = {}
|
24
|
-
OPTION_KEYS.each{|key| options[key] = send(key)}
|
25
|
-
options
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|
29
|
-
end
|
data/lib/bitly/v3/client.rb
DELETED
@@ -1,207 +0,0 @@
|
|
1
|
-
module Bitly
|
2
|
-
module V3
|
3
|
-
# The client is the main part of this gem. You need to initialize the client with your
|
4
|
-
# username and API key and then you will be able to use the client to perform
|
5
|
-
# all the rest of the actions available through the API.
|
6
|
-
class Client
|
7
|
-
include HTTParty
|
8
|
-
base_uri 'https://api-ssl.bitly.com/v3/'
|
9
|
-
|
10
|
-
# Requires a generic OAuth2 access token or -deprecated- login and api key.
|
11
|
-
# http://dev.bitly.com/authentication.html#apikey
|
12
|
-
# Generic OAuth2 access token: https://bitly.com/a/oauth_apps
|
13
|
-
# ApiKey: Get yours from your account page at https://bitly.com/a/your_api_key
|
14
|
-
# Visit your account at http://bit.ly/a/account
|
15
|
-
def initialize(*args)
|
16
|
-
args.compact!
|
17
|
-
self.timeout = args.last.is_a?(0.class) ? args.pop : nil
|
18
|
-
if args.count == 1
|
19
|
-
# Set generic OAuth2 access token
|
20
|
-
@default_query_opts = { :access_token => args.first }
|
21
|
-
else
|
22
|
-
# Deprecated ApiKey authentication
|
23
|
-
@default_query_opts = {
|
24
|
-
:login => args[0],
|
25
|
-
:apiKey => args[1]
|
26
|
-
}
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# Validates a login and api key
|
31
|
-
def validate(x_login, x_api_key)
|
32
|
-
response = get('/validate', :query => { :x_login => x_login, :x_apiKey => x_api_key })
|
33
|
-
return response['data']['valid'] == 1
|
34
|
-
end
|
35
|
-
alias :valid? :validate
|
36
|
-
|
37
|
-
# Checks whether a domain is a bitly.Pro domain
|
38
|
-
def bitly_pro_domain(domain)
|
39
|
-
response = get('/bitly_pro_domain', :query => { :domain => domain })
|
40
|
-
return response['data']['bitly_pro_domain']
|
41
|
-
end
|
42
|
-
alias :pro? :bitly_pro_domain
|
43
|
-
|
44
|
-
# Shortens a long url
|
45
|
-
#
|
46
|
-
# Options can be:
|
47
|
-
#
|
48
|
-
# [domain] choose bit.ly or j.mp (bit.ly is default)
|
49
|
-
#
|
50
|
-
# [x_login and x_apiKey] add this link to another user's history (both required)
|
51
|
-
#
|
52
|
-
def shorten(long_url, opts={})
|
53
|
-
query = { :longUrl => long_url }.merge(opts)
|
54
|
-
response = get('/shorten', :query => query)
|
55
|
-
return Bitly::V3::Url.new(self, response['data'])
|
56
|
-
end
|
57
|
-
|
58
|
-
# Expands either a hash, short url or array of either.
|
59
|
-
#
|
60
|
-
# Returns the results in the order they were entered
|
61
|
-
def expand(input)
|
62
|
-
get_method(:expand, input)
|
63
|
-
end
|
64
|
-
|
65
|
-
# Expands either a hash, short url or array of either and gets click data too.
|
66
|
-
#
|
67
|
-
# Returns the results in the order they were entered
|
68
|
-
def clicks(input)
|
69
|
-
get_method(:clicks, input)
|
70
|
-
end
|
71
|
-
|
72
|
-
# Like expand, but gets the title of the page and who created it
|
73
|
-
def info(input)
|
74
|
-
get_method(:info, input)
|
75
|
-
end
|
76
|
-
|
77
|
-
# Looks up the short url and global hash of a url or array of urls
|
78
|
-
#
|
79
|
-
# Returns the results in the order they were entered
|
80
|
-
def lookup(input)
|
81
|
-
input = arrayize(input)
|
82
|
-
query = input.inject([]) { |q, i| q << "url=#{CGI.escape(i)}" }
|
83
|
-
query = "/lookup?" + query.join('&')
|
84
|
-
response = get(query)
|
85
|
-
results = response['data']['lookup'].inject([]) do |rs, url|
|
86
|
-
url['long_url'] = url['url']
|
87
|
-
url['url'] = nil
|
88
|
-
if url['error'].nil?
|
89
|
-
# builds the results array in the same order as the input
|
90
|
-
rs[input.index(url['long_url'])] = Bitly::V3::Url.new(self, url)
|
91
|
-
# remove the key from the original array, in case the same hash/url was entered twice
|
92
|
-
input[input.index(url['long_url'])] = nil
|
93
|
-
else
|
94
|
-
rs[input.index(url['long_url'])] = Bitly::V3::MissingUrl.new(url)
|
95
|
-
input[input.index(url['long_url'])] = nil
|
96
|
-
end
|
97
|
-
rs
|
98
|
-
end
|
99
|
-
return results.length > 1 ? results : results[0]
|
100
|
-
end
|
101
|
-
|
102
|
-
# Expands either a short link or hash and gets the referrer data for that link
|
103
|
-
#
|
104
|
-
# This method does not take an array as an input
|
105
|
-
def referrers(input)
|
106
|
-
get_single_method('referrers', input)
|
107
|
-
end
|
108
|
-
|
109
|
-
# Expands either a short link or hash and gets the country data for that link
|
110
|
-
#
|
111
|
-
# This method does not take an array as an input
|
112
|
-
def countries(input)
|
113
|
-
get_single_method('countries', input)
|
114
|
-
end
|
115
|
-
|
116
|
-
# Takes a short url, hash or array of either and gets the clicks by minute of each of the last hour
|
117
|
-
def clicks_by_minute(input)
|
118
|
-
get_method(:clicks_by_minute, input)
|
119
|
-
end
|
120
|
-
|
121
|
-
# Takes a short url, hash or array of either and gets the clicks by day
|
122
|
-
def clicks_by_day(input, opts={})
|
123
|
-
opts.reject! { |k, v| k.to_s != 'days' }
|
124
|
-
get_method(:clicks_by_day, input, opts)
|
125
|
-
end
|
126
|
-
|
127
|
-
def timeout=(timeout=nil)
|
128
|
-
self.class.default_timeout(timeout) if timeout
|
129
|
-
end
|
130
|
-
|
131
|
-
private
|
132
|
-
|
133
|
-
def arrayize(arg)
|
134
|
-
if arg.is_a?(String)
|
135
|
-
[arg]
|
136
|
-
else
|
137
|
-
arg.dup
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
def get(method, opts={})
|
142
|
-
opts[:query] ||= {}
|
143
|
-
opts[:query].merge!(@default_query_opts)
|
144
|
-
|
145
|
-
begin
|
146
|
-
response = self.class.get(method, opts)
|
147
|
-
rescue Timeout::Error
|
148
|
-
raise BitlyTimeout.new("Bitly didn't respond in time", "504")
|
149
|
-
end
|
150
|
-
|
151
|
-
if response['status_code'] == 200
|
152
|
-
return response
|
153
|
-
else
|
154
|
-
raise BitlyError.new(response['status_txt'], response['status_code'])
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
def is_a_short_url?(input)
|
159
|
-
input.match(/^https?:\/\//)
|
160
|
-
end
|
161
|
-
|
162
|
-
def get_single_method(method, input)
|
163
|
-
raise ArgumentError.new("This method only takes a hash or url input") unless input.is_a? String
|
164
|
-
if is_a_short_url?(input)
|
165
|
-
query = "shortUrl=#{CGI.escape(input)}"
|
166
|
-
else
|
167
|
-
query = "hash=#{CGI.escape(input)}"
|
168
|
-
end
|
169
|
-
query = "/#{method}?" + query
|
170
|
-
response = get(query)
|
171
|
-
return Bitly::V3::Url.new(self,response['data'])
|
172
|
-
end
|
173
|
-
|
174
|
-
def get_method(method, input, opts={})
|
175
|
-
input = arrayize(input)
|
176
|
-
query = input.inject([]) do |q, i|
|
177
|
-
if is_a_short_url?(i)
|
178
|
-
q << "shortUrl=#{CGI.escape(i)}"
|
179
|
-
else
|
180
|
-
q << "hash=#{CGI.escape(i)}"
|
181
|
-
end
|
182
|
-
end
|
183
|
-
query = opts.inject(query) do |q, (k,v)|
|
184
|
-
q<< "#{k}=#{v}"
|
185
|
-
end
|
186
|
-
query = "/#{method}?" + query.join('&')
|
187
|
-
response = get(query)
|
188
|
-
results = response['data'][method.to_s].inject([]) do |rs, url|
|
189
|
-
result_index = input.index(url['short_url'] || url['hash']) || input.index(url['global_hash'])
|
190
|
-
if url['error'].nil?
|
191
|
-
# builds the results array in the same order as the input
|
192
|
-
rs[result_index] = Bitly::V3::Url.new(self, url)
|
193
|
-
# remove the key from the original array, in case the same hash/url was entered twice
|
194
|
-
input[result_index] = nil
|
195
|
-
else
|
196
|
-
rs[result_index] = Bitly::V3::MissingUrl.new(url)
|
197
|
-
input[result_index] = nil
|
198
|
-
end
|
199
|
-
rs
|
200
|
-
end
|
201
|
-
return results.length > 1 ? results : results[0]
|
202
|
-
end
|
203
|
-
end
|
204
|
-
end
|
205
|
-
end
|
206
|
-
|
207
|
-
class BitlyTimeout < BitlyError; end
|
data/lib/bitly/v3/user.rb
DELETED
@@ -1,134 +0,0 @@
|
|
1
|
-
module Bitly
|
2
|
-
module V3
|
3
|
-
# A user requires an oauth access token. The flow is as follows:
|
4
|
-
#
|
5
|
-
# o = Bitly::V3::OAuth.new(consumer_token, consumer_secret)
|
6
|
-
# o.authorize_url(redirect_url)
|
7
|
-
# #=> "https://bit.ly/oauth/authorize?client_id=#{consumer_token}&type=web_server&redirect_uri=http%3A%2F%2Ftest.local%2Fbitly%2Fauth"
|
8
|
-
# Redirect your users to this url, when they authorize your application
|
9
|
-
# they will be redirected to the url you provided with a code parameter.
|
10
|
-
# Use that parameter, and the exact same redirect url as follows:
|
11
|
-
#
|
12
|
-
# o.get_access_token_from_code(params[:code], redirect_url)
|
13
|
-
# #=> #<OAuth2::AccessToken ...>
|
14
|
-
#
|
15
|
-
# Then use that access token to create your user object.
|
16
|
-
#
|
17
|
-
# u=Bitly::V3::User.new(o.access_token)
|
18
|
-
class User
|
19
|
-
include HTTParty
|
20
|
-
base_uri 'https://api-ssl.bit.ly/v3/'
|
21
|
-
attr_accessor :login, :api_key
|
22
|
-
|
23
|
-
def initialize(access_token)
|
24
|
-
@access_token = access_token
|
25
|
-
@login = access_token['login'] || access_token['username']
|
26
|
-
@api_key = access_token['apiKey'] || access_token['api_key']
|
27
|
-
end
|
28
|
-
|
29
|
-
# OAuth 2 endpoint that provides a list of top referrers (up to 500 per
|
30
|
-
# day) for a given user's bit.ly links, and the number of clicks per referrer.
|
31
|
-
#
|
32
|
-
# http://code.google.com/p/bitly-api/wiki/ApiDocumentation#/v3/user/referrers
|
33
|
-
def referrers(opts={})
|
34
|
-
if @referrers.nil? || opts.delete(:force)
|
35
|
-
@referrers = get_method(:referrers, Bitly::V3::Referrer, opts)
|
36
|
-
end
|
37
|
-
@referrers
|
38
|
-
end
|
39
|
-
|
40
|
-
# OAuth 2 endpoint that provides a list of countries from which clicks
|
41
|
-
# on a given user's bit.ly links are originating, and the number of clicks per country.
|
42
|
-
#
|
43
|
-
# http://code.google.com/p/bitly-api/wiki/ApiDocumentation#/v3/user/countries
|
44
|
-
def countries(opts={})
|
45
|
-
if @countries.nil? || opts.delete(:force)
|
46
|
-
@countries = get_method(:countries, Bitly::V3::Country, opts)
|
47
|
-
end
|
48
|
-
@countries
|
49
|
-
end
|
50
|
-
|
51
|
-
# OAuth 2 endpoint that provides a given user's 100 most popular links
|
52
|
-
# based on click traffic in the past hour, and the number of clicks per link.
|
53
|
-
#
|
54
|
-
# http://code.google.com/p/bitly-api/wiki/ApiDocumentation#/v3/user/realtime_links
|
55
|
-
def realtime_links(opts={})
|
56
|
-
if @realtime_links.nil? || opts.delete(:force)
|
57
|
-
opts.merge!(:access_token => @access_token.token)
|
58
|
-
result = self.class.get("/user/realtime_links", :query => opts)
|
59
|
-
if result['status_code'] == 200
|
60
|
-
@realtime_links = result['data']['realtime_links'].map { |rs| Bitly::V3::RealtimeLink.new(rs) }
|
61
|
-
else
|
62
|
-
raise BitlyError.new(result['status_txt'], result['status_code'])
|
63
|
-
end
|
64
|
-
end
|
65
|
-
@realtime_links
|
66
|
-
end
|
67
|
-
|
68
|
-
# OAuth 2 endpoint that provides the total clicks per day on a user's bit.ly links.
|
69
|
-
#
|
70
|
-
# http://code.google.com/p/bitly-api/wiki/ApiDocumentation#/v3/user/clicks
|
71
|
-
def clicks(opts={})
|
72
|
-
get_clicks(opts)
|
73
|
-
@clicks
|
74
|
-
end
|
75
|
-
|
76
|
-
# Displays the total clicks returned from the clicks method.
|
77
|
-
def total_clicks(opts={})
|
78
|
-
get_clicks(opts)
|
79
|
-
@total_clicks
|
80
|
-
end
|
81
|
-
|
82
|
-
# Returns a Bitly Client using the credentials of the user.
|
83
|
-
def client
|
84
|
-
@client ||= Bitly::V3::Client.new(login, api_key)
|
85
|
-
end
|
86
|
-
|
87
|
-
# OAuth 2 endpoint that provides a given user's link shortening history,
|
88
|
-
# in reverse chronological order (most recent to least recent).
|
89
|
-
def link_history(opts={})
|
90
|
-
opts.merge!(:access_token => @access_token.token)
|
91
|
-
result = self.class.get("/user/link_history", :query => opts)
|
92
|
-
if result['status_code'] == 200
|
93
|
-
results = result['data']['link_history'].inject([]) do |rs, obj|
|
94
|
-
obj['short_url'] = obj['link']
|
95
|
-
obj['hash'] = obj['link'].split('/').last
|
96
|
-
rs << Url.new(client, obj)
|
97
|
-
end
|
98
|
-
return results
|
99
|
-
else
|
100
|
-
raise BitlyError.new(result['status_txt'], result['status_code'])
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
private
|
105
|
-
|
106
|
-
def get_method(method, klass, opts)
|
107
|
-
opts.merge!(:access_token => @access_token.token)
|
108
|
-
result = self.class.get("/user/#{method.to_s}", :query => opts)
|
109
|
-
if result['status_code'] == 200
|
110
|
-
result['data'][method.to_s].map do |rs|
|
111
|
-
rs.inject([]) do |results, obj|
|
112
|
-
results << klass.new(obj)
|
113
|
-
end
|
114
|
-
end
|
115
|
-
else
|
116
|
-
raise BitlyError.new(result['status_txt'], result['status_code'])
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def get_clicks(opts={})
|
121
|
-
if @clicks.nil? || opts.delete(:force)
|
122
|
-
opts.merge!(:access_token => @access_token.token)
|
123
|
-
result = self.class.get("/user/clicks", :query => opts)
|
124
|
-
if result['status_code'] == 200
|
125
|
-
@clicks = result['data']['clicks'].map { |rs| Bitly::V3::Day.new(rs) }
|
126
|
-
@total_clicks = result['data']['total_clicks']
|
127
|
-
else
|
128
|
-
raise BitlyError.new(result['status_txt'], result['status_code'])
|
129
|
-
end
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|