neufelry-twitter-sms 0.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/README.md +32 -0
- data/bin/twitter-sms +157 -0
- data/example.conf +13 -0
- metadata +54 -0
data/README.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
twitter-sms: Twitter SMS for the rest of us.
|
|
2
|
+
=======================================
|
|
3
|
+
|
|
4
|
+
Twitter-sms bridges the gap left by Twitter.com when it removed SMS capability for many countries. Twitter-sms runs in the background and periodically checks Twitter for new tweets; When new tweets are found they are forwarded via a gmail account to your mobile phone's email address.
|
|
5
|
+
|
|
6
|
+
All it requires is:
|
|
7
|
+
* A running computer with internet access and Ruby installed. (*nix systems only for the moment.),
|
|
8
|
+
* A google email address (to forward messages from) and,
|
|
9
|
+
* An SMS capable phone with an email-to-sms email address. (i.e. 12345551234@text.provider.net that automatically forwards messages to your phone as SMS)
|
|
10
|
+
|
|
11
|
+
DISCLAIMER: Please bear in mind that it MAY cost you to receive text message on your email address; I am not responsable for any costs incurred to you using this program.
|
|
12
|
+
|
|
13
|
+
Setup
|
|
14
|
+
-----
|
|
15
|
+
To use twitter-sms you will need only to create the config file "~/.twitter-sms.conf" and fill it with the necessary YAML mappings.
|
|
16
|
+
|
|
17
|
+
Here is an example conf:
|
|
18
|
+
|
|
19
|
+
bot:
|
|
20
|
+
email: "twitter.bot@gmail.com"
|
|
21
|
+
password: p0n33zR0oL
|
|
22
|
+
user:
|
|
23
|
+
name: rkneufeld
|
|
24
|
+
password: p0n33zR0oL
|
|
25
|
+
phone: "12045555555@text.provider.net"
|
|
26
|
+
config:
|
|
27
|
+
per_hour: 12
|
|
28
|
+
keep_alive: true
|
|
29
|
+
|
|
30
|
+
This config will cause the script to run forever; sending you the last 5 minutes tweets every 5 minutes. (60 / 5 == 12)
|
|
31
|
+
|
|
32
|
+
One can also run the script as a cron job; instructions to follow soon...
|
data/bin/twitter-sms
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
#!/opt/local/bin/ruby
|
|
2
|
+
require 'rubygems'
|
|
3
|
+
require 'twitter'
|
|
4
|
+
require 'tlsmail'
|
|
5
|
+
require 'optparse'
|
|
6
|
+
require 'cgi'
|
|
7
|
+
|
|
8
|
+
SEC_PER_HOUR = 3600 # Seconds per hour
|
|
9
|
+
|
|
10
|
+
# Put Debug (prepend time)
|
|
11
|
+
def putd (message)
|
|
12
|
+
puts "#{Time.now.strftime("(%b %d - %H:%M:%S)")} #{message}"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
class TwitterSms
|
|
16
|
+
|
|
17
|
+
def initialize(config_file="#{ENV['HOME'] + '/.twitter-sms.conf'}", args=ARGV)
|
|
18
|
+
load_config(config_file)
|
|
19
|
+
load_opts(args)
|
|
20
|
+
|
|
21
|
+
# Required for gmail smtp (and not a part of standalone Net::SMTP)
|
|
22
|
+
Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Run the twitter-sms bot once or repeatedly, depending on config
|
|
26
|
+
def run
|
|
27
|
+
begin # do-while
|
|
28
|
+
load_config if config_stale?
|
|
29
|
+
|
|
30
|
+
tweets = update
|
|
31
|
+
send tweets unless tweets.nil?
|
|
32
|
+
|
|
33
|
+
if @config['keep_alive']
|
|
34
|
+
putd "Waiting for ~#{@config['wait']/60} minutes..."
|
|
35
|
+
Kernel.sleep @config['wait']
|
|
36
|
+
end
|
|
37
|
+
end while @config['keep_alive']
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Collect a list of recent tweets on a user's timeline (that are not their own)
|
|
41
|
+
def update
|
|
42
|
+
twitter = Twitter::Base.new(@user['name'],@user['password'])
|
|
43
|
+
|
|
44
|
+
begin
|
|
45
|
+
if twitter.rate_limit_status.remaining_hits > 0
|
|
46
|
+
now = Time.now
|
|
47
|
+
tweets = twitter.timeline(:friends, :since => @last_check)
|
|
48
|
+
@last_check = now
|
|
49
|
+
|
|
50
|
+
# Block own tweets if specified via settings
|
|
51
|
+
tweets.reject! {|t| t.user.screen_name == @user['name']} unless @config['own_tweets']
|
|
52
|
+
# Don't send messages from users under no_follow
|
|
53
|
+
tweets.reject! {|t| @config['no_follow'].member?(t.user.screen_name) }
|
|
54
|
+
tweets.reverse! # reverse-chronological
|
|
55
|
+
else
|
|
56
|
+
putd "Your account has run out of API calls; call not made."
|
|
57
|
+
end
|
|
58
|
+
rescue
|
|
59
|
+
putd "Error occured retreiving timeline. Perhaps Internet is down?"
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Email via Gmail SMTP any tweets to the desired cell phone
|
|
64
|
+
def send(tweets)
|
|
65
|
+
putd "Sending received tweets..."
|
|
66
|
+
begin
|
|
67
|
+
Net::SMTP.start('smtp.gmail.com', 587, 'gmail.com', @bot['email'], "tweeterbot", :login) do |smtp|
|
|
68
|
+
tweets.each do |tweet|
|
|
69
|
+
smtp.send_message(content(tweet),@bot['email'],@user['phone']) rescue putd "Error occured sending message:"
|
|
70
|
+
putd "\tSent: #{tweet.user.screen_name}: #{tweet.text[0..20]}..."
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
putd "Messages sent."
|
|
74
|
+
rescue
|
|
75
|
+
putd "Error occured starting smtp. Perhaps account info is incorrect or Internet is down?"
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Parse and store a config file (either as an initial load or as an update)
|
|
80
|
+
def load_config(config_file=@config_file['name'])
|
|
81
|
+
# Load config file -- Add try block here
|
|
82
|
+
config = YAML.load_file(config_file)
|
|
83
|
+
@config_file = { 'name' => config_file,
|
|
84
|
+
'modified_at' => File.mtime(config_file) }
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
# Seperate config hashes into easier to use parts
|
|
88
|
+
@user = config['user']
|
|
89
|
+
@bot = config['bot']
|
|
90
|
+
# Merge specified config onto defaults
|
|
91
|
+
default = { 'own_tweets' => false,
|
|
92
|
+
'keep_alive' => true,
|
|
93
|
+
'per_hour' => 60}
|
|
94
|
+
@config = config['config'].merge(default)
|
|
95
|
+
|
|
96
|
+
set_wait
|
|
97
|
+
@last_check = Time.now - @config['wait']
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
private
|
|
101
|
+
|
|
102
|
+
# Set wait time based on times per hour
|
|
103
|
+
def set_wait
|
|
104
|
+
@config['wait'] = SEC_PER_HOUR / @config['per_hour']
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def load_opts(args)
|
|
108
|
+
opts = OptionParser.new do |opts|
|
|
109
|
+
opts.banner = "Twitter-sms bot help menu:\n"
|
|
110
|
+
opts.banner += "==========================\n"
|
|
111
|
+
opts.banner += "Usage #$0 [options]"
|
|
112
|
+
|
|
113
|
+
opts.on('-t', '--times-per-hour [TIMES]',
|
|
114
|
+
'Indicate the amount of times per hour to check (0 < TIMES <= 100)') do |times|
|
|
115
|
+
times = 100 if times > 100
|
|
116
|
+
times = 1 if times < 1 # once per hour minimum?
|
|
117
|
+
@config['per_hour'] = times
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
opts.on('-o', '--own-tweets',
|
|
121
|
+
"Makes your own tweets send in addition to followed account\'s tweets") do
|
|
122
|
+
@config['own_tweets'] = true
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
opts.on('-s', '--single-check',
|
|
126
|
+
'Forces the program to only check once, instead of continually') do
|
|
127
|
+
@config['keep_alive'] = false
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
opts.on_tail('-h', '--help', 'display this help and exit') do
|
|
131
|
+
puts opts
|
|
132
|
+
exit
|
|
133
|
+
end
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
opts.parse!(args)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def config_stale?
|
|
140
|
+
return File.mtime(@config_file['name']) > @config_file['modified_at']
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def content(tweet)
|
|
144
|
+
"From: #{@bot['email']}\n"+
|
|
145
|
+
"To: #{@user['phone']}\n"+
|
|
146
|
+
"Date: #{Time.parse(tweet.created_at).rfc2822}\n\n"+
|
|
147
|
+
"#{tweet.user.screen_name}: #{CGI.escapeHTML(tweet.text)}"
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# Run as program only if library is the running program
|
|
153
|
+
if $0.split('/')[-1] == __FILE__.split('/')[-1] # Can anyone fix this idiom for me; I just know its wrong
|
|
154
|
+
# Add some logic for command line options
|
|
155
|
+
program = TwitterSms.new
|
|
156
|
+
program.run
|
|
157
|
+
end
|
data/example.conf
ADDED
metadata
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: neufelry-twitter-sms
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: "0.2"
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Ryan Neufeld
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
|
|
12
|
+
date: 2009-01-11 00:00:00 -08:00
|
|
13
|
+
default_executable:
|
|
14
|
+
dependencies: []
|
|
15
|
+
|
|
16
|
+
description: Twitter-SMS provides a persistent command line tool to send SMS updates to your mobile phone via a gmail account.
|
|
17
|
+
email: neufelry@gmail.com
|
|
18
|
+
executables:
|
|
19
|
+
- - twitter-sms
|
|
20
|
+
extensions: []
|
|
21
|
+
|
|
22
|
+
extra_rdoc_files: []
|
|
23
|
+
|
|
24
|
+
files:
|
|
25
|
+
- README.md
|
|
26
|
+
- example.conf
|
|
27
|
+
has_rdoc: false
|
|
28
|
+
homepage: http://www.github.com/neufelry/twitter-sms
|
|
29
|
+
post_install_message:
|
|
30
|
+
rdoc_options: []
|
|
31
|
+
|
|
32
|
+
require_paths:
|
|
33
|
+
- lib
|
|
34
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
35
|
+
requirements:
|
|
36
|
+
- - ">="
|
|
37
|
+
- !ruby/object:Gem::Version
|
|
38
|
+
version: "0"
|
|
39
|
+
version:
|
|
40
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
41
|
+
requirements:
|
|
42
|
+
- - ">="
|
|
43
|
+
- !ruby/object:Gem::Version
|
|
44
|
+
version: "0"
|
|
45
|
+
version:
|
|
46
|
+
requirements: []
|
|
47
|
+
|
|
48
|
+
rubyforge_project:
|
|
49
|
+
rubygems_version: 1.2.0
|
|
50
|
+
signing_key:
|
|
51
|
+
specification_version: 2
|
|
52
|
+
summary: Twitter-SMS lets you send SMS updates to your phone.
|
|
53
|
+
test_files: []
|
|
54
|
+
|