jaimeiniesta-hashtag_retweet_bot 0.1.2
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/Manifest +8 -0
- data/README.markdown +66 -0
- data/Rakefile +15 -0
- data/bin/hashtag_retweet_bot +21 -0
- data/create_db_table.rb +19 -0
- data/feed.rb +10 -0
- data/hashtag_retweet_bot.gemspec +50 -0
- data/lib/bot.rb +74 -0
- metadata +128 -0
data/Manifest
ADDED
data/README.markdown
ADDED
@@ -0,0 +1,66 @@
|
|
1
|
+
# Hashtag retweet bot
|
2
|
+
|
3
|
+
A bot that retweets all tweets tagged by a certain hashtag. Ideal for conferences, meetup groups, communities, etc.
|
4
|
+
|
5
|
+
As an example, let's say you want to retweet every twitt found with the hashtag #icecream every 5 minutes (300 seconds). This ruby gem will let you do it as easily as running:
|
6
|
+
|
7
|
+
hashtag_retweet_bot icecream 300
|
8
|
+
|
9
|
+
## Installation
|
10
|
+
|
11
|
+
gem install jaimeiniesta-hashtag_retweet_bot --source http://gems.github.com
|
12
|
+
|
13
|
+
Create the database:
|
14
|
+
|
15
|
+
mysqladmin create my_conference_db
|
16
|
+
|
17
|
+
Create a directory where you will run the bot from, and a config directory with 2 files in it: _database.yml_ for your database settings and _bot.yml_ for the login/password of the twitter account.
|
18
|
+
|
19
|
+
mkdir -p bot_for_my_conference/config
|
20
|
+
cd config/bot_for_my_conference
|
21
|
+
touch database.yml bot.yml
|
22
|
+
|
23
|
+
Put the credentials for the twitter account in _bot.yml_:
|
24
|
+
|
25
|
+
login: my_conference_bot
|
26
|
+
password: secret
|
27
|
+
|
28
|
+
Put the database connection attributes in _database.yml_:
|
29
|
+
|
30
|
+
adapter: mysql
|
31
|
+
username: root
|
32
|
+
host: localhost
|
33
|
+
password:
|
34
|
+
database: my_conference_db
|
35
|
+
|
36
|
+
And create the table on the database that will hold the tweets:
|
37
|
+
|
38
|
+
hashtag_retweet_bot create_db_table
|
39
|
+
|
40
|
+
## Run it
|
41
|
+
|
42
|
+
Now the only thing left to do is running the bot, telling it what tag to follow, like that:
|
43
|
+
|
44
|
+
hashtag_retweet_bot tag_to_follow
|
45
|
+
|
46
|
+
This will launch the bot with a default pause of 180 seconds. If you want a different time schedule you can specify other value for the seconds parameter, but I've experienced Twitter connection problems when trying to update every 60 seconds or less:
|
47
|
+
|
48
|
+
hashtag_retweet_bot tag_to_follow seconds_between_updates
|
49
|
+
|
50
|
+
Example:
|
51
|
+
|
52
|
+
hashtag_retweet_bot icecream
|
53
|
+
hashtag_retweet_bot icecream 240
|
54
|
+
|
55
|
+
## Live examples
|
56
|
+
|
57
|
+
Some twitterbots using hashtag_retweet_bot:
|
58
|
+
|
59
|
+
[@euruko_bot](http://twitter.com/euruko_bot)
|
60
|
+
[@confrorbot](http://twitter.com/confrorbot)
|
61
|
+
|
62
|
+
## Credits
|
63
|
+
|
64
|
+
Original idea and script by [Mark Connell](http://github.com/mconnell) for Scotland on Rails 2009. Customization for Euruko '09, and some improvements by [Jaime Iniesta](http://github.com/jaimeiniesta). Some improvements and gemification by [Balint Erdi](http://github.com/balinterdi).
|
65
|
+
|
66
|
+
Please send feedback and bug reports to <jaimeiniesta@gmail.com>
|
data/Rakefile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
|
5
|
+
Echoe.new('hashtag_retweet_bot', '0.1.2') do |p|
|
6
|
+
p.description = "Script that listens to a tag and retweets messages with that tag. Originally made for Scotland on Rails '09 by Mark Connell (http://github.com/rubaidh)"
|
7
|
+
p.url = "http://github.com/jaimeiniesta/hashtag_retweet_bot"
|
8
|
+
p.author = "Jaime Iniesta"
|
9
|
+
p.email = "jaimeiniesta@gmail.com"
|
10
|
+
p.ignore_pattern = ["tmp/*", "config/*", "script/*", "*.txt", "pkg"]
|
11
|
+
p.development_dependencies = ["twibot >=0.1.7", "activerecord", "pauldix-feedzirra >=0.0.12"]
|
12
|
+
p.runtime_dependencies = ["twibot >=0.1.7", "activerecord", "pauldix-feedzirra >=0.0.12"]
|
13
|
+
end
|
14
|
+
|
15
|
+
Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), '..', 'lib', 'bot')
|
4
|
+
|
5
|
+
if ARGV.length < 1
|
6
|
+
puts "Usage: hashtag_retweet_bot [tag_to_watch] [seconds_between_updates]"
|
7
|
+
puts "If you haven't created the database table, run:"
|
8
|
+
puts "hashtag_retweet_bot create_db_table"
|
9
|
+
exit
|
10
|
+
end
|
11
|
+
|
12
|
+
tag = ARGV[0]
|
13
|
+
seconds = ARGV[1].to_i || 180
|
14
|
+
if tag.downcase == 'create_db_table'
|
15
|
+
puts "Creating the database"
|
16
|
+
require File.join(File.dirname(__FILE__), '..', 'create_db_table')
|
17
|
+
else
|
18
|
+
puts "Launching the twitterbot to track \##{tag} every #{seconds} seconds"
|
19
|
+
bot = HashtagRetweetBot.new(tag, seconds)
|
20
|
+
bot.run
|
21
|
+
end
|
data/create_db_table.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'active_record'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
adapter_attrs = YAML.load(File.open('config/database.yml') { |f| f.read })
|
6
|
+
ActiveRecord::Base.establish_connection(adapter_attrs)
|
7
|
+
|
8
|
+
ActiveRecord::Schema.define do
|
9
|
+
create_table(:tweets, :force => true) do |t|
|
10
|
+
t.string :twitter_id
|
11
|
+
t.datetime :published
|
12
|
+
t.string :link
|
13
|
+
t.string :title
|
14
|
+
t.string :content
|
15
|
+
t.string :author_name
|
16
|
+
t.string :author_uri
|
17
|
+
t.boolean :tweeted
|
18
|
+
end
|
19
|
+
end
|
data/feed.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{hashtag_retweet_bot}
|
5
|
+
s.version = "0.1.2"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Balint Erdi", "Jaime Iniesta"]
|
9
|
+
s.date = %q{2009-08-16}
|
10
|
+
s.default_executable = %q{hashtag_retweet_bot}
|
11
|
+
s.description = %q{Script that listens to a tag and retweets messages with that tag. Originally made for Scotland on Rails '09 by Mark Connell (http://github.com/rubaidh)}
|
12
|
+
s.email = %q{jaimeiniesta@gmail.com}
|
13
|
+
s.executables = ["hashtag_retweet_bot"]
|
14
|
+
s.extra_rdoc_files = ["bin/hashtag_retweet_bot", "lib/bot.rb", "README.markdown"]
|
15
|
+
s.files = ["bin/hashtag_retweet_bot", "create_db_table.rb", "feed.rb", "hashtag_retweet_bot.gemspec", "lib/bot.rb", "Manifest", "Rakefile", "README.markdown"]
|
16
|
+
s.homepage = %q{http://github.com/jaimeiniesta/hashtag_retweet_bot}
|
17
|
+
s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Hashtag_retweet_bot", "--main", "README.markdown"]
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
s.rubyforge_project = %q{hashtag_retweet_bot}
|
20
|
+
s.rubygems_version = %q{1.3.3}
|
21
|
+
s.summary = %q{Script that listens to a tag and retweets messages with that tag. Originally made for Scotland on Rails '09 by Mark Connell (http://github.com/rubaidh)}
|
22
|
+
|
23
|
+
if s.respond_to? :specification_version then
|
24
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
25
|
+
s.specification_version = 3
|
26
|
+
|
27
|
+
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
28
|
+
s.add_runtime_dependency(%q<twibot>, [">= 0.1.7"])
|
29
|
+
s.add_runtime_dependency(%q<activerecord>, [">= 0"])
|
30
|
+
s.add_runtime_dependency(%q<pauldix-feedzirra>, [">= 0.0.12"])
|
31
|
+
s.add_development_dependency(%q<twibot>, [">= 0.1.7"])
|
32
|
+
s.add_development_dependency(%q<activerecord>, [">= 0"])
|
33
|
+
s.add_development_dependency(%q<pauldix-feedzirra>, [">= 0.0.12"])
|
34
|
+
else
|
35
|
+
s.add_dependency(%q<twibot>, [">= 0.1.7"])
|
36
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
37
|
+
s.add_dependency(%q<pauldix-feedzirra>, [">= 0.0.12"])
|
38
|
+
s.add_dependency(%q<twibot>, [">= 0.1.7"])
|
39
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
40
|
+
s.add_dependency(%q<pauldix-feedzirra>, [">= 0.0.12"])
|
41
|
+
end
|
42
|
+
else
|
43
|
+
s.add_dependency(%q<twibot>, [">= 0.1.7"])
|
44
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
45
|
+
s.add_dependency(%q<pauldix-feedzirra>, [">= 0.0.12"])
|
46
|
+
s.add_dependency(%q<twibot>, [">= 0.1.7"])
|
47
|
+
s.add_dependency(%q<activerecord>, [">= 0"])
|
48
|
+
s.add_dependency(%q<pauldix-feedzirra>, [">= 0.0.12"])
|
49
|
+
end
|
50
|
+
end
|
data/lib/bot.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'twibot' # our bot helper
|
3
|
+
require 'active_record' # db
|
4
|
+
require 'feedzirra' # feed helper
|
5
|
+
require 'yaml'
|
6
|
+
|
7
|
+
class Tweets < ActiveRecord::Base
|
8
|
+
end
|
9
|
+
|
10
|
+
###
|
11
|
+
# What we want the bot to do
|
12
|
+
###
|
13
|
+
# 1. Listen to an rss feed and store that stuff
|
14
|
+
# 2. Work out which tweets need to be tweeted by the bot
|
15
|
+
# 3. send the tweets and mark them as 'tweeted'
|
16
|
+
# 4. repeat ad nauseam every x seconds (as indicated, 180 is recommended)
|
17
|
+
#
|
18
|
+
|
19
|
+
class HashtagRetweetBot
|
20
|
+
def initialize(tag, seconds=180)
|
21
|
+
@tag = tag
|
22
|
+
@seconds = seconds
|
23
|
+
end
|
24
|
+
|
25
|
+
def run
|
26
|
+
|
27
|
+
adapter_attrs = YAML.load(File.open('config/database.yml') { |f| f.read })
|
28
|
+
ActiveRecord::Base.establish_connection(adapter_attrs)
|
29
|
+
|
30
|
+
feed_thread = Thread.new do
|
31
|
+
while(true != false)
|
32
|
+
begin
|
33
|
+
# fetch the feed
|
34
|
+
feed = get_tweets_tagged_with(@tag)
|
35
|
+
feed.entries.reverse.each do |entry|
|
36
|
+
tweet = Tweets.find_or_create_by_twitter_id(
|
37
|
+
:twitter_id => entry.id,
|
38
|
+
:published => entry.published,
|
39
|
+
:title => entry.title,
|
40
|
+
:content => entry.content,
|
41
|
+
:link => entry.url
|
42
|
+
)
|
43
|
+
|
44
|
+
if tweet.tweeted.blank?
|
45
|
+
origin = tweet.link.gsub(/^http.*com\//,"").gsub(/\/statuses\/\d*/,"")
|
46
|
+
# strip the whole tag at the end of the tweet (since it is just for tagging)
|
47
|
+
message = tweet.title.gsub(%r{#(#{@tag})\s*$}i, '').rstrip
|
48
|
+
# strip only the # anywhere else (since it is part of the tweet)
|
49
|
+
message = message.gsub(%r{#(#{@tag})}i, '\1')
|
50
|
+
if origin.size + message.size <= 135
|
51
|
+
twitter.status(:post, "RT @#{origin}: #{message}")
|
52
|
+
else
|
53
|
+
twitter.status(:post, "RT @#{origin} tagged '#{@tag}': #{tweet.link}")
|
54
|
+
end
|
55
|
+
puts "#{Time.now.to_s(:long)}" # poor mans logging
|
56
|
+
tweet.update_attribute(:tweeted, true)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
rescue
|
60
|
+
end
|
61
|
+
sleep(@seconds)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
feed_thread.join
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
def get_tweets_tagged_with(tag)
|
70
|
+
Feedzirra::Feed.fetch_and_parse("http://search.twitter.com/search.atom?q=+%23#{tag}")
|
71
|
+
end
|
72
|
+
|
73
|
+
end # class
|
74
|
+
|
metadata
ADDED
@@ -0,0 +1,128 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jaimeiniesta-hashtag_retweet_bot
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Balint Erdi
|
8
|
+
- Jaime Iniesta
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2009-08-16 00:00:00 -07:00
|
14
|
+
default_executable: hashtag_retweet_bot
|
15
|
+
dependencies:
|
16
|
+
- !ruby/object:Gem::Dependency
|
17
|
+
name: twibot
|
18
|
+
type: :runtime
|
19
|
+
version_requirement:
|
20
|
+
version_requirements: !ruby/object:Gem::Requirement
|
21
|
+
requirements:
|
22
|
+
- - ">="
|
23
|
+
- !ruby/object:Gem::Version
|
24
|
+
version: 0.1.7
|
25
|
+
version:
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: activerecord
|
28
|
+
type: :runtime
|
29
|
+
version_requirement:
|
30
|
+
version_requirements: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - ">="
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: "0"
|
35
|
+
version:
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: pauldix-feedzirra
|
38
|
+
type: :runtime
|
39
|
+
version_requirement:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 0.0.12
|
45
|
+
version:
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: twibot
|
48
|
+
type: :development
|
49
|
+
version_requirement:
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.1.7
|
55
|
+
version:
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: activerecord
|
58
|
+
type: :development
|
59
|
+
version_requirement:
|
60
|
+
version_requirements: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: "0"
|
65
|
+
version:
|
66
|
+
- !ruby/object:Gem::Dependency
|
67
|
+
name: pauldix-feedzirra
|
68
|
+
type: :development
|
69
|
+
version_requirement:
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 0.0.12
|
75
|
+
version:
|
76
|
+
description: Script that listens to a tag and retweets messages with that tag. Originally made for Scotland on Rails '09 by Mark Connell (http://github.com/rubaidh)
|
77
|
+
email: jaimeiniesta@gmail.com
|
78
|
+
executables:
|
79
|
+
- hashtag_retweet_bot
|
80
|
+
extensions: []
|
81
|
+
|
82
|
+
extra_rdoc_files:
|
83
|
+
- bin/hashtag_retweet_bot
|
84
|
+
- lib/bot.rb
|
85
|
+
- README.markdown
|
86
|
+
files:
|
87
|
+
- bin/hashtag_retweet_bot
|
88
|
+
- create_db_table.rb
|
89
|
+
- feed.rb
|
90
|
+
- hashtag_retweet_bot.gemspec
|
91
|
+
- lib/bot.rb
|
92
|
+
- Manifest
|
93
|
+
- Rakefile
|
94
|
+
- README.markdown
|
95
|
+
has_rdoc: false
|
96
|
+
homepage: http://github.com/jaimeiniesta/hashtag_retweet_bot
|
97
|
+
licenses:
|
98
|
+
post_install_message:
|
99
|
+
rdoc_options:
|
100
|
+
- --line-numbers
|
101
|
+
- --inline-source
|
102
|
+
- --title
|
103
|
+
- Hashtag_retweet_bot
|
104
|
+
- --main
|
105
|
+
- README.markdown
|
106
|
+
require_paths:
|
107
|
+
- lib
|
108
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
109
|
+
requirements:
|
110
|
+
- - ">="
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
version: "0"
|
113
|
+
version:
|
114
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: "1.2"
|
119
|
+
version:
|
120
|
+
requirements: []
|
121
|
+
|
122
|
+
rubyforge_project: hashtag_retweet_bot
|
123
|
+
rubygems_version: 1.3.5
|
124
|
+
signing_key:
|
125
|
+
specification_version: 3
|
126
|
+
summary: Script that listens to a tag and retweets messages with that tag. Originally made for Scotland on Rails '09 by Mark Connell (http://github.com/rubaidh)
|
127
|
+
test_files: []
|
128
|
+
|