jarodluebbert-twitter_oauth 0.3.6
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.
- data/LICENSE +20 -0
- data/README.textile +82 -0
- data/lib/twitter_oauth.rb +8 -0
- data/lib/twitter_oauth/account.rb +53 -0
- data/lib/twitter_oauth/blocks.rb +33 -0
- data/lib/twitter_oauth/client.rb +84 -0
- data/lib/twitter_oauth/direct_messages.rb +29 -0
- data/lib/twitter_oauth/favorites.rb +22 -0
- data/lib/twitter_oauth/friendships.rb +39 -0
- data/lib/twitter_oauth/lists.rb +100 -0
- data/lib/twitter_oauth/notifications.rb +17 -0
- data/lib/twitter_oauth/saved_searches.rb +24 -0
- data/lib/twitter_oauth/search.rb +35 -0
- data/lib/twitter_oauth/spam.rb +10 -0
- data/lib/twitter_oauth/status.rb +25 -0
- data/lib/twitter_oauth/timeline.rb +56 -0
- data/lib/twitter_oauth/trends.rb +25 -0
- data/lib/twitter_oauth/user.rb +60 -0
- data/lib/twitter_oauth/utils.rb +34 -0
- metadata +168 -0
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) Richard Taylor
|
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
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.textile
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
h1. Twitter OAuth REST API client library for Ruby
|
2
|
+
|
3
|
+
h2. Install the gem
|
4
|
+
|
5
|
+
sudo gem install twitter_oauth # (via gemcutter)
|
6
|
+
|
7
|
+
h2. Using the gem
|
8
|
+
|
9
|
+
To make authorized requests with the client library you'll need to "create a Twitter OAuth Application":http://twitter.com/oauth_clients/new.
|
10
|
+
|
11
|
+
See "sinitter":http://github.com/moomerman/sinitter/tree/master for a full website integration example.
|
12
|
+
|
13
|
+
h2. Unauthorized request example
|
14
|
+
|
15
|
+
The Twitter API can be called to make public requests without needing any client credentials.
|
16
|
+
Most methods will not work in this mode but some of them do. An example to retrieve the public details
|
17
|
+
about a Twitter user is below.
|
18
|
+
|
19
|
+
<pre><code>client = TwitterOAuth::Client.new
|
20
|
+
|
21
|
+
puts client.show('twitter')
|
22
|
+
=> => {"status"=>{"truncated"=>false, "favorited"=>false, "text"=>"Update on service issues http://tinyurl.com/ca872j", "id"=>1357776683, "in_reply_to_user_id"=>nil, "in_reply_to_status_id"=>nil, "source"=>"<a href=\"http://twitterfeed.com\">twitterfeed</a>", "created_at"=>"Fri Mar 20 01:17:35 +0000 2009"}, "name"=>"Twitter", "profile_sidebar_fill_color"=>"CDFFFF", "profile_sidebar_border_color"=>"8a6447", "profile_background_tile"=>false, "profile_link_color"=>"0000ff", "url"=>"http://twitter.com", "favourites_count"=>0, "id"=>783214, "description"=>"Always wondering what everyone's doing.", "profile_text_color"=>"000000", "protected"=>false, "utc_offset"=>-28800, "screen_name"=>"twitter", "profile_background_color"=>"9ae4e8", "time_zone"=>"Pacific Time (US & Canada)", "followers_count"=>469150, "profile_background_image_url"=>"http://static.twitter.com/images/themes/theme1/bg.gif", "friends_count"=>30, "statuses_count"=>290, "location"=>"San Francisco, CA", "profile_image_url"=>"http://s3.amazonaws.com/twitter_production/profile_images/75075164/twitter_bird_profile_normal.png", "created_at"=>"Tue Feb 20 14:35:54 +0000 2007"}
|
23
|
+
</code></pre>
|
24
|
+
|
25
|
+
You can also access to the search API which is available in either authorized or unauthorized modes.
|
26
|
+
|
27
|
+
<pre><code>search = client.search('twitter')
|
28
|
+
search.results.size => 20
|
29
|
+
search.results.first.from_user => "josephpred"
|
30
|
+
search.results.first.text
|
31
|
+
=> "Useful public service Twitter account for those of you hitting Tahoe or just needing to cross the pass to Reno: @i80chains"
|
32
|
+
</code></pre>
|
33
|
+
|
34
|
+
h2. Authorized request example
|
35
|
+
|
36
|
+
To use the full power of the Twitter API you need to authorize your application and a valid Twitter user via OAuth.
|
37
|
+
An example showing how to update the status of an authorized user is below.
|
38
|
+
|
39
|
+
Firstly we need to create an instance of the client with your application client credentials you have been given by Twitter
|
40
|
+
when you set up your application.
|
41
|
+
|
42
|
+
<pre><code>client = TwitterOAuth::Client.new(
|
43
|
+
:consumer_key => 'YOUR_APP_CONSUMER_KEY',
|
44
|
+
:consumer_secret => 'YOURA_APP_CONSUMER_SECRET'
|
45
|
+
)
|
46
|
+
request_token = client.request_token(:oauth_callback => oauth_confirm_url)
|
47
|
+
#:oauth_callback required for web apps, since oauth gem by default force PIN-based flow
|
48
|
+
#( see http://groups.google.com/group/twitter-development-talk/browse_thread/thread/472500cfe9e7cdb9/848f834227d3e64d )
|
49
|
+
|
50
|
+
|
51
|
+
request_token.authorize_url
|
52
|
+
=> http://twitter.com/oauth/authorize?oauth_token=TOKEN
|
53
|
+
</code></pre>
|
54
|
+
|
55
|
+
In your application your user would be redirected to Twitter to authorize the application at this point. You'll need to store
|
56
|
+
the request token (usually in the session) for later. The code continues below assuming the user has authorized your application.
|
57
|
+
|
58
|
+
<pre><code>access_token = client.authorize(
|
59
|
+
request_token.token,
|
60
|
+
request_token.secret,
|
61
|
+
:oauth_verifier => params[:oauth_verifier]
|
62
|
+
)
|
63
|
+
|
64
|
+
client.authorized?
|
65
|
+
=> true
|
66
|
+
|
67
|
+
client.update('checking out the twitter_oauth library') # sends a twitter status update
|
68
|
+
</code></pre>
|
69
|
+
|
70
|
+
Now if you keep hold of the access_token (usually in the database) for this user you won't need to re-authorize them next time. When you create an instance of the client you can just pass in the access token and secret that you have stored.
|
71
|
+
|
72
|
+
<pre><code>access_token = @user.access_token # assuming @user
|
73
|
+
client = TwitterOAuth::Client.new(
|
74
|
+
:consumer_key => 'YOUR_CONSUMER_KEY',
|
75
|
+
:consumer_secret => 'YOUR-CONSUMER-SECRET',
|
76
|
+
:token => access_token.token,
|
77
|
+
:secret => access_token.secret
|
78
|
+
)
|
79
|
+
|
80
|
+
client.authorized?
|
81
|
+
=> true
|
82
|
+
</code></pre>
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module TwitterOAuth
|
2
|
+
class Client
|
3
|
+
|
4
|
+
# Returns an HTTP 200 OK response code and a representation of the requesting user if authentication was successful;
|
5
|
+
# returns a 401 status code and an error message if not.
|
6
|
+
def authorized?
|
7
|
+
oauth_response = access_token.get('/account/verify_credentials.json')
|
8
|
+
return oauth_response.class == Net::HTTPOK
|
9
|
+
end
|
10
|
+
|
11
|
+
# Returns client info
|
12
|
+
def info
|
13
|
+
get('/account/verify_credentials.json')
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns the remaining number of API requests available to the requesting user before the API limit is reached for the current hour.
|
17
|
+
def rate_limit_status
|
18
|
+
get('/account/rate_limit_status.json')
|
19
|
+
end
|
20
|
+
|
21
|
+
# Updates profile background image. Takes a File object and optional tile argument.
|
22
|
+
# Returns extended user info object.
|
23
|
+
def update_profile_background_image(image, tile = false)
|
24
|
+
body, headers = http_multipart_data({:image => image, :tile => tile})
|
25
|
+
post('/account/update_profile_background_image.json', body, headers)
|
26
|
+
end
|
27
|
+
|
28
|
+
# Updates profile avatar image. Takes a File object which should be an image.
|
29
|
+
# Returns extended user info object.
|
30
|
+
def update_profile_image(image)
|
31
|
+
body, headers = http_multipart_data({:image => image})
|
32
|
+
post('/account/update_profile_image.json', body, headers)
|
33
|
+
end
|
34
|
+
|
35
|
+
# colors hash must contain at least one or more of the following keys :profile_background_color, :profile_text_color, :profile_link_color, :profile_sidebar_fill_color, :profile_sidebar_border_color
|
36
|
+
# returns extended user info object.
|
37
|
+
def update_profile_colors(colors)
|
38
|
+
post('/account/update_profile_colors.json', colors)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Sets values that users are able to set under the "Account" tab of their settings page.
|
42
|
+
# Valid parameters are:
|
43
|
+
# :name Full name associated with the profile. Maximum of 20 characters.
|
44
|
+
# :url URL associated with the profile. Will be prepended with "http://" if not present. Maximum of 100 characters.
|
45
|
+
# :location The city or country describing where the user of the account is located. The contents are not normalized
|
46
|
+
# or geocoded in any way. Maximum of 30 characters.
|
47
|
+
# :description A description of the user owning the account. Maximum of 160 characters.
|
48
|
+
def update_profile(params)
|
49
|
+
post('/account/update_profile', params)
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module TwitterOAuth
|
2
|
+
class Client
|
3
|
+
|
4
|
+
# Blocks the user specified in the ID parameter as the authenticating user.
|
5
|
+
# Destroys a friendship to the blocked user if it exists.
|
6
|
+
# Returns the blocked user in the requested format when successful.
|
7
|
+
def block(id)
|
8
|
+
post("/blocks/create/#{id}.json")
|
9
|
+
end
|
10
|
+
|
11
|
+
# Un-blocks the user specified in the ID parameter for the authenticating user.
|
12
|
+
# Returns the un-blocked user in the requested format when successful.
|
13
|
+
def unblock(id)
|
14
|
+
post("/blocks/destroy/#{id}.json")
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns if the authenticating user is blocking a target user.
|
18
|
+
def blocked?(id)
|
19
|
+
get("/blocks/exists/#{id}.json")
|
20
|
+
end
|
21
|
+
|
22
|
+
# Returns an array of user objects that the authenticating user is blocking.
|
23
|
+
def blocking
|
24
|
+
get("/blocks/blocking.json")
|
25
|
+
end
|
26
|
+
|
27
|
+
# Returns an array of numeric user ids the authenticating user is blocking.
|
28
|
+
def blocking_ids
|
29
|
+
get("/blocks/blocking/ids.json")
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'twitter_oauth/timeline'
|
2
|
+
require 'twitter_oauth/status'
|
3
|
+
require 'twitter_oauth/account'
|
4
|
+
require 'twitter_oauth/direct_messages'
|
5
|
+
require 'twitter_oauth/search'
|
6
|
+
require 'twitter_oauth/notifications'
|
7
|
+
require 'twitter_oauth/blocks'
|
8
|
+
require 'twitter_oauth/friendships'
|
9
|
+
require 'twitter_oauth/user'
|
10
|
+
require 'twitter_oauth/favorites'
|
11
|
+
require 'twitter_oauth/utils'
|
12
|
+
require 'twitter_oauth/trends'
|
13
|
+
require 'twitter_oauth/lists'
|
14
|
+
require 'twitter_oauth/saved_searches'
|
15
|
+
require 'twitter_oauth/spam'
|
16
|
+
|
17
|
+
module TwitterOAuth
|
18
|
+
class Client
|
19
|
+
|
20
|
+
def initialize(options = {})
|
21
|
+
@consumer_key = options[:consumer_key]
|
22
|
+
@consumer_secret = options[:consumer_secret]
|
23
|
+
@token = options[:token]
|
24
|
+
@secret = options[:secret]
|
25
|
+
end
|
26
|
+
|
27
|
+
def authorize(token, secret, options = {})
|
28
|
+
request_token = OAuth::RequestToken.new(
|
29
|
+
consumer, token, secret
|
30
|
+
)
|
31
|
+
@access_token = request_token.get_access_token(options)
|
32
|
+
@token = @access_token.token
|
33
|
+
@secret = @access_token.secret
|
34
|
+
@access_token
|
35
|
+
end
|
36
|
+
|
37
|
+
def show(username)
|
38
|
+
get("/users/show/#{username}.json")
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns the string "ok" in the requested format with a 200 OK HTTP status code.
|
42
|
+
def test
|
43
|
+
get("/help/test.json")
|
44
|
+
end
|
45
|
+
|
46
|
+
def request_token(options={})
|
47
|
+
consumer.get_request_token(options)
|
48
|
+
end
|
49
|
+
|
50
|
+
def authentication_request_token(options={})
|
51
|
+
consumer.options[:authorize_path] = '/oauth/authenticate'
|
52
|
+
request_token(options)
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
def consumer
|
57
|
+
@consumer ||= OAuth::Consumer.new(
|
58
|
+
@consumer_key,
|
59
|
+
@consumer_secret,
|
60
|
+
{ :site=>"https://api.twitter.com" }
|
61
|
+
)
|
62
|
+
end
|
63
|
+
|
64
|
+
def access_token
|
65
|
+
@access_token ||= OAuth::AccessToken.new(consumer, @token, @secret)
|
66
|
+
end
|
67
|
+
|
68
|
+
def get(url)
|
69
|
+
oauth_response = access_token.get(url)
|
70
|
+
JSON.parse(oauth_response.body)
|
71
|
+
end
|
72
|
+
|
73
|
+
def post(url, body = '', headers = {})
|
74
|
+
oauth_response = access_token.post(url, body, headers)
|
75
|
+
JSON.parse(oauth_response.body)
|
76
|
+
end
|
77
|
+
|
78
|
+
def delete(url)
|
79
|
+
oauth_response = access_token.delete(url)
|
80
|
+
JSON.parse(oauth_response.body)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module TwitterOAuth
|
2
|
+
class Client
|
3
|
+
|
4
|
+
# Return the most recent direct messages sent to the authenticating user.
|
5
|
+
# By default, returns the last 20. See http://apiwiki.twitter.com/Twitter-REST-API-Method:-direct_messages
|
6
|
+
# for other options
|
7
|
+
def messages(options={})
|
8
|
+
args = options.map{|k,v| "#{k}=#{v}"}.join('&')
|
9
|
+
get("/direct_messages.json?#{args}")
|
10
|
+
end
|
11
|
+
|
12
|
+
# By default, returns a list of the 20 most recent direct messages sent by the authenticating user.
|
13
|
+
def sent_messages(options={})
|
14
|
+
args = options.map{|k,v| "#{k}=#{v}"}.join('&')
|
15
|
+
get("/direct_messages/sent.json?#{args}")
|
16
|
+
end
|
17
|
+
|
18
|
+
# Sends a new direct message to the specified user from the authenticating user.
|
19
|
+
def message(user, text)
|
20
|
+
post('/direct_messages/new.json', :user => user, :text => text)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Destroys the direct message specified in the required ID parameter.
|
24
|
+
def message_destroy(id)
|
25
|
+
post("/direct_messages/destroy/#{id}.json")
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module TwitterOAuth
|
2
|
+
class Client
|
3
|
+
|
4
|
+
# Returns the 20 most recent favorite statuses for the authenticating user or user specified by the ID parameter.
|
5
|
+
def favorites(page=1)
|
6
|
+
get("/favorites.json?page=#{page}")
|
7
|
+
end
|
8
|
+
|
9
|
+
# Favorites the status specified in the ID parameter as the authenticating user.
|
10
|
+
# Returns the favorite status when successful.
|
11
|
+
def favorite(id)
|
12
|
+
post("/favorites/create/#{id}.json")
|
13
|
+
end
|
14
|
+
|
15
|
+
# Un-favorites the status specified in the ID parameter as the authenticating user.
|
16
|
+
# Returns the un-favorited status when successful.
|
17
|
+
def unfavorite(id)
|
18
|
+
post("/favorites/destroy/#{id}.json")
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module TwitterOAuth
|
2
|
+
class Client
|
3
|
+
|
4
|
+
# Returns an array of numeric IDs for every user the specified user is following.
|
5
|
+
def friends_ids(options={})
|
6
|
+
args = options.map{|k,v| "#{k}=#{v}"}.join('&')
|
7
|
+
get("/friends/ids.json?#{args}")
|
8
|
+
end
|
9
|
+
|
10
|
+
# Returns an array of numeric IDs for every user following the specified user.
|
11
|
+
def followers_ids(options={})
|
12
|
+
args = options.map{|k,v| "#{k}=#{v}"}.join('&')
|
13
|
+
get("/followers/ids.json?#{args}")
|
14
|
+
end
|
15
|
+
|
16
|
+
# Allows the authenticating user to follow the specified user. Returns the befriended user when successful.
|
17
|
+
def friend(id)
|
18
|
+
post("/friendships/create/#{id}.json")
|
19
|
+
end
|
20
|
+
|
21
|
+
# Allows the authenticating users to unfollow the specified user. Returns the unfollowed user when successful.
|
22
|
+
def unfriend(id)
|
23
|
+
post("/friendships/destroy/#{id}.json")
|
24
|
+
end
|
25
|
+
|
26
|
+
# Tests for the existence of friendship between two users. Will return true if user_a follows user_b, otherwise will return false.
|
27
|
+
# You are better off using get_friendship as it returns more extended information.
|
28
|
+
def friends?(a, b)
|
29
|
+
oauth_response = access_token.get("/friendships/exists.json?user_a=#{a}&user_b=#{b}")
|
30
|
+
oauth_response.body.strip == 'true'
|
31
|
+
end
|
32
|
+
|
33
|
+
# Returns detailed information about the relationship between two users.
|
34
|
+
def get_friendship(a, b)
|
35
|
+
get("/friendships/show.json?source_screen_name=#{a}&target_screen_name=#{b}")
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
module TwitterOAuth
|
2
|
+
class Client
|
3
|
+
|
4
|
+
#
|
5
|
+
# List methods
|
6
|
+
#
|
7
|
+
|
8
|
+
# Creates a new list for the authenticated user. Accounts are limited to 20 lists.
|
9
|
+
def create_list(user, list, options={})
|
10
|
+
post("/#{user}/lists.json", options.merge(:name => list))
|
11
|
+
end
|
12
|
+
|
13
|
+
# Updates the specified list.
|
14
|
+
def update_list(user, list, options={})
|
15
|
+
post("/#{user}/lists/#{list}.json", options)
|
16
|
+
end
|
17
|
+
|
18
|
+
# List the lists of the specified user.
|
19
|
+
# Private lists will be included if the authenticated user is the same as the user whose lists are being returned.
|
20
|
+
def get_lists(user)
|
21
|
+
get("/#{user}/lists.json")
|
22
|
+
end
|
23
|
+
|
24
|
+
# Show the specified list. Private lists will only be shown if the authenticated user owns the specified list.
|
25
|
+
def get_list(user, list)
|
26
|
+
get("/#{user}/lists/#{list}.json")
|
27
|
+
end
|
28
|
+
|
29
|
+
# Deletes the specified list. Must be owned by the authenticated user.
|
30
|
+
def delete_list(user, list)
|
31
|
+
delete("/#{user}/lists/#{list}.json")
|
32
|
+
end
|
33
|
+
|
34
|
+
# Show tweet timeline for members of the specified list.
|
35
|
+
def list_statuses(user, list)
|
36
|
+
get("/#{user}/lists/#{list}/statuses.json")
|
37
|
+
end
|
38
|
+
|
39
|
+
# List the lists the specified user has been added to.
|
40
|
+
def list_memberships(user)
|
41
|
+
get("/#{user}/lists/memberships.json")
|
42
|
+
end
|
43
|
+
|
44
|
+
# List the lists the specified user follows.
|
45
|
+
def list_subscriptions(user)
|
46
|
+
get("/#{user}/lists/subscriptions.json")
|
47
|
+
end
|
48
|
+
|
49
|
+
#
|
50
|
+
# List Members Methods
|
51
|
+
#
|
52
|
+
|
53
|
+
# Returns the members of the specified list.
|
54
|
+
def list_members(user, list)
|
55
|
+
get("/#{user}/#{list}/members.json")
|
56
|
+
end
|
57
|
+
|
58
|
+
# Add a member to a list. The authenticated user must own the list to be able to add members to it.
|
59
|
+
# Lists are limited to having 500 members.
|
60
|
+
def add_member_to_list(user, list, member_id, options={})
|
61
|
+
post("/#{user}/#{list}/members.json", options.merge(:id => member_id))
|
62
|
+
end
|
63
|
+
|
64
|
+
# Removes the specified member from the list.
|
65
|
+
# The authenticated user must be the list's owner to remove members from the list.
|
66
|
+
def remove_member_from_list(user, list, member_id)
|
67
|
+
delete("/#{user}/#{list}/members.json?id=#{member_id}")
|
68
|
+
end
|
69
|
+
|
70
|
+
# Check if a user is a member of the specified list.
|
71
|
+
def get_member_of_list(user, list, member_id)
|
72
|
+
get("/#{user}/#{list}/members/#{member_id}.json")
|
73
|
+
end
|
74
|
+
|
75
|
+
#
|
76
|
+
# List Subscribers Methods
|
77
|
+
#
|
78
|
+
|
79
|
+
# Returns the subscribers of the specified list.
|
80
|
+
def list_subscribers(user, list)
|
81
|
+
get("/#{user}/#{list}/subscribers.json")
|
82
|
+
end
|
83
|
+
|
84
|
+
# Make the authenticated user follow the specified list.
|
85
|
+
def subscribe_to_list(user, list, options={})
|
86
|
+
post("/#{user}/#{list}/subscribers.json")
|
87
|
+
end
|
88
|
+
|
89
|
+
# Unsubscribes the authenticated user form the specified list.
|
90
|
+
def unsubscribe_from_list(user, list)
|
91
|
+
delete("/#{user}/#{list}/subscribers.json")
|
92
|
+
end
|
93
|
+
|
94
|
+
# Check if the specified user is a subscriber of the specified list.
|
95
|
+
def get_subscriber_of_list(user, list, subscriber_id)
|
96
|
+
get("/#{user}/#{list}/subscribers/#{subscriber_id}.json")
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module TwitterOAuth
|
2
|
+
class Client
|
3
|
+
|
4
|
+
# Enables device notifications for updates from the specified user.
|
5
|
+
# Returns the specified user when successful.
|
6
|
+
def follow(id)
|
7
|
+
post("/notifications/follow/#{id}.json")
|
8
|
+
end
|
9
|
+
|
10
|
+
# Disables notifications for updates from the specified user to the authenticating user.
|
11
|
+
# Returns the specified user when successful.
|
12
|
+
def leave(id)
|
13
|
+
post("/notifications/leave/#{id}.json")
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module TwitterOAuth
|
2
|
+
class Client
|
3
|
+
|
4
|
+
# Returns the authenticated user's saved search queries.
|
5
|
+
def saved_searches
|
6
|
+
get("/saved_searches.json")
|
7
|
+
end
|
8
|
+
|
9
|
+
# Retrieve the data for a saved search owned by the authenticating user specified by the given id.
|
10
|
+
def get_saved_search(search_id)
|
11
|
+
get("/saved_searches/show/#{search_id}.json")
|
12
|
+
end
|
13
|
+
|
14
|
+
# Creates a saved search for the authenticated user.
|
15
|
+
def create_saved_search(query)
|
16
|
+
post("/saved_searches/create.json", :query => query)
|
17
|
+
end
|
18
|
+
|
19
|
+
def delete_saved_search(search_id)
|
20
|
+
post("/saved_searches/destroy/#{search_id}.json")
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'open-uri'
|
2
|
+
|
3
|
+
module TwitterOAuth
|
4
|
+
class Client
|
5
|
+
|
6
|
+
def search(q, options={})
|
7
|
+
options[:page] ||= 1
|
8
|
+
options[:rpp] ||= 20
|
9
|
+
options[:q] = URI.escape(q)
|
10
|
+
args = options.map{|k,v| "#{k}=#{v}"}.join('&')
|
11
|
+
search_get("/search.json?#{args}")
|
12
|
+
end
|
13
|
+
|
14
|
+
# Returns the current top 10 trending topics on Twitter.
|
15
|
+
def current_trends
|
16
|
+
search_get("/trends/current.json")
|
17
|
+
end
|
18
|
+
|
19
|
+
# Returns the top 20 trending topics for each hour in a given day.
|
20
|
+
def daily_trends
|
21
|
+
search_get("/trends/daily.json")
|
22
|
+
end
|
23
|
+
|
24
|
+
# Returns the top 30 trending topics for each day in a given week.
|
25
|
+
def weekly_trends
|
26
|
+
search_get("/trends/weekly.json")
|
27
|
+
end
|
28
|
+
|
29
|
+
private
|
30
|
+
def search_get(path)
|
31
|
+
response = open('http://search.twitter.com' + path, 'User-Agent' => 'github.com/moomerman/twitter_outh')
|
32
|
+
JSON.parse(response.read)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module TwitterOAuth
|
2
|
+
class Client
|
3
|
+
|
4
|
+
# Returns a single status, specified by the id parameter below.
|
5
|
+
def status(id)
|
6
|
+
get("/statuses/show/#{id}.json")
|
7
|
+
end
|
8
|
+
|
9
|
+
# Updates the authenticating user's status.
|
10
|
+
def update(message, options={})
|
11
|
+
post('/statuses/update.json', options.merge(:status => message))
|
12
|
+
end
|
13
|
+
|
14
|
+
# Destroys the status specified by the required ID parameter
|
15
|
+
def status_destroy(id)
|
16
|
+
post("/statuses/destroy/#{id}.json")
|
17
|
+
end
|
18
|
+
|
19
|
+
# Retweets the tweet specified by the id parameter. Returns the original tweet with retweet details embedded.
|
20
|
+
def retweet(id)
|
21
|
+
post("/statuses/retweet/#{id}.json")
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
module TwitterOAuth
|
2
|
+
class Client
|
3
|
+
|
4
|
+
# Returns the 20 most recent statuses from non-protected users who have set a custom user icon.
|
5
|
+
def public_timeline(options={})
|
6
|
+
args = options.map{|k,v| "#{k}=#{v}"}.join('&')
|
7
|
+
get("/statuses/public_timeline.json?#{args}")
|
8
|
+
end
|
9
|
+
|
10
|
+
# Returns the 20 most recent statuses, including retweets, posted by the authenticating user and that user's friends.
|
11
|
+
# This is the equivalent of /timeline/home on the Web.
|
12
|
+
def home_timeline(options={})
|
13
|
+
args = options.map{|k,v| "#{k}=#{v}"}.join('&')
|
14
|
+
get("/statuses/home_timeline.json?#{args}")
|
15
|
+
end
|
16
|
+
|
17
|
+
# Returns the 20 most recent statuses posted by the authenticating user and that user's friends.
|
18
|
+
def friends_timeline(options={})
|
19
|
+
args = options.map{|k,v| "#{k}=#{v}"}.join('&')
|
20
|
+
get("/statuses/friends_timeline.json?#{args}")
|
21
|
+
end
|
22
|
+
|
23
|
+
# Returns the 20 most recent statuses posted from the authenticating user.
|
24
|
+
def user_timeline(options={})
|
25
|
+
args = options.map{|k,v| "#{k}=#{v}"}.join('&')
|
26
|
+
get("/statuses/user_timeline.json?#{args}")
|
27
|
+
end
|
28
|
+
alias :user :user_timeline
|
29
|
+
|
30
|
+
# Returns the 20 most recent @replies (status updates prefixed with @username) for the authenticating user.
|
31
|
+
def mentions(options={})
|
32
|
+
args = options.map{|k,v| "#{k}=#{v}"}.join('&')
|
33
|
+
get("/statuses/mentions.json?#{args}")
|
34
|
+
end
|
35
|
+
alias :replies :mentions
|
36
|
+
|
37
|
+
# Returns the 20 most recent retweets posted by the authenticating user
|
38
|
+
def retweeted_by_me(options={})
|
39
|
+
args = options.map{|k,v| "#{k}=#{v}"}.join('&')
|
40
|
+
get("/statuses/retweeted_by_me.json?#{args}")
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns the 20 most recent retweets posted by the authenticating user's friends.
|
44
|
+
def retweeted_to_me(options={})
|
45
|
+
args = options.map{|k,v| "#{k}=#{v}"}.join('&')
|
46
|
+
get("/statuses/retweeted_to_me.json?#{args}")
|
47
|
+
end
|
48
|
+
|
49
|
+
# Returns the 20 most recent tweets of the authenticated user that have been retweeted by others.
|
50
|
+
def retweets_of_me(options={})
|
51
|
+
args = options.map{|k,v| "#{k}=#{v}"}.join('&')
|
52
|
+
get("/statuses/retweets_of_me.json?#{args}")
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module TwitterOAuth
|
2
|
+
class Client
|
3
|
+
|
4
|
+
# Returns the top ten topics that are currently trending on Twitter.
|
5
|
+
def trends
|
6
|
+
get("/trends.json")
|
7
|
+
end
|
8
|
+
|
9
|
+
# Returns the locations that Twitter has trending topic information for.
|
10
|
+
# The response is an array of "locations" that encode the location's WOEID (a Yahoo! Where On Earth ID)
|
11
|
+
# and some other human-readable information such as a canonical name and country the location belongs in.
|
12
|
+
def trends_available
|
13
|
+
get("/trends/available.json")
|
14
|
+
end
|
15
|
+
|
16
|
+
# Returns the top 10 trending topics for a specific location Twitter has trending topic information for.
|
17
|
+
# The response is an array of "trend" objects that encode the name of the trending topic, the query
|
18
|
+
# parameter that can be used to search for the topic on Search, and the direct URL that can be issued against Search.
|
19
|
+
# This information is cached for five minutes, and therefore users are discouraged from querying these endpoints
|
20
|
+
# faster than once every five minutes. Global trends information is also available from this API by using a WOEID of 1.
|
21
|
+
def trends_for_location(woeid)
|
22
|
+
get("/trends/woeid.json")
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module TwitterOAuth
|
2
|
+
class Client
|
3
|
+
|
4
|
+
# Returns the 100 last friends
|
5
|
+
# The page parameter is implemented for legacy reasons, but use of this is slow
|
6
|
+
# as passing page is no longer supported by the Twitter API as the use of cursors
|
7
|
+
# is now obligitory. It is recommended that you use all_friends instead
|
8
|
+
def friends(page=1)
|
9
|
+
return get("/statuses/friends.json?page=#{page}") if page == 1
|
10
|
+
users = []
|
11
|
+
cursor = "-1"
|
12
|
+
page.times do
|
13
|
+
return [] if cursor == 0
|
14
|
+
json = get("/statuses/friends.json?cursor=#{cursor}")
|
15
|
+
cursor = json["next_cursor"]
|
16
|
+
users = json["users"]
|
17
|
+
end
|
18
|
+
users
|
19
|
+
end
|
20
|
+
|
21
|
+
# Returns all pages of friends
|
22
|
+
def all_friends
|
23
|
+
users = []
|
24
|
+
cursor = "-1"
|
25
|
+
while cursor != 0 do
|
26
|
+
json = get("/statuses/friends.json?cursor=#{cursor}")
|
27
|
+
cursor = json["next_cursor"]
|
28
|
+
users += json["users"]
|
29
|
+
end
|
30
|
+
users
|
31
|
+
end
|
32
|
+
|
33
|
+
# Returns the 100 last followers
|
34
|
+
def followers(page=1)
|
35
|
+
return get("/statuses/followers.json?page=#{page}") if page == 1
|
36
|
+
users = []
|
37
|
+
cursor = "-1"
|
38
|
+
page.times do
|
39
|
+
return [] if cursor == 0
|
40
|
+
json = get("/statuses/followers.json?cursor=#{cursor}")
|
41
|
+
cursor = json["next_cursor"]
|
42
|
+
users = json["users"]
|
43
|
+
end
|
44
|
+
users
|
45
|
+
end
|
46
|
+
|
47
|
+
# Returns all pages of followers
|
48
|
+
def all_followers
|
49
|
+
users = []
|
50
|
+
cursor = "-1"
|
51
|
+
while cursor != 0 do
|
52
|
+
json = get("/statuses/followers.json?cursor=#{cursor}")
|
53
|
+
cursor = json["next_cursor"]
|
54
|
+
users += json["users"]
|
55
|
+
end
|
56
|
+
users
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module TwitterOAuth
|
2
|
+
class Client
|
3
|
+
CRLF = "\r\n"
|
4
|
+
|
5
|
+
private
|
6
|
+
# Properly encodes images in form/multipart specification for upload via OAuth.
|
7
|
+
def http_multipart_data(params)
|
8
|
+
body = ""
|
9
|
+
headers = {}
|
10
|
+
|
11
|
+
boundary = Time.now.to_i.to_s(16)
|
12
|
+
|
13
|
+
headers["Content-Type"] = "multipart/form-data; boundary=#{boundary}"
|
14
|
+
params.each do |key,value|
|
15
|
+
esc_key = OAuth::Helper.escape(key.to_s)
|
16
|
+
body << "--#{boundary}#{CRLF}"
|
17
|
+
|
18
|
+
if value.respond_to?(:read)
|
19
|
+
mime_type = MIME::Types.type_for(value.path)[0] || MIME::Types["application/octet-stream"][0]
|
20
|
+
body << "Content-Disposition: form-data; name=\"#{esc_key}\"; filename=\"#{File.basename(value.path)}\"#{CRLF}"
|
21
|
+
body << "Content-Type: #{mime_type.simplified}#{CRLF*2}"
|
22
|
+
body << value.read
|
23
|
+
else
|
24
|
+
body << "Content-Disposition: form-data; name=\"#{esc_key}\"#{CRLF*2}#{value}"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
body << "--#{boundary}--#{CRLF*2}"
|
29
|
+
headers["Content-Length"] = body.size.to_s
|
30
|
+
|
31
|
+
return [ body, headers ]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
metadata
ADDED
@@ -0,0 +1,168 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jarodluebbert-twitter_oauth
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 31
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 3
|
9
|
+
- 6
|
10
|
+
version: 0.3.6
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Richard Taylor
|
14
|
+
autorequire:
|
15
|
+
bindir: bin
|
16
|
+
cert_chain: []
|
17
|
+
|
18
|
+
date: 2010-05-06 00:00:00 -07:00
|
19
|
+
default_executable:
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: oauth
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 31
|
30
|
+
segments:
|
31
|
+
- 0
|
32
|
+
- 3
|
33
|
+
- 6
|
34
|
+
version: 0.3.6
|
35
|
+
type: :runtime
|
36
|
+
version_requirements: *id001
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: json
|
39
|
+
prerelease: false
|
40
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
hash: 1
|
46
|
+
segments:
|
47
|
+
- 1
|
48
|
+
- 1
|
49
|
+
- 9
|
50
|
+
version: 1.1.9
|
51
|
+
- - <=
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
hash: 23
|
54
|
+
segments:
|
55
|
+
- 1
|
56
|
+
- 2
|
57
|
+
- 4
|
58
|
+
version: 1.2.4
|
59
|
+
type: :runtime
|
60
|
+
version_requirements: *id002
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: mime-types
|
63
|
+
prerelease: false
|
64
|
+
requirement: &id003 !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
hash: 47
|
70
|
+
segments:
|
71
|
+
- 1
|
72
|
+
- 16
|
73
|
+
version: "1.16"
|
74
|
+
type: :runtime
|
75
|
+
version_requirements: *id003
|
76
|
+
- !ruby/object:Gem::Dependency
|
77
|
+
name: shoulda
|
78
|
+
prerelease: false
|
79
|
+
requirement: &id004 !ruby/object:Gem::Requirement
|
80
|
+
none: false
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
hash: 3
|
85
|
+
segments:
|
86
|
+
- 0
|
87
|
+
version: "0"
|
88
|
+
type: :development
|
89
|
+
version_requirements: *id004
|
90
|
+
- !ruby/object:Gem::Dependency
|
91
|
+
name: mocha
|
92
|
+
prerelease: false
|
93
|
+
requirement: &id005 !ruby/object:Gem::Requirement
|
94
|
+
none: false
|
95
|
+
requirements:
|
96
|
+
- - ">="
|
97
|
+
- !ruby/object:Gem::Version
|
98
|
+
hash: 3
|
99
|
+
segments:
|
100
|
+
- 0
|
101
|
+
version: "0"
|
102
|
+
type: :development
|
103
|
+
version_requirements: *id005
|
104
|
+
description: twitter_oauth is a Ruby library for talking to twitter using the new oauth method.
|
105
|
+
email: moomerman@gmail.com
|
106
|
+
executables: []
|
107
|
+
|
108
|
+
extensions: []
|
109
|
+
|
110
|
+
extra_rdoc_files: []
|
111
|
+
|
112
|
+
files:
|
113
|
+
- LICENSE
|
114
|
+
- README.textile
|
115
|
+
- lib/twitter_oauth.rb
|
116
|
+
- lib/twitter_oauth/account.rb
|
117
|
+
- lib/twitter_oauth/blocks.rb
|
118
|
+
- lib/twitter_oauth/client.rb
|
119
|
+
- lib/twitter_oauth/direct_messages.rb
|
120
|
+
- lib/twitter_oauth/favorites.rb
|
121
|
+
- lib/twitter_oauth/friendships.rb
|
122
|
+
- lib/twitter_oauth/lists.rb
|
123
|
+
- lib/twitter_oauth/notifications.rb
|
124
|
+
- lib/twitter_oauth/saved_searches.rb
|
125
|
+
- lib/twitter_oauth/search.rb
|
126
|
+
- lib/twitter_oauth/spam.rb
|
127
|
+
- lib/twitter_oauth/status.rb
|
128
|
+
- lib/twitter_oauth/timeline.rb
|
129
|
+
- lib/twitter_oauth/trends.rb
|
130
|
+
- lib/twitter_oauth/user.rb
|
131
|
+
- lib/twitter_oauth/utils.rb
|
132
|
+
has_rdoc: false
|
133
|
+
homepage: http://github.com/moomerman/twitter_oauth
|
134
|
+
licenses: []
|
135
|
+
|
136
|
+
post_install_message:
|
137
|
+
rdoc_options:
|
138
|
+
- --inline-source
|
139
|
+
- --charset=UTF-8
|
140
|
+
require_paths:
|
141
|
+
- lib
|
142
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
143
|
+
none: false
|
144
|
+
requirements:
|
145
|
+
- - ">="
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
hash: 3
|
148
|
+
segments:
|
149
|
+
- 0
|
150
|
+
version: "0"
|
151
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
152
|
+
none: false
|
153
|
+
requirements:
|
154
|
+
- - ">="
|
155
|
+
- !ruby/object:Gem::Version
|
156
|
+
hash: 3
|
157
|
+
segments:
|
158
|
+
- 0
|
159
|
+
version: "0"
|
160
|
+
requirements: []
|
161
|
+
|
162
|
+
rubyforge_project: twitter_oauth
|
163
|
+
rubygems_version: 1.3.7
|
164
|
+
signing_key:
|
165
|
+
specification_version: 2
|
166
|
+
summary: twitter_oauth is a Ruby library for talking to twitter using the new oauth method.
|
167
|
+
test_files: []
|
168
|
+
|