balinterdi-hashtag_retweet_bot 0.1
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 +7 -0
- data/README.markdown +42 -0
- data/Rakefile +14 -0
- data/bin/hashtag_retweet_bot +16 -0
- data/create_db_table.rb +19 -0
- data/feed.rb +10 -0
- data/hashtag_retweet_bot.gemspec +41 -0
- data/lib/bot.rb +73 -0
- metadata +96 -0
data/Manifest
ADDED
data/README.markdown
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# Hashtag retweet bot
|
2
|
+
|
3
|
+
A bot that retweets all tweets tagged by a certain tag. Ideal for conferences, meetup groups, communities, etc.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
gem install balinterdi-hashtag_retweet_bot --source http://gems.github.com
|
8
|
+
|
9
|
+
Create the database that will hold the tweets:
|
10
|
+
|
11
|
+
mysqladmin create my_conference
|
12
|
+
|
13
|
+
Create a directory where you will run the bot from:
|
14
|
+
|
15
|
+
mkdir bot_for_my_conference
|
16
|
+
cd bot_for_my_conference
|
17
|
+
touch database.yml bot.yml
|
18
|
+
|
19
|
+
Put the credentials for the twitter account in _bot.yml_:
|
20
|
+
|
21
|
+
login: my_conference_bot
|
22
|
+
password: secret
|
23
|
+
|
24
|
+
Put the database connection attributes in _database.yml_:
|
25
|
+
|
26
|
+
adapter: mysql
|
27
|
+
username: root
|
28
|
+
host: localhost
|
29
|
+
password:
|
30
|
+
database: my_conference
|
31
|
+
|
32
|
+
## Run it
|
33
|
+
|
34
|
+
Now the only thing left to do is to run the bot:
|
35
|
+
|
36
|
+
hashtag_retweet_bot my_conference
|
37
|
+
|
38
|
+
## Credits
|
39
|
+
|
40
|
+
Original idea and script by [Mark Connell](http://github.com/mconnell) for Scotland on Rails 2009. Customization for Euruko '09 by [Jaime Iniesta](http://github.com/jaimeiniesta). Some improvements and gemification by [Balint Erdi](http://github.com/balinterdi).
|
41
|
+
|
42
|
+
Please send feedback and bug reports to <balint@bucionrails.com>
|
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake'
|
3
|
+
require 'echoe'
|
4
|
+
|
5
|
+
Echoe.new('hashtag_retweet_bot', '0.1') 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/balinterdi/hashtag_retweet_bot"
|
8
|
+
p.author = "Balint Erdi"
|
9
|
+
p.email = "balint@bucionrails.com"
|
10
|
+
p.ignore_pattern = ["tmp/*", "config/*", "script/*", "*.txt", "pkg"]
|
11
|
+
p.development_dependencies = ["twibot >=0.1.7", "active_record", "pauldix-feedzirra >=0.0.12"]
|
12
|
+
end
|
13
|
+
|
14
|
+
Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
|
@@ -0,0 +1,16 @@
|
|
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]"
|
7
|
+
exit
|
8
|
+
end
|
9
|
+
|
10
|
+
tag = ARGV.first
|
11
|
+
if tag.downcase == 'create_db_table'
|
12
|
+
require File.join(File.dirname(__FILE__), '..', 'create_db_table')
|
13
|
+
else
|
14
|
+
bot = HashtagRetweetBot.new(tag)
|
15
|
+
bot.run
|
16
|
+
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,41 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = %q{hashtag_retweet_bot}
|
5
|
+
s.version = "0.1"
|
6
|
+
|
7
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
8
|
+
s.authors = ["Balint Erdi"]
|
9
|
+
s.date = %q{2009-06-28}
|
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{balint@bucionrails.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", "lib/bot.rb", "Manifest", "Rakefile", "README.markdown", "hashtag_retweet_bot.gemspec"]
|
16
|
+
s.homepage = %q{http://github.com/balinterdi/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_development_dependency(%q<twibot>, [">= 0.1.7"])
|
29
|
+
s.add_development_dependency(%q<active_record>, [">= 0"])
|
30
|
+
s.add_development_dependency(%q<pauldix-feedzirra>, [">= 0.0.12"])
|
31
|
+
else
|
32
|
+
s.add_dependency(%q<twibot>, [">= 0.1.7"])
|
33
|
+
s.add_dependency(%q<active_record>, [">= 0"])
|
34
|
+
s.add_dependency(%q<pauldix-feedzirra>, [">= 0.0.12"])
|
35
|
+
end
|
36
|
+
else
|
37
|
+
s.add_dependency(%q<twibot>, [">= 0.1.7"])
|
38
|
+
s.add_dependency(%q<active_record>, [">= 0"])
|
39
|
+
s.add_dependency(%q<pauldix-feedzirra>, [">= 0.0.12"])
|
40
|
+
end
|
41
|
+
end
|
data/lib/bot.rb
ADDED
@@ -0,0 +1,73 @@
|
|
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
|
+
#
|
17
|
+
|
18
|
+
class HashtagRetweetBot
|
19
|
+
def initialize(tag)
|
20
|
+
@tag = tag
|
21
|
+
end
|
22
|
+
|
23
|
+
def run
|
24
|
+
|
25
|
+
adapter_attrs = YAML.load(File.open('config/database.yml') { |f| f.read })
|
26
|
+
ActiveRecord::Base.establish_connection(adapter_attrs)
|
27
|
+
|
28
|
+
feed_thread = Thread.new do
|
29
|
+
while(true != false)
|
30
|
+
begin
|
31
|
+
# fetch the feed
|
32
|
+
feed = get_tweets_tagged_with(@tag)
|
33
|
+
puts "XXX Feed entries length: #{feed.entries.length}"
|
34
|
+
feed.entries.reverse.each do |entry|
|
35
|
+
tweet = Tweets.find_or_create_by_twitter_id(
|
36
|
+
:twitter_id => entry.id,
|
37
|
+
:published => entry.published,
|
38
|
+
:title => entry.title,
|
39
|
+
:content => entry.content,
|
40
|
+
:link => entry.url
|
41
|
+
)
|
42
|
+
|
43
|
+
if tweet.tweeted.blank?
|
44
|
+
origin = tweet.link.gsub(/^http.*com\//,"").gsub(/\/statuses\/\d*/,"")
|
45
|
+
# strip the whole tag at the end of the tweet (since it is just for tagging)
|
46
|
+
message = tweet.title.gsub(%r{#(#{@tag})\s*$}i, '').rstrip
|
47
|
+
# strip only the # anywhere else (since it is part of the tweet)
|
48
|
+
message = message.gsub(%r{#(#{@tag})}i, '\1')
|
49
|
+
if origin.size + message.size <= 135
|
50
|
+
twitter.status(:post, "RT @#{origin}: #{message}")
|
51
|
+
else
|
52
|
+
twitter.status(:post, "RT @#{origin} tagged '#{@tag}': #{tweet.link}")
|
53
|
+
end
|
54
|
+
puts "#{Time.now.to_s(:long)}" # poor mans logging
|
55
|
+
tweet.update_attribute(:tweeted, true)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
rescue
|
59
|
+
end
|
60
|
+
sleep(60)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
feed_thread.join
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
def get_tweets_tagged_with(tag)
|
69
|
+
Feedzirra::Feed.fetch_and_parse("http://search.twitter.com/search.atom?q=+%23#{tag}")
|
70
|
+
end
|
71
|
+
|
72
|
+
end # class
|
73
|
+
|
metadata
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: balinterdi-hashtag_retweet_bot
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "0.1"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Balint Erdi
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-06-28 00:00:00 -07:00
|
13
|
+
default_executable: hashtag_retweet_bot
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: twibot
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 0.1.7
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: active_record
|
27
|
+
type: :development
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
- !ruby/object:Gem::Dependency
|
36
|
+
name: pauldix-feedzirra
|
37
|
+
type: :development
|
38
|
+
version_requirement:
|
39
|
+
version_requirements: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 0.0.12
|
44
|
+
version:
|
45
|
+
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)
|
46
|
+
email: balint@bucionrails.com
|
47
|
+
executables:
|
48
|
+
- hashtag_retweet_bot
|
49
|
+
extensions: []
|
50
|
+
|
51
|
+
extra_rdoc_files:
|
52
|
+
- bin/hashtag_retweet_bot
|
53
|
+
- lib/bot.rb
|
54
|
+
- README.markdown
|
55
|
+
files:
|
56
|
+
- bin/hashtag_retweet_bot
|
57
|
+
- create_db_table.rb
|
58
|
+
- feed.rb
|
59
|
+
- lib/bot.rb
|
60
|
+
- Manifest
|
61
|
+
- Rakefile
|
62
|
+
- README.markdown
|
63
|
+
- hashtag_retweet_bot.gemspec
|
64
|
+
has_rdoc: false
|
65
|
+
homepage: http://github.com/balinterdi/hashtag_retweet_bot
|
66
|
+
post_install_message:
|
67
|
+
rdoc_options:
|
68
|
+
- --line-numbers
|
69
|
+
- --inline-source
|
70
|
+
- --title
|
71
|
+
- Hashtag_retweet_bot
|
72
|
+
- --main
|
73
|
+
- README.markdown
|
74
|
+
require_paths:
|
75
|
+
- lib
|
76
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
+
requirements:
|
78
|
+
- - ">="
|
79
|
+
- !ruby/object:Gem::Version
|
80
|
+
version: "0"
|
81
|
+
version:
|
82
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ">="
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: "1.2"
|
87
|
+
version:
|
88
|
+
requirements: []
|
89
|
+
|
90
|
+
rubyforge_project: hashtag_retweet_bot
|
91
|
+
rubygems_version: 1.2.0
|
92
|
+
signing_key:
|
93
|
+
specification_version: 3
|
94
|
+
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)
|
95
|
+
test_files: []
|
96
|
+
|