Error with Ruby Twitter API - ruby

I am getting an error with a Ruby script using the 'twitter' gem. The part of my script that is producing the error is
require 'twitter'
require 'net/http'
require 'json'
#### Get your twitter keys & secrets:
#### https://dev.twitter.com/docs/auth/tokens-devtwittercom
Twitter.configure do |config|
config.consumer_key = 'xxxxxxx'
config.consumer_secret = 'xxxxxxx'
config.oauth_token = 'xxxxxx'
config.oauth_token_secret = 'xxxxxxx'
end
The error says undefined method 'configure' for Twitter:Module (NoMethodError)
However the 'twitter' and 'json' gems are both in my gemfile so I'm not sure why this method would be undefined.

You are doing it the "old" way. Starting in Version 5, global configuration is not longer available. So, basically you need to pass the config parameters when you initialize a client.
For example:
client = Twitter::REST::Client.new do |config|
config.consumer_key = "YOUR_CONSUMER_KEY"
config.consumer_secret = "YOUR_CONSUMER_SECRET"
config.access_token = "YOUR_ACCESS_TOKEN"
config.access_token_secret = "YOUR_ACCESS_SECRET"
end
And then just use that client to do queries, such as:
client.sample do |tweet|
puts tweet.text
end
For more information just refer to Sferik's Twitter Gem

Related

I want to obtain following list in text instead of objects using twitter api in ruby programming language

I'd love to obtain following list in text (screen names) instead of objects using Twitter Api. I am new to Ruby programming language and this's my first attempt using api with ruby especially Twitter api. What I expect is list of screen names instead of objects and I will show you examples bellow:
Results I get currently:
current results
Desired and expected results
I've tried methods such as .full_text and .text appended to the objects and didn't get my desired results.I've searched almost everywhere especially here in Stackoverflow and didn't find my answer yet.
This's my code below:
require 'rubygems'
require 'bundler/setup'
require 'twitter'
require 'json'
require 'yaml'
client = Twitter::REST::Client.new do |config|
config.consumer_key = ""
config.consumer_secret = ""
config.access_token = ""
config.access_token_secret = ""
end
following_list = client.friends('User-exmaple')
begin
for friend in following_list
puts friend
end
rescue Twitter::Error::TooManyRequests => error
# NOTE: Your process could go to sleep for up to 15 minutes but if you
# retry any sooner, it will almost certainly fail with the same exception.
sleep error.rate_limit.reset_in + 1
retry
end
I hope this explains everything, thank you so much.
I solved it by appending screen_name method to friend, example below:
require 'rubygems'
require 'bundler/setup'
require 'twitter'
require 'json'
require 'yaml'
client = Twitter::REST::Client.new do |config|
config.consumer_key = ""
config.consumer_secret = ""
config.access_token = ""
config.access_token_secret = ""
end
following_list = client.friends('User-exmaple')
begin
for friend in following_list
puts friend.screen_name
end
rescue Twitter::Error::TooManyRequests => error
# NOTE: Your process could go to sleep for up to 15 minutes but if you
# retry any sooner, it will almost certainly fail with the same exception.
sleep error.rate_limit.reset_in + 1
retry
end
I hope this explains the solution I found.

Send direct messages with twitter gem

I'm working on a twitter bot with the twitter gem. This bot is liking and following peoples. But now i want to send private messages with this gem and i cant.
This is what Im testing :
def login_twitter_stream
client_streaming =
Twitter::Streaming::Client.new do |config|
config.consumer_key = ENV["TWITTER_CONSUMER_KEY"]
config.consumer_secret = ENV["TWITTER_CONSUMER_SECRET"]
config.access_token = ENV["TWITTER_ACCESS_TOKEN"]
config.access_token_secret = ENV["TWITTER_ACCESS_TOKEN_SECRET"]
end
return client_streaming
end
def login_twitter
client_REST =
Twitter::REST::Client.new do |config|
config.consumer_key = ENV["TWITTER_CONSUMER_KEY"]
config.consumer_secret = ENV["TWITTER_CONSUMER_SECRET"]
config.access_token = ENV["TWITTER_ACCESS_TOKEN"]
config.access_token_secret = ENV["TWITTER_ACCESS_TOKEN_SECRET"]
end
return client_REST
end
def direct_messages
client = login_twitter
client
.search("#helloworld", result_type: "recent")
.take(5)
.each do
client.create_direct_message(
"#{tweet.user}",
"hello this is a test!",
options = {}
)
end
end
direct_messages
And this is the error I have with a simple
client.create_direct_message("#username","hello this is a test!",options={})
event.message_create.target.recipient_id: '#username' is not a valid Long (Twitter::Error::BadRequest)
ans this one:
undefined local variable or method `tweet' for main:Object (NameError)
I hope u have the solution ! Have a great day.
get the id of the twitter you want to send a message with. You can use this link to get an Id.
Then you can execute the command:
client.create_direct_message('<replace with the twitter Id you obtained>',"hello this is a test!",options={})
the tweet.user in your example means, there is a tweets-table(a model class) and the twitter Id is saved in the user-column.

Implement caching in Sinatra app to handle twitter rate limits

I have written a small Sinatra script to fetch 2 tweets of a user and display 10 retweeters in the descending order of their no. of followers:
Puzzle/puzzle.rb
require 'twitter'
require 'json'
require 'sinatra'
#require 'haml'
client = Twitter::REST::Client.new do |config|
config.consumer_key = ""
config.consumer_secret = ""
config.access_token = ""
config.access_token_secret = ""
end
set :server, 'webrick'
set :haml, :format => :html5
get '/' do
content_type :json
arr = []
retweeters = client.retweeters_of(429627812459593728)
retweeters.each do |retweeter|
ob = {}
ob[:name] = retweeter.name
ob[:followers_count] = retweeter.followers_count
arr.push(ob)
end
# remove the duplicates and sort on the users with the most followers,
sorted_influencers = arr.sort_by { |hsh| hsh[:followers_count] }
sorted_influencers.reverse!
sorted_influencers[0..9].to_s
end
I am trying to handle rate limits.
How to cache the json output to avoid rate limit exceeding?
Assuming you keep your very simple scenario, you could use a small custom class to store the information and provide thread-safe methods (it is not clear from your question where your problem exactly resides, but this one problem will arise anyway):
require 'json'
require 'sinatra'
require 'date'
require 'thread'
require 'twitter'
set :server, 'webrick'
set :haml, :format => :html5
class MyCache
def initialize()
#mutex = Mutex.new
#last_update = DateTime.new # by default, -4732 BC
#client = Twitter::REST::Client.new do |config|
config.consumer_key = ""
config.consumer_secret = ""
config.access_token = ""
config.access_token_secret = ""
end
end
def get_cache
#mutex.synchronize do
if DateTime.now - #last_update > 10.0 / (3600 * 24)
#last_update = DateTime.now
arr = []
retweeters = #client.retweeters_of(429627812459593728)
retweeters.each do |retweeter|
ob = {}
ob[:name] = retweeter.name
ob[:followers_count] = retweeter.followers_count
arr.push(ob)
end
# remove the duplicates and sort on the users with the most followers,
sorted_influencers = arr.sort_by { |hsh| hsh[:followers_count] }
sorted_influencers.reverse!
#cache = sorted_influencers[0..9].to_s
end
#cache
end
end
end
my_cache = MyCache.new
get '/' do
content_type :json
my_cache.get_cache
end
This version now includes everything needed. I use the #client to store the instance of the twitter client (I suppose it's reusable), also note how the whole code is inside the if statement, and at last we update #cache. If you are unfamiliar with Ruby, the value of a block is determined by its last expression, so when I write #cache alone it is as if I had written return #cache.

Ruby's Twitter REST api not working

I am trying to use the ruby interface for twitter api.The Streaming Api is working but Rest spi is not.
Code :
require 'rubygems'
require 'twitter'
client = Twitter::REST::Client.new do |config|
# you must set up an application using Twitter's developer site, and set these values:
# (See the Configuration example)
config.consumer_key = "xxx"
config.consumer_secret = "xxx"
config.access_token = "xxx-xxx"
config.access_token_secret = "xxx"
end
puts client.user('xyz')
I am always getting the following error -
Faraday::Builder is now Faraday::RackBuilder.
/home/atul/.rvm/gems/ruby-2.1.0/gems/twitter-5.5.1/lib/twitter/rest/client.rb:143:in `rescue in request': execution expired (Twitter::Error)
from /home/atul/.rvm/gems/ruby-2.1.0/gems/twitter-5.5.1/lib/twitter/rest/client.rb:131:in `request'
from /home/atul/.rvm/gems/ruby-2.1.0/gems/twitter-5.5.1/lib/twitter/rest/client.rb:97:in `get'
from /home/atul/.rvm/gems/ruby-2.1.0/gems/twitter-5.5.1/lib/twitter/rest/api/utils.rb:118:in `object_from_response'
from /home/atul/.rvm/gems/ruby-2.1.0/gems/twitter-5.5.1/lib/twitter/rest/api/users.rb:257:in `user'
from actresses.rb:17:in `<main>'
I am trying to increase the time out because of this solution but am able to figure out how to do that.
I don't understand what am I doing wrong as the same code is working for Streaming api after making the appropriate changes.
I'm not entirely clear on what kind of an issue you're having, but to set the timeout you may want to try
custom_options = Twitter::Default::CONNECTION_OPTIONS.merge(
request: { open_timeout: 5, timeout: 20 } ) # default timeout is 10
client = Twitter::REST::Client.new do |config|
# you must set up an application using Twitter's developer site, and set these values:
# (See the Configuration example)
config.consumer_key = "xxx"
config.consumer_secret = "xxx"
config.access_token = "xxx-xxx"
config.access_token_secret = "xxx"
config.connection_options = custom_options
end
I'm not sure if that will resolve that error, though.

Get list timeline by using Twitter gem

I want to get list timeline by using Twitter gem.
How can I call GET lists/statuses REST API from Twitter gem?
https://dev.twitter.com/docs/api/1.1/get/lists/statuses
I've searched through documentation but couldn't found proper method.
http://rdoc.info/gems/twitter
Problem solved
I overlooked the method list_timeline. It serves as lists/statuses.
You can use 'twitter' gem.
Create an app on Twitter. You need to give to it read & write access just for sake of your own experiments.
Use this sample code (with your credentials you've got from Twitter). Please note that I'm using some public list URI (list = URI.parse('https://twitter.com/sferik/presidents')
p client.list_timeline(list))
client = Twitter::REST::Client.new do |config|
config.consumer_key = "YOUR_CONSUMER_KEY"
config.consumer_secret = "YOUR_CONSUMER_SECRET"
config.access_token = "YOUR_ACCESS_TOKEN"
config.access_token_secret = "YOUR_ACCESS_SECRET"
end
list = URI.parse('https://twitter.com/sferik/presidents')
client.list_timeline(list)
for more info please visit Twitter gem docs.
I suggest you start by reading the gem documentation. You'll also have to register your application with twitter to get your oauth parameters.
https://github.com/sferik/twitter
To get the timeline from a list using Twitter gem :
client = Twitter::REST::Client.new do |config|
config.consumer_key = "YOUR_CONSUMER_KEY"
config.consumer_secret = "YOUR_CONSUMER_SECRET"
config.access_token = "YOUR_ACCESS_TOKEN"
config.access_token_secret = "YOUR_ACCESS_SECRET"
end
# For each list of the user
client.lists.each do |list|
# Get the timeline with the list ID
client.list_timeline(list.id).each do |tweet|
puts tweet.text
end
end

Resources