GithubHelp home page GithubHelp logo

muffinista / chatterbot Goto Github PK

View Code? Open in Web Editor NEW
493.0 32.0 106.0 645 KB

A straightforward ruby-based Twitter Bot Framework, using OAuth to authenticate.

Home Page: http://muffinlabs.com/

License: MIT License

Ruby 100.00%

chatterbot's Introduction

Chatterbot

Hi friends, I'm finally archiving this project as of March 2023. I really enjoyed using and maintaining Chatterbot, and I hope it was helpful for other people too. ❤️

Hey! This is Chatterbot 2.0. There have been some breaking changes from older versions of the library, and it doesn't support MySQL anymore. If you are looking for the old version, you can try the 1.0 branch

Chatterbot is a Ruby library for making bots on Twitter. It's great for rapid development of bot ideas. It handles all of the basic Twitter API features -- searches, replies, tweets, retweets, etc. and has a simple blacklist/whitelist system to help minimize spam and unwanted data.

Build Status

Features

  • Handles search queries and replies to your bot
  • Use a simple scripting language, or extend a Bot class if you need it
  • Wraps the Twitter gem so you have access to the entire Twitter API
  • Simple blocklist system to limit your annoyance of users
  • Avoid your bot making a fool of itself by ignoring tweets with certain bad words

Using Chatterbot

Chatterbot has a documentation website. It's a work-in-progress. You can also read the gem documentation.

Make a Twitter account

First thing you'll need to do is create an account for your bot on Twitter. That's the easy part.

Run the generator

Chatterbot comes with a script named chatterbot-register which will handle two tasks -- it will authorize your bot with Twitter and it will generate a skeleton script, which you use to implement your actual bot.

Write your bot

A bot using chatterbot can be as simple as this:

exclude "http://"
blocklist "mean_user, private_user"

puts "checking my timeline"
home_timeline do |tweet|
    # i like to favorite things
    favorite tweet
end

puts "checking for replies to my tweets and mentions of me"
replies do |tweet|
  text = tweet.text
  puts "message received: #{text}"
  src = text.gsub(/@echoes_bot/, "#USER#")  

  # send it back!
  reply src, tweet
end

Or you can write a bot using more traditional ruby classes, extend it if needed, and use it like so:

  class MyBot < Chatterbot::Bot
     def do_stuff
       home_timeline do |tweet|
         puts "I like to favorite things"
         favorite tweet
       end
    end
  end

Chatterbot can actually generate a template bot file for you, and will walk you through process of getting a bot authorized with Twitter.

That's it!

Chatterbot uses the the Twitter gem (https://github.com/sferik/twitter) to handle the underlying API calls. Any calls to the search/reply methods will return Twitter::Status objects, which are basically extended hashes. If you find yourself pushing the limits of Chatterbot, it's very possible that you should just be using the Twitter gem directly.

Streaming

Chatterbot used to have some basic support for the Streaming API, but I've removed it because Twitter is removing and/or restricting access to those APIs. If you need the Streaming API, I highly recommend using the the Twitter gem. Chatterbot is built on the Twitter gem, it works great, and has support for streaming.

What Can I Do?

Here's a list of the important methods in the Chatterbot DSL:

search -- You can use this to perform a search on Twitter:

search("pizza") do |tweet|
  tweet "I just read another tweet about pizza"
end

replies -- Use this to check for replies and mentions:

replies do |tweet|
  reply "#USER# Thanks for contacting me!", tweet
end

Note that the string #USER# will be replaced with the username of the person who sent the original tweet.

home_timeline -- This call will return tweets from the bot's home timeline -- this will include tweets from accounts the bot follows, as well as the bot's own tweets:

home_timeline do |tweet|
  puts tweet.text # this is the actual tweeted text
  favorite tweet # i like to fave tweets
end

direct_messages -- This will return any DMs for the bot:

direct_messages do |dm|
  puts dm.text

  # send a DM back to the user
  direct_message "Hey, I got your message at #{Time.now.to_s}", dm.sender
end

tweet -- send a Tweet out for this bot:

tweet "I AM A BOT!!!"

reply -- reply to another tweet:

reply "THIS IS A REPLY TO #USER#!", original_tweet

retweet -- Chatterbot can retweet tweets as well:

  search "xyzzy" do |tweet|
    retweet(tweet.id)
  end

direct_message -- send a DM to a user:

direct_message "I am a bot sending you a direct message", user

(NOTE: you'll need to make sure your bot has permission to send DMs)

blocklist -- you can use this to specify a list of users you don't want to interact with. If you put the following line at the top of your bot:

blocklist "user1, user2, user3"

None of those users will trigger your bot if they come up in a search. However, if a user replies to one of your tweets or mentions your bot in a tweet, you will receive that tweet when calling the reply method.

exclude -- similarly, you can specify a list of words/phrases which shouldn't trigger your bot. If you use the following:

exclude "spam"

Any tweets or mentions with the word 'spam' in them will be ignored by the bot. If you wanted to ignore any tweets with links in them (a wise precaution if you want to avoid spreading spam), you could call:

exclude "http://"

followers -- get a list of your followers. This is an experimental feature but should work for most purposes.

For more details, check out dsl.rb in the source code.

Direct Client Access

If you want to do something not provided by the DSL, you have access to an instance of Twitter::Client provided by the client method. In theory, you can do something like this in your bot to unfollow users who DM you:

client.direct_messages_received(:since_id => since_id).each do |m|
    client.unfollow(m.user.name)
end

Authorization

Before you setup a bot for the first time, you will need to register an application with Twitter. Twitter requires all API communication to be via an app which is registered on Twitter. I would set one up and make it part of Chatterbot, but unfortunately Twitter doesn't allow developers to publicly post the OAuth consumer key/secret that you would need to use. If you're planning to run more than one bot, you only need to do this step once -- you can use the same app setup for other bots too.

The helper script chatterbot-register will walk you through most of this without too much hand-wringing. And, if you write a bot without chatterbot-register, you'll still be sent through the authorization process the first time you run your script. But if you prefer, here's sthe instructions if you want to do it yourself:

  1. Setup your own app on Twitter.

  2. Put in whatever name, description, and website you want.

  3. Take the consumer key/consumer secret values, and either run your bot, and enter them in when prompted, or store them in a config file for your bot. (See below for details on this). It should look like this:

      ---
      :consumer_secret: CONSUMER SECRET GOES HERE
      :consumer_key: CONSUMER KEY GOES HERE
    

When you do this via the helper script, chatterbot will point you at the URL in Step #1, then ask you to paste the same values as in Step #4.

Once this is done, you will need to setup authorization for the actual bot with Twitter. At the first run, you'll get a message asking you to go to a Twitter URL, where you can authorize the bot to post messages for your account or not. If you accept, you'll get a PIN number back. You need to copy this and paste it back into the prompt for the bot. Hit return, and you should be all set.

This is obviously a bunch of effort, but once you're done, you're ready to go!

Configuration

Chatterbot offers a couple different methods of storing the config for your bot:

  1. Your credentials can be stored as variables in the script itself. chatterbot-register will do this for you. If your bot is using replies or searches, that data will be written to a YAML file. NOTE this is a bad practice for scripts that are stored in a source control system such as git, or are publicly available on a site like github.
  2. In a YAML file with the same name as the bot, so if you have botname.rb or a Botname class, store your config in botname.yaml
  3. In a global config file at /etc/chatterbot.yml -- values stored here will apply to any bots you run.
  4. In another global config file specified in the environment variable 'chatterbot_config'.
  5. In a global.yml file in the same directory as your bot. This gives you the ability to have a global configuration file, but keep it with your bots if desired.

Running Your Bot

There's a couple ways of running your bot:

Run it on the command-line whenever you like. Whee!

Run it via cron. Here's an example of running a bot every two minutes

*/2 * * * * . ~/.bash_profile; cd /path/to/bot/;  ./bot.rb

Run it as a background process. Just put the guts of your bot in a loop like this:

loop do
  search "twitter" do |tweet|
    # here you could do something with a tweet
    # if you want to retweet
    retweet(tweet.id)
  end

  replies do |tweet|
    # do stuff
  end

  sleep 60
end

Blocklists

Not everyone wants to hear from your bot. To keep annoyances to a minimum, Chatterbot has a simple blocklist tool. Using it is as simple as:

blocklist "mean_user, private_user"

You should really respect the wishes of users who don't want to hear from your bot, and add them to your blocklist whenever requested.

There's also an 'exclude' method which can be used to add words/phrases you might want to ignore -- for example, if you wanted to ignore tweets with links, you could do something like this:

exclude "http://"

Contributing to Chatterbot

Pull requests for bug fixes and new features are eagerly accepted. Since this code is based off of actual Twitter bots, please try and maintain compatability with the existing codebase. If you are comfortable writing a spec for any changed code, please do so. If not, I can work with you on that.

Copyright/License

Copyright (c) 2018 Colin Mitchell. Chatterbot is distributed under the MIT licence -- Please see LICENSE.txt for further details.

http://muffinlabs.com

chatterbot's People

Contributors

aisflat439 avatar calebfenton avatar davidenglishmusic avatar evandcoleman avatar hassanshaikley avatar jackturnbull avatar jamesjefferies avatar millisami avatar muffinista avatar pedrovereza avatar ryantg avatar spidergears avatar stefl avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

chatterbot's Issues

only_interact_with_following ?

I’m hoping to only retweet users that my account is following. Is there anything akin to only_interact_with_following?

More details: I’ll search for phrases and then retweet results, but I only want my results to have accounts that I’m following (I don’t care if they’re following me).

Thanks.

replies block is not working

replies do |tweet|
  puts "It's a tweet!"
end

Even something as simple as the above code is not working.

Can someone else verify too?

Specs for search are failing

Hi,

I cloned the repo and tried to run rspec, I found out that there are 3 specs failing

 Failures:

  1) Chatterbot::Search accepts multiple searches at once
     Failure/Error: bot.search_client.should_receive(:search).with("foo -include:retweets", {:result_type=>"recent"})
       Mock Twitter::Client received :search with unexpected arguments
         expected: ("foo -include:retweets", {:result_type=>"recent"})
              got: ("foo -include:retweets", {:result_type=>"recent", :since_id=>50}), ("bar -include:retweets", {:result_type=>"recent", :since_id=>50})
     # ./spec/search_spec.rb:43:in `block (2 levels) in <top (required)>'

  2) Chatterbot::Search accepts extra params
     Failure/Error: bot.search_client.should_receive(:search).with("foo -include:retweets", {:lang => "en", :result_type=>"recent"})
       Mock Twitter::Client received :search with unexpected arguments
         expected: ("foo -include:retweets", {:lang=>"en", :result_type=>"recent"})
              got: ("foo -include:retweets", {:lang=>"en", :result_type=>"recent", :since_id=>50})
     # ./spec/search_spec.rb:53:in `block (2 levels) in <top (required)>'

  3) Chatterbot::Search accepts a single search query
     Failure/Error: bot.search_client.should_receive(:search).with("foo -include:retweets", {:result_type=>"recent"})
       Mock Twitter::Client received :search with unexpected arguments
         expected: ("foo -include:retweets", {:result_type=>"recent"})
              got: ("foo -include:retweets", {:result_type=>"recent", :since_id=>50})
     # ./spec/search_spec.rb:62:in `block (2 levels) in <top (required)>'

Finished in 1.57 seconds
139 examples, 3 failures

I didn't touch the code, so I assume it happens with everyone.

I'm getting a lot of 'execution expired' errors when tweeting.

Hi, I'm getting a lot of execution expired errors when sending tweets.

I se over at sferik/twitter-ruby#401 that the solution is to adjust the Twitter config setup, the default being…

Twitter.configure do |config|
  config.connection_options = Twitter::Default:: CONNECTION_OPTIONS.merge(:request => { 
    :open_timeout => 5,
    :timeout => 10
  })
end

Is there a more DSL way to set these connection options to make the timeout longer?

Bot replies to same Tweet every time script runs

How do I make sure the bot doesn't reply to the same tweet every time?

The following loop replies to tweets it has already replied to each time the script runs.

replies do |tweet|
  reply "Hi #USER#, thanks for your interest.", tweet
end

Can an app get banned?

My app no longer seems to work anymore. Does anyone know about this happening and how to avoid it?

deprecation warning

Users/buzz/.rvm/gems/ruby-2.2.0/gems/chatterbot-1.0.1/lib/chatterbot/tweet.rb:29:in reply': [DEPRECATION] #[:id] is deprecated. Use #id to fetch the value.`

I'm using streaming with the reply functionality. I would love to take a stab at fixing it.. where should i look?

Can't search multiple words.

Hey,
I am trying to search further back. How young do tweets have to be for them to be returned when search is called? Is it possible to make this bot search earlier?

Thanks,

Running on Heroku

Any experience running this on Heroku? I'm getting the following, which doesn't happen on my local environment. It's almost like the working directory or path isn't set right. I'm new to Ruby so I'm having difficulty debugging.

2015-10-07T07:12:01.854202+00:00 heroku[slug-compiler]: Slug compilation started
2015-10-07T07:12:01.854211+00:00 heroku[slug-compiler]: Slug compilation finished
2015-10-07T07:12:02.179574+00:00 heroku[worker.1]: State changed from crashed to starting
2015-10-07T07:12:05.156281+00:00 heroku[worker.1]: Starting process with command ruby suphypebot.rb
2015-10-07T07:12:05.836093+00:00 heroku[worker.1]: State changed from starting to up
2015-10-07T07:12:07.067031+00:00 app[worker.1]: from suphypebot.rb:4:in <main>' 2015-10-07T07:12:07.067009+00:00 app[worker.1]: from /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:inrequire'
2015-10-07T07:12:07.066962+00:00 app[worker.1]: /app/vendor/ruby-2.0.0/lib/ruby/2.0.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- chatterbot/dsl (LoadError)
2015-10-07T07:12:07.882005+00:00 heroku[worker.1]: State changed from up to crashed
2015-10-07T07:12:07.870906+00:00 heroku[worker.1]: Process exited with status 1

Also, I used the ClearDB addon for mysql, and Heroku's config vars to set the corresponding db_uri. Not sure if that's correct - can't test the DB connection until this is fixed

chatterbot-register blows up after pin entry

After you enter the pin, I get this:

/Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/gems/chatterbot-0.6.2/lib/chatterbot/client.rb:137:in `get_screen_name': uninitialized constant Chatterbot::Client::JSON (NameError)
    from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/gems/chatterbot-0.6.2/lib/chatterbot/client.rb:160:in `login'
    from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/gems/chatterbot-0.6.2/lib/chatterbot/client.rb:92:in `require_login'
    from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/gems/chatterbot-0.6.2/bin/chatterbot-register:90:in `<top (required)>'
    from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/bin/chatterbot-register:23:in `load'
    from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/bin/chatterbot-register:23:in `<main>'
/Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/gems/chatterbot-0.6.2/lib/chatterbot/client.rb:137:in `get_screen_name': uninitialized constant Chatterbot::Client::JSON (NameError)
    from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/gems/chatterbot-0.6.2/lib/chatterbot/client.rb:160:in `login'
    from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/gems/chatterbot-0.6.2/lib/chatterbot/client.rb:92:in `require_login'
    from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/gems/chatterbot-0.6.2/bin/chatterbot-register:90:in `<top (required)>'
    from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/bin/chatterbot-register:23:in `load'
    from /Users/jeremyweiland/.rvm/gems/ruby-1.9.3-p194@icrter/bin/chatterbot-register:23:in `<main>'

Place / Location for tweet or reply?

Hi,

is it possible to set a place or a location for reply or tweet?

The Bot i created needs to set a random location somewhere in the world. It's part of the joke, because it's a parody account of an game character. :)

Thanks.

401 when streaming. Oauth_timestamp?

Hi,

Love this project :-).

I am seeing this errors trying to stream: /.rvm/gems/ruby-2.2.1/gems/twitter-5.14.0/lib/twitter/rest/response/raise_error.rb:15:in `on_complete': Could not authenticate you. (Twitter::Error::Unauthorized)

I have done some research and I think it's due to the oauth timestamp. My system clock seems to be in sync though. Credentials must be ok since everything else is working...

Ideas? :-)

Thanks!

Reply Tweets must start with an @ mention

It looks to me like reply tweets must start with an @ mention. This had me stuck for quite some time, so I created a small PR to update the examples documentation to clarify this point.

Thank you for this incredible gem.

#57

How to setup the DB to store the config and tweets as well?

I'm little confused.

What should be the table name and its columns to store the configs and tweets?

I mean the structure of the schema.

And do I need to reauthorize if I've already authorized using Yml file and now I want to move to db??

Do I have to put this in the yml file or else where?

:chatterbot_config: mysql://localhost/my_bot?user=root

chatterbot-register no such file or directory

Hi, chatterbot-register.rb fails on line 72 trying to rename the config file that doesn't exist yet.
I don't know if it's the right way of running the script but I simply copied it into the folder where I wanted my skeleton and ran it.

Error is
chatterbot-register.rb:72:in 'rename': No such file or directory @ sys_fail2 - (/Users/xxx/Workspace/bot/tmp_bot_name.yml, /Users/xxx/Workspace/bot/accountname.yml) (Errno::ENOENT)

I solved it by making it actually write the config file before the rename, I can issue a pull request if needed.

Thanks.

Breaking out of nested direct_messages block

Hello @muffinista

I have created a nested level 2 direct_messagesblock. Any ideas on how I would break out of it, and return to the level 1 direct_messagesblock.

Using break I get the error message;
``block (2 levels) in

': break from proc-closure (LocalJumpError)`

since_id parameter is invalid

Getting this error when trying to run home_timeline on 0.9.3. Twitter is 5.8.0 and Ruby 2.2.0.

Here is the error:

check for home_timeline tweets since 0
/Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-5.8.0/lib/twitter/rest/response/raise_error.rb:17:in `on_complete': since_id parameter is invalid. (Twitter::Error::BadRequest)
    from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/faraday-0.9.1/lib/faraday/response.rb:9:in `block in call'
    from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/faraday-0.9.1/lib/faraday/response.rb:57:in `on_complete'
    from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/faraday-0.9.1/lib/faraday/response.rb:8:in `call'
    from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/faraday-0.9.1/lib/faraday/request/url_encoded.rb:15:in `call'
    from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/faraday-0.9.1/lib/faraday/request/multipart.rb:14:in `call'
    from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-5.8.0/lib/twitter/rest/request/multipart_with_file.rb:18:in `call'
    from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/faraday-0.9.1/lib/faraday/rack_builder.rb:139:in `build_response'
    from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/faraday-0.9.1/lib/faraday/connection.rb:377:in `run_request'
    from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/faraday-0.9.1/lib/faraday/connection.rb:140:in `get'
    from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-5.8.0/lib/twitter/rest/client.rb:92:in `request'
    from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-5.8.0/lib/twitter/rest/client.rb:63:in `get'
    from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-5.8.0/lib/twitter/request.rb:22:in `perform'
    from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-5.8.0/lib/twitter/request.rb:42:in `perform_with_objects'
    from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-5.8.0/lib/twitter/rest/utils.rb:48:in `perform_with_objects'
    from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/twitter-5.8.0/lib/twitter/rest/timelines.rb:115:in `home_timeline'
    from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/chatterbot-0.9.3/lib/chatterbot/home_timeline.rb:18:in `home_timeline'
    from /Users/jack.turnbull/.rbenv/versions/2.2.0/lib/ruby/gems/2.2.0/gems/chatterbot-0.9.3/lib/chatterbot/dsl.rb:43:in `home_timeline'
    from ./bot.rb:26:in `<main>'

And my code:

#!/usr/bin/env ruby

require 'rubygems'
require 'chatterbot/dsl'

consumer_key KEY
consumer_secret KEY

secret KEY
token KEY

# remove this to send out tweets
debug_mode

# remove this to update the db
no_update
# remove this to get less output when running
verbose

home_timeline do |tweet|
  puts tweet
end

Not trying to do anything too difficult I don't think. Any ideas?

'Search' isn't working, throws errors

I'm having a bit of a problem with the Search function in your Chatterbot. I just want to preface this issue with the fact that I know almost nothing about Ruby or Twitter's API, so if I've done something incredibly noobish it's because I'm a noob. Go easy on me.

I tried to do a basic search and reply using this example code in the readme:

search("'surely you must be joking'") do |tweet|
    reply "@#{tweet_user(tweet)} I am serious, and don't call me Shirley!", tweet
end

But I get this error every time:

/Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/twitter-5.8.0/lib/twitter/rest/response/raise_error.rb:17:in `on_complete': Missing or invalid url parameter. (Twitter::Error::Forbidden)
    from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/faraday-0.9.0/lib/faraday/response.rb:9:in `block in call'
    from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/faraday-0.9.0/lib/faraday/response.rb:57:in `on_complete'
    from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/faraday-0.9.0/lib/faraday/response.rb:8:in `call'
    from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/faraday-0.9.0/lib/faraday/request/url_encoded.rb:15:in `call'
    from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/faraday-0.9.0/lib/faraday/request/multipart.rb:14:in `call'
    from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/twitter-5.8.0/lib/twitter/rest/request/multipart_with_file.rb:18:in `call'
    from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/faraday-0.9.0/lib/faraday/rack_builder.rb:139:in `build_response'
    from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/faraday-0.9.0/lib/faraday/connection.rb:377:in `run_request'
    from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/faraday-0.9.0/lib/faraday/connection.rb:140:in `get'
    from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/twitter-5.8.0/lib/twitter/rest/client.rb:92:in `request'
    from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/twitter-5.8.0/lib/twitter/rest/client.rb:63:in `get'
    from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/twitter-5.8.0/lib/twitter/rest/search.rb:32:in `search'
    from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/chatterbot-0.9.1/lib/chatterbot/search.rb:28:in `block in search'
    from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/chatterbot-0.9.1/lib/chatterbot/search.rb:26:in `each'
    from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/chatterbot-0.9.1/lib/chatterbot/search.rb:26:in `search'
    from /Users/WilyKit/.rvm/gems/ruby-2.1.3/gems/chatterbot-0.9.1/lib/chatterbot/dsl.rb:23:in `search'

Any ideas why I can't make a simple search? Posting tweets works just fine. Any help is appreciated.

Search still showing retweets

I think I'm doing this wrong. When I include skip_retweets, I still get retweets in the results. My function is a "search and reply"

hypothetical example:

search("'lovely bones'", :skip_retweets => "true") do |tweet|
  reply "#USER# Lovely bones is a great book", tweet
end

I also tried:
skip_retweets:true
and
:skip_retweets => true

Can you explain how to correctly skip retweets?

2nd issue: That search will bring up things like, "it is a lovely day today. my bones feel great."

Is there a way to only search the EXACT phrase?

Thanks.

Documentation fix

Assuming this isn't a priority, but I'm still using this gem and thought I'd share that token and secret are incorrect in the docs, and instead it should be access_token and access_token_secret

In a separate YAML config file. Create a file named botname.yaml – the botname part must match your bot’s username EXACTLY. Put the following contents, pasting the credential values that you just generated:

  ---
  :consumer_secret: Consumer Secret (API Secret) GOES HERE
  :consumer_key: Consumer Key (API Key) GOES HERE
  :access_token: Access Token GOES HERE
  :access_token_secret: Access Token Secret GOES HERE
```

chatterbot-register failures

after pasting the API Key and API Secret i get a raise on this line:

/Users/vincentcavallo/.rvm/gems/ruby-2.3.0/gems/oauth-0.5.0/lib/oauth/consumer.rb:217:intoken_request': 401 Authorization Required (OAuth::Unauthorized)`

I tried setting up a yml file following the manual instructions and then running a bot command (tweet, for instance) but that route also fails with this:

/Users/vincentcavallo/.rvm/gems/ruby-2.3.0/gems/twitter-5.14.0/lib/twitter/rest/response/raise_error.rb:15:inon_complete': Could not authenticate you. (Twitter::Error::Unauthorized)`

I feel like I've followed all the different auth strategies offered by the documentation and nothing has worked. Any suggestions?

How to filter duplicate search result?

I setup the chatterbot search in a loop.

require 'chatterbot/dsl'
loop do
  puts "Polling ... #{Time.now}"
  search("'cloudfoundry'") do |tweet|
    $stdout.puts tweet.inspect
  end

  sleep 60
end

But it always gets the same duplicate result. How to filter it out coz if I store it in DB, then the duplicate is aslo stored.

{:created_at=>"Wed, 07 Dec 2011 07:34:39 +0000", :from_user=>"UDCPStatus", :from_user_id=>425676094, :from_user_id_str=>"425676094", :from_user_name=>"UDCP Status", :geo=>nil, :id=>144318892062416896, :id_str=>"144318892062416896", :iso_language_code=>"ja", :metadata=>{:result_type=>"recent"}, :profile_image_url=>"http://a3.twimg.com/sticky/default_profile_images/default_profile_4_normal.png", :source=>"&lt;a href=&quot;http://udcp.net/status/&quot; rel=&quot;nofollow&quot;&gt;Kiyoshi&lt;/a&gt;", :text=>"【From http://t.co/ADejFNda】http://t.co/iE5YTJSv WEBサーバー正常稼働中です。 16:33:24", :to_user=>nil, :to_user_id=>nil, :to_user_id_str=>nil, :to_user_name=>nil}
{:created_at=>"Wed, 07 Dec 2011 07:34:37 +0000", :from_user=>"UDCPStatus", :from_user_id=>425676094, :from_user_id_str=>"425676094", :from_user_name=>"UDCP Status", :geo=>nil, :id=>144318884042915840, :id_str=>"144318884042915840", :iso_language_code=>"ja", :metadata=>{:result_type=>"recent"}, :profile_image_url=>"http://a3.twimg.com/sticky/default_profile_images/default_profile_4_normal.png", :source=>"&lt;a href=&quot;http://udcp.net/status/&quot; rel=&quot;nofollow&quot;&gt;Kiyoshi&lt;/a&gt;", :text=>"【From http://t.co/ADejFNda】http://t.co/2VOlnibh WEBサーバー正常稼働中です。 16:33:22", :to_user=>nil, :to_user_id=>nil, :to_user_id_str=>nil, :to_user_name=>nil}

chatterbot-register "Looks like something went wrong, better luck next time!"

The following happens every time. I've made sure all creds are correct.

****************************************
****************************************
****        API SETUP TIME!         ****
****************************************
****************************************
Hey, looks like you need to get an API key from Twitter before you can get started.
Please hit enter, and I will send you to https://dev.twitter.com/apps/new to start the process.
(If it doesn't work, you can open a browser and paste the URL in manually)

Hit Enter to continue.





Paste the 'Consumer Key' here: ***
Paste the 'Consumer Secret' here: ***
****************************************
****************************************
****        BOT AUTH TIME!          ****
****************************************
****************************************
You need to authorize your bot with Twitter.

Please login to Twitter under the bot's account. When you're ready, hit Enter.

Your browser will open with the following URL, where you can authorize the bot.

https://api.twitter.com/oauth/authorize?oauth_token=***

If that doesn't work, you can open the URL in your browser manually.


Hit enter to start.


Paste your PIN and hit enter when you have completed authorization.

> ***
Looks like something went wrong, better luck next time!

Keyword Based Stream

I found the streaming_tweets in dsl.rb however was not possible to generate a keyword (list) based stream.

Is that possible in the current version?

Feature request : Add media to tweet

can we add media to tweets ? I think looking at the code this would only be achievable by changing the update method to use the client client.update_with_media method or preferably add another method around that

chatterbot-register access_token and secret swapped.

Hi Muffinista,

Thanks for this awesome gem. I just wanted to let you know that when I used 'chatterbot-register' to setup my bot, the generated .yml file had the access_token and access_token_secret incorrectly switched.

I manually switched the YAML keys and the bot started working correctly.

I'm also experiencing and issue when trying to use "use_streaming"... without it, the bot works fine. With it I get an:
gems/twitter-5.16.0/lib/twitter/streaming/response.rb:21:in 'on_headers_complete': Twitter::Error::Unauthorized

Similar to what I experienced when the yml keys were incorrectly set. Thanks for the cool gem.

Follow a user

Is it possible to follow a user using chatterbot? So if someone tweets, possible to retweet and follow user?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.