tweetlr 0.1.23 → 0.1.30
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +5 -2
- data/config/tweetlr.yml +4 -0
- data/lib/tweetlr/core.rb +15 -21
- data/lib/tweetlr/processors/tumblr.rb +8 -8
- data/lib/tweetlr/processors/twitter.rb +38 -5
- data/lib/tweetlr.rb +1 -1
- data/spec/core_spec.rb +9 -42
- data/spec/processors/tumblr_processor_spec.rb +2 -13
- data/spec/processors/twitter_processor_spec.rb +6 -11
- data/spec/spec_helper.rb +5 -8
- data/spec/support/fixtures/twitter_search_api_response.json +22 -0
- data/tweetlr.gemspec +3 -1
- metadata +42 -2
data/README.md
CHANGED
@@ -40,10 +40,13 @@ It's essential that you have a directory called `config` in the directory you ar
|
|
40
40
|
```yaml
|
41
41
|
results_per_page: 100
|
42
42
|
result_type: recent
|
43
|
-
search_term: 'cat
|
43
|
+
search_term: 'cat dog unicorn' #find tweets containing any of these terms
|
44
44
|
start_at_tweet_id: 61847783463854082 # the tweet id to start searching at
|
45
|
-
api_endpoint_twitter: 'http://search.twitter.com/search.json'
|
46
45
|
api_endpoint_tumblr: 'http://www.tumblr.com'
|
46
|
+
twitter_app_consumer_key: YOUR APPS TWITTER API KEY
|
47
|
+
twitter_app_consumer_secret: YOUR APPS TWITTER API SECRET
|
48
|
+
twitter_oauth_token: YOUR APPS TWITTER API OAUTH TOKEN
|
49
|
+
twitter_oauth_token_secret: YOUR APPS TWITTER API OAUTH TOKEN SECRET
|
47
50
|
tumblr_oauth_api_key: YOUR APPS TUMBLR API TOKEN
|
48
51
|
tumblr_oauth_api_secret: YOUR APPS TUMBLR API SECRET
|
49
52
|
tumblr_oauth_access_token_key: YOUR BLOGS OAUTH ACCESS TOKEN KEY
|
data/config/tweetlr.yml
CHANGED
@@ -2,6 +2,10 @@ results_per_page: 100
|
|
2
2
|
result_type: recent
|
3
3
|
search_term: 'cat+dog+unicorn' #find tweets containing any of these terms
|
4
4
|
start_at_tweet_id: 61847783463854082 # the tweet id to start searching at
|
5
|
+
twitter_app_consumer_key: YOUR APPS TWITTER API KEY
|
6
|
+
twitter_app_consumer_secret: YOUR APPS TWITTER API SECRET
|
7
|
+
twitter_oauth_token: YOUR APPS TWITTER API OAUTH TOKEN
|
8
|
+
twitter_oauth_token_secret: YOUR APPS TWITTER API OAUTH TOKEN SECRET
|
5
9
|
api_endpoint_twitter: 'http://search.twitter.com/search.json'
|
6
10
|
api_endpoint_tumblr: 'http://www.tumblr.com'
|
7
11
|
tumblr_oauth_api_key: YOUR APPS TUMBLR API TOKEN
|
data/lib/tweetlr/core.rb
CHANGED
@@ -29,7 +29,7 @@ class Tweetlr::Core
|
|
29
29
|
response = {}
|
30
30
|
response = Tweetlr::Processors::Twitter::lazy_search(twitter_config)
|
31
31
|
if response
|
32
|
-
process_response response, config
|
32
|
+
process_response response, config
|
33
33
|
# store the highest tweet id
|
34
34
|
config[:since_id] = response['max_id']
|
35
35
|
else
|
@@ -60,23 +60,23 @@ private
|
|
60
60
|
log.debug "log level set to #{log.level}"
|
61
61
|
Tweetlr::LogAware.log=log
|
62
62
|
end
|
63
|
-
def self.process_response(response, config
|
63
|
+
def self.process_response(response, config)
|
64
64
|
tweets = response['results']
|
65
|
-
process_and_post tweets, config
|
65
|
+
process_and_post tweets, config if tweets
|
66
66
|
end
|
67
|
-
def self.process_and_post(tweets, config
|
67
|
+
def self.process_and_post(tweets, config)
|
68
68
|
tweets.each do |tweet|
|
69
69
|
tumblr_post = Tweetlr::Combinators::TwitterTumblr::generate_photo_post_from_tweet(tweet, {:whitelist => config[:whitelist], :embedly_key => config[:embedly_key], :group => config[:group]})
|
70
70
|
if tumblr_post.nil? || tumblr_post[:source].nil?
|
71
71
|
log.warn "could not get image source: tweet: #{tweet} --- tumblr post: #{tumblr_post.inspect}"
|
72
72
|
else
|
73
|
-
post_to_tumblr tumblr_post,
|
73
|
+
post_to_tumblr tumblr_post, config
|
74
74
|
end
|
75
75
|
end
|
76
76
|
end
|
77
|
-
def self.post_to_tumblr(tumblr_post,
|
77
|
+
def self.post_to_tumblr(tumblr_post, config)
|
78
78
|
log.debug "tumblr post: #{tumblr_post}"
|
79
|
-
res = Tweetlr::Processors::Tumblr.post tumblr_post.merge(
|
79
|
+
res = Tweetlr::Processors::Tumblr.post tumblr_post.merge(config)
|
80
80
|
if res && res.code == "201"
|
81
81
|
log.info "tumblr post created (tumblr response header: #{res.header}"
|
82
82
|
elsif res
|
@@ -86,21 +86,15 @@ private
|
|
86
86
|
end
|
87
87
|
end
|
88
88
|
def self.prepare_twitter_config(config)
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
}
|
89
|
+
config[:since_id] ||= config[:start_at_tweet_id]
|
90
|
+
config[:terms] ||= config[:search_term]
|
91
|
+
config[:results_per_page] ||= Tweetlr::TWITTER_RESULTS_PER_PAGE
|
92
|
+
config[:result_type] ||= Tweetlr::TWITTER_RESULTS_TYPE
|
93
|
+
config[:api_endpoint_twitter] ||= Tweetlr::API_ENDPOINT_TWITTER
|
94
|
+
config
|
96
95
|
end
|
97
96
|
def self.prepare_tumblr_config(config)
|
98
|
-
|
99
|
-
|
100
|
-
:tumblr_oauth_access_token_secret => config[:tumblr_oauth_access_token_secret],
|
101
|
-
:tumblr_oauth_api_key => config[:tumblr_oauth_api_key],
|
102
|
-
:tumblr_oauth_api_secret => config[:tumblr_oauth_api_secret],
|
103
|
-
:tumblr_blog_hostname => config[:tumblr_blog_hostname] || config[:group]
|
104
|
-
}
|
97
|
+
config[:tumblr_blog_hostname] ||= config[:group]
|
98
|
+
config
|
105
99
|
end
|
106
100
|
end
|
@@ -17,14 +17,14 @@ module Tweetlr::Processors
|
|
17
17
|
#optional arguments: :tags, :type (default: 'photo')
|
18
18
|
#
|
19
19
|
def self.post(options={})
|
20
|
-
log.info "posting to #{options[
|
21
|
-
base_hostname = options[
|
22
|
-
tumblr_oauth_api_key= options[
|
23
|
-
tumblr_oauth_api_secret= options[
|
24
|
-
access_token_key = options[
|
25
|
-
access_token_secret = options[
|
26
|
-
type = options[
|
27
|
-
tags = options[
|
20
|
+
log.info "posting to #{options['tumblr_blog_hostname'] || options['group']}..."
|
21
|
+
base_hostname = options['tumblr_blog_hostname'] || options['group']
|
22
|
+
tumblr_oauth_api_key= options['tumblr_oauth_api_key']
|
23
|
+
tumblr_oauth_api_secret= options['tumblr_oauth_api_secret']
|
24
|
+
access_token_key = options['tumblr_oauth_access_token_key']
|
25
|
+
access_token_secret = options['tumblr_oauth_access_token_secret']
|
26
|
+
type = options['type'] || 'photo'
|
27
|
+
tags = options['tags'] || ''
|
28
28
|
post_response = nil
|
29
29
|
|
30
30
|
if base_hostname && access_token_key && access_token_secret
|
@@ -1,6 +1,7 @@
|
|
1
1
|
local_path=File.dirname(__FILE__)
|
2
2
|
require "#{local_path}/http"
|
3
3
|
require "#{local_path}/../log_aware"
|
4
|
+
require 'twitter'
|
4
5
|
|
5
6
|
module Tweetlr::Processors
|
6
7
|
#utilities for dealing with twitter
|
@@ -25,21 +26,53 @@ module Tweetlr::Processors
|
|
25
26
|
|
26
27
|
#fire a new search
|
27
28
|
def self.search(config)
|
28
|
-
search_call = "#{config[
|
29
|
-
|
29
|
+
search_call = "#{config['search_term'].gsub('+', ' OR ')} filter:links"
|
30
|
+
log.debug "#{self}::search search_call: #{search_call}"
|
31
|
+
response = self.call_twitter_api(search_call, config)
|
32
|
+
log.debug "#{self}::call_twitter_api response: #{response.inspect}"
|
33
|
+
response
|
30
34
|
end
|
31
35
|
|
32
36
|
# lazy update - search for a term or refresh the search if a response is available already
|
33
37
|
def self.lazy_search(config)
|
38
|
+
log.debug "#{self}::lazy_search called with config #{config}"
|
34
39
|
response = nil
|
35
40
|
if config
|
36
|
-
|
37
|
-
log.info "lazy search using '#{
|
38
|
-
response =
|
41
|
+
search_call = "#{config['search_term'].gsub('+', ' OR ')} filter:links"
|
42
|
+
log.info "lazy search using '#{search_call}, :since_id => #{config['since_id'] || config[:since_id]}, :count => #{config['results_per_page']}, :result_type => #{config['result_type']})'"
|
43
|
+
response = self.call_twitter_api(search_call, config, :lazy)
|
39
44
|
else
|
40
45
|
log.error "#{self}.lazy_search: no config given!"
|
41
46
|
end
|
42
47
|
response
|
43
48
|
end
|
49
|
+
private
|
50
|
+
def self.call_twitter_api(search_call, config, lazy=false)
|
51
|
+
::Twitter.configure do |configuration|
|
52
|
+
configuration.consumer_key = config['twitter_app_consumer_key']
|
53
|
+
configuration.consumer_secret = config['twitter_app_consumer_secret']
|
54
|
+
configuration.oauth_token = config['twitter_oauth_token']
|
55
|
+
configuration.oauth_token_secret = config['twitter_oauth_token_secret']
|
56
|
+
end
|
57
|
+
max_attempts = 3
|
58
|
+
num_attempts = 0
|
59
|
+
begin
|
60
|
+
num_attempts += 1
|
61
|
+
if lazy
|
62
|
+
response = ::Twitter.search(search_call, :since_id => config['since_id'] || config[:since_id], :count => config['results_per_page'], :result_type => config['result_type'])
|
63
|
+
else
|
64
|
+
response = ::Twitter.search(search_call, :count => config['results_per_page'], :result_type => config['result_type'])
|
65
|
+
end
|
66
|
+
rescue ::Twitter::Error::TooManyRequests => error
|
67
|
+
if num_attempts <= max_attempts
|
68
|
+
# NOTE: Your process could go to sleep for up to 15 minutes but if you
|
69
|
+
# retry any sooner, it will almost certainly fail with the same exception.
|
70
|
+
sleep error.rate_limit.reset_in
|
71
|
+
retry
|
72
|
+
else
|
73
|
+
log.error "Twitter API rate limit exceeded - going to sleep for error.rate_limit.reset_in seconds. (#{error})"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
44
77
|
end
|
45
78
|
end
|
data/lib/tweetlr.rb
CHANGED
data/spec/core_spec.rb
CHANGED
@@ -2,26 +2,17 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Tweetlr::Core do
|
4
4
|
|
5
|
-
config_file = File.join( Dir.pwd, 'config', 'tweetlr.yml.
|
5
|
+
config_file = File.join( Dir.pwd, 'config', 'tweetlr.yml.dev')
|
6
6
|
config = YAML.load_file(config_file)
|
7
7
|
TIMESTAMP = config['twitter_timestamp']
|
8
8
|
WHITELIST = config['whitelist']
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
:search_term => 'coffeediary',
|
15
|
-
:result_type => 'recent',
|
16
|
-
:api_endpoint_twitter => Tweetlr::API_ENDPOINT_TWITTER,
|
17
|
-
:loglevel=>1,
|
18
|
-
:tumblr_oauth_access_token_key => config['tumblr_oauth_access_token_key'],
|
19
|
-
:tumblr_oauth_access_token_secret => config['tumblr_oauth_access_token_secret'],
|
20
|
-
:tumblr_oauth_api_secret => config['tumblr_oauth_api_secret'],
|
21
|
-
:tumblr_oauth_api_key => config['tumblr_oauth_api_key'],
|
22
|
-
:tumblr_blog_hostname => config['tumblr_blog_hostname']
|
23
|
-
}
|
10
|
+
before :all do
|
11
|
+
config_file = File.join( Dir.pwd, 'config', 'tweetlr.yml.dev')
|
12
|
+
config = YAML.load_file(config_file)
|
13
|
+
@tweetlr_config = config
|
24
14
|
end
|
15
|
+
|
25
16
|
let(:stubbed_tumblr_post) do
|
26
17
|
{:tumblr_blog_hostname=>nil, :type=>"photo", :date=>"Sun, 28 Apr 2013 14:10:43 +0000", :source=>"https://irs0.4sqi.net/img/general/600x600/304170_IfHzPdhxs9mpGlPk8jogxdul8q8KhTBNmeAiP9H5TyY.jpg", :tags=>"sven_kr", :state=>"published", :caption=>"<a href=\"http://twitter.com/sven_kr/statuses/328511599881097216\" alt=\"tweet\">@sven_kr</a>: #coffeediary Wanted to stay at home but had to test the new tweetlr ;-) (@ Mamalicious w/ @snoopsmaus) [pic]: http://t.co/7ilE9BDJxJ"}
|
27
18
|
end
|
@@ -32,43 +23,19 @@ describe Tweetlr::Core do
|
|
32
23
|
|
33
24
|
describe ".new" do
|
34
25
|
it "initializes a new instance" do
|
35
|
-
new_instance = Tweetlr::Core.new tweetlr_config
|
26
|
+
new_instance = Tweetlr::Core.new @tweetlr_config
|
36
27
|
new_instance.should be
|
37
28
|
end
|
38
29
|
end
|
39
30
|
describe ".crawl(config)" do
|
40
31
|
before(:each) do
|
41
32
|
stub_tumblr
|
42
|
-
stub_twitter
|
43
33
|
stub_oauth
|
44
34
|
end
|
45
35
|
it "crawls twitter and posts to tumblr" do
|
46
36
|
Tweetlr::Combinators::TwitterTumblr.stub(:generate_photo_post_from_tweet).and_return stubbed_tumblr_post
|
47
|
-
since_id_before = tweetlr_config[
|
48
|
-
result = Tweetlr::Core.crawl(tweetlr_config)
|
49
|
-
since_id_before.should_not == result[:since_id]
|
50
|
-
end
|
51
|
-
it "copes with legacy config that use tumblr v1 api (basic auth)" do
|
52
|
-
legacy_config = {
|
53
|
-
:id=>16,
|
54
|
-
:search_term=>"booga",
|
55
|
-
:tumblr_email=>"wooga@booga.de",
|
56
|
-
:tumblr_password=>"boogawooga",
|
57
|
-
:since_id=>"246543935663661057",
|
58
|
-
:results_per_page=>3,
|
59
|
-
:result_type=>nil,
|
60
|
-
:api_endpoint_twitter=>nil,
|
61
|
-
:api_endpoint_tumblr=>nil,
|
62
|
-
:update_period=>900,
|
63
|
-
:shouts=>nil,
|
64
|
-
:loglevel=>1,
|
65
|
-
:whitelist=>["user1", "user2"],
|
66
|
-
:last_crawl=>"Fri, 14 Sep 2012 09:43:10 UTC +00:00",
|
67
|
-
:active=>true,
|
68
|
-
:tumblr_oauth_access_token_key=>nil,
|
69
|
-
:tumblr_oauth_access_token_secret=>nil}
|
70
|
-
since_id_before = legacy_config[:since_id]
|
71
|
-
result = Tweetlr::Core.crawl(legacy_config)
|
37
|
+
since_id_before = @tweetlr_config['since_id']
|
38
|
+
result = Tweetlr::Core.crawl(@tweetlr_config)
|
72
39
|
since_id_before.should_not == result[:since_id]
|
73
40
|
end
|
74
41
|
end
|
@@ -2,21 +2,10 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Tweetlr::Processors::Tumblr do
|
4
4
|
before :all do
|
5
|
-
config_file = File.join( Dir.pwd, 'config', 'tweetlr.yml')
|
5
|
+
config_file = File.join( Dir.pwd, 'config', 'tweetlr.yml.dev')
|
6
6
|
config = YAML.load_file(config_file)
|
7
7
|
@twitter_response = {"from_user_id_str"=>"1915714", "profile_image_url"=>"http://a0.twimg.com/profile_images/386000279/2_normal.jpg", "created_at"=>"Sun, 17 Apr 2011 16:48:42 +0000", "from_user"=>"whitey_Mc_whIteLIst", "id_str"=>"59659561224765440", "metadata"=>{"result_type"=>"recent"}, "to_user_id"=>nil, "text"=>"Rigaer #wirsounterwegs #{@first_link} @ Augenarzt Dr. Lierow #{@second_link} #{@third_link}", "id"=>59659561224765440, "from_user_id"=>1915714, "geo"=>{"type"=>"Point", "coordinates"=>[52.5182, 13.454]}, "iso_language_code"=>"de", "place"=>{"id"=>"3078869807f9dd36", "type"=>"city", "full_name"=>"Berlin, Berlin"}, "to_user_id_str"=>nil, "source"=>"<a href="http://instagr.am" rel="nofollow">instagram</a>"}
|
8
|
-
@tweetlr_config =
|
9
|
-
:since_id => 0,
|
10
|
-
:search_term => 'moped',
|
11
|
-
:results_per_page => 100,
|
12
|
-
:result_type => 'recent',
|
13
|
-
:api_endpoint_twitter => Tweetlr::API_ENDPOINT_TWITTER,
|
14
|
-
:tumblr_oauth_api_key => config['tumblr_oauth_api_key'],
|
15
|
-
:tumblr_oauth_api_secret => config['tumblr_oauth_api_secret'],
|
16
|
-
:tumblr_blog_hostname => config['tumblr_blog_hostname'],
|
17
|
-
:tumblr_oauth_access_token_key => config['tumblr_oauth_access_token_key'],
|
18
|
-
:tumblr_oauth_access_token_secret => config['tumblr_oauth_access_token_secret']
|
19
|
-
}
|
8
|
+
@tweetlr_config = config
|
20
9
|
end
|
21
10
|
it "posts to tumblr" do
|
22
11
|
stub_tumblr
|
@@ -1,38 +1,33 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Tweetlr::Processors::Twitter do
|
4
|
+
before :all do
|
5
|
+
config_file = File.join( Dir.pwd, 'config', 'tweetlr.yml.dev')
|
6
|
+
@twitter_config = YAML.load_file(config_file)
|
7
|
+
end
|
4
8
|
before :each do
|
5
9
|
@first_link = "http://url.com"
|
6
10
|
@second_link = "http://instagr.am/p/DzCWn/"
|
7
11
|
@third_link = "https://imageurl.com"
|
8
12
|
@twitter_response = {"from_user_id_str"=>"1915714", "profile_image_url"=>"http://a0.twimg.com/profile_images/386000279/2_normal.jpg", "created_at"=>"Sun, 17 Apr 2011 16:48:42 +0000", "from_user"=>"whitey_Mc_whIteLIst", "id_str"=>"59659561224765440", "metadata"=>{"result_type"=>"recent"}, "to_user_id"=>nil, "text"=>"Rigaer #wirsounterwegs #{@first_link} @ Augenarzt Dr. Lierow #{@second_link} #{@third_link}", "id"=>59659561224765440, "from_user_id"=>1915714, "geo"=>{"type"=>"Point", "coordinates"=>[52.5182, 13.454]}, "iso_language_code"=>"de", "place"=>{"id"=>"3078869807f9dd36", "type"=>"city", "full_name"=>"Berlin, Berlin"}, "to_user_id_str"=>nil, "source"=>"<a href="http://instagr.am" rel="nofollow">instagram</a>"}
|
9
|
-
@twitter_config = {
|
10
|
-
:since_id => 0,
|
11
|
-
:search_term => 'moped',
|
12
|
-
:results_per_page => 100,
|
13
|
-
:result_type => 'recent',
|
14
|
-
:api_endpoint_twitter => Tweetlr::API_ENDPOINT_TWITTER
|
15
|
-
}
|
16
13
|
end
|
17
14
|
describe "#search(config)" do
|
18
15
|
it "searches twitter for a given term" do
|
19
|
-
stub_twitter
|
16
|
+
#stub_twitter
|
20
17
|
response = Tweetlr::Processors::Twitter::search @twitter_config
|
21
|
-
tweets = response
|
18
|
+
tweets = response.statuses
|
22
19
|
tweets.should be
|
23
20
|
tweets.should_not be_empty
|
24
21
|
end
|
25
22
|
end
|
26
23
|
describe "#lazy_search(config)" do
|
27
24
|
it "searches twitter for a given term" do
|
28
|
-
stub_twitter
|
29
25
|
response = Tweetlr::Processors::Twitter::lazy_search @twitter_config
|
30
26
|
tweets = response['results']
|
31
27
|
tweets.should be
|
32
28
|
tweets.should_not be_empty
|
33
29
|
end
|
34
30
|
it "copes with nil as input" do
|
35
|
-
stub_twitter
|
36
31
|
Tweetlr::Processors::Twitter::lazy_search(nil).should be_nil
|
37
32
|
end
|
38
33
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -11,15 +11,18 @@ end
|
|
11
11
|
require "bundler"
|
12
12
|
require "logger"
|
13
13
|
require "yaml"
|
14
|
+
require 'fakeweb'
|
14
15
|
require "#{File.dirname(__FILE__)}/../lib/tweetlr"
|
15
16
|
|
16
17
|
|
17
18
|
Bundler.require :default, :development, :test
|
18
19
|
|
19
20
|
logger = Logger.new('/dev/null')
|
20
|
-
#logger.level = Logger::DEBUG
|
21
21
|
Tweetlr::LogAware.log = logger
|
22
|
-
|
22
|
+
|
23
|
+
FakeWeb.allow_net_connect = false
|
24
|
+
twitter_search_api_response = File.open("#{File.dirname(__FILE__)}/support/fixtures/twitter_search_api_response.json", 'rb') { |file| file.read }
|
25
|
+
FakeWeb.register_uri(:get, %r|https://api.twitter.com/1.1/search/tweets.json|, :response => twitter_search_api_response)
|
23
26
|
|
24
27
|
def check_pic_url_extraction(service)
|
25
28
|
image_url = Tweetlr::Processors::PhotoService.find_image_url @links[service]
|
@@ -48,11 +51,6 @@ Content-Type: text/plain; charset=utf-8
|
|
48
51
|
stub_instagram
|
49
52
|
end
|
50
53
|
|
51
|
-
def stub_twitter
|
52
|
-
Curl::Easy.any_instance.stub(:body_str).and_return %^{"completed_in":0.013,"max_id":328511599881097216,"max_id_str":"328511599881097216","next_page":"?page=2&max_id=328511599881097216&q=coffeediary&rpp=3&result_type=recent","page":1,"query":"coffeediary","refresh_url":"?since_id=328511599881097216&q=coffeediary&result_type=recent","results":[{"created_at":"Sun, 28 Apr 2013 14:10:43 +0000","from_user":"sven_kr","from_user_id":61437533,"from_user_id_str":"61437533","from_user_name":"Sven Kr\u00e4uter | 5v3n","geo":{"coordinates":[53.563684,9.959734],"type":"Point"},"id":328511599881097216,"id_str":"328511599881097216","iso_language_code":"en","metadata":{"result_type":"recent"},"place":{"full_name":"Hamburg","id":"171b760b35e47fe5","type":"CITY"},"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/2305774679\/am2l5mt563000bt0jwvw_normal.jpeg","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/2305774679\/am2l5mt563000bt0jwvw_normal.jpeg","source":"<a href="http:\/\/foursquare.com">foursquare<\/a>","text":"#coffeediary Wanted to stay at home but had to test the new tweetlr ;-) (@ Mamalicious w\/ @snoopsmaus) [pic]: http:\/\/t.co\/7ilE9BDJxJ"}],"results_per_page":1,"since_id":0,"since_id_str":"0"}^
|
53
|
-
Curl::Easy.any_instance.stub(:perform).and_return Curl::Easy.new
|
54
|
-
end
|
55
|
-
|
56
54
|
def stub_twimg
|
57
55
|
Curl::Easy.any_instance.stub(:body_str).and_return %|<div class="js-tweet-details-fixer tweet-details-fixer">
|
58
56
|
|
@@ -531,4 +529,3 @@ def stub_eyeem
|
|
531
529
|
Curl::Easy.any_instance.stub(:body_str).and_return "<!DOCTYPE html>\n<html xmlns=\"http://www.w3.org/1999/xhtml\">\n<head>\n<meta charset=\"utf-8\"/>\n<link rel=\"shortcut icon\" href=\"/favicon.ico\" />\n<meta name=\"title\" content=\"EyeEm\" />\n<meta name=\"description\" content=\"EyeEm is a photo-sharing and discovery app that connects people through the photos they take. Snap a photo and see where it takes you! It's free.\" />\n<title>EyeEm</title>\n<link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"/css/eyeem.c.css?1334330223\" />\n <meta content=\"EyeEm\" property=\"og:title\">\n<meta content=\"website\" property=\"og:type\">\n<meta content=\"EyeEm\" property=\"og:site_name\">\n<meta content=\"http://www.eyeem.com/p/326629\" property=\"og:url\">\n<meta content=\"http://www.eyeem.com/thumb/640/480/e35db836c5d3f02498ef60fc3d53837fbe621561-1334126483\" property=\"og:image\">\n<meta content=\"EyeEm is a photo-sharing and discovery app that connects people through the photos they take. Snap a photo and see where it takes you! It's free.\" property=\"og:description\">\n<meta content=\"138146182878222\" property=\"fb:app_id\">\n<script type=\"text/javascript\">\n\n var _gaq = _gaq || [];\n _gaq.push(['_setAccount', 'UA-12590370-2']);\n _gaq.push(['_trackPageview']);\n\n (function() {\n var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;\n ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';\n var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);\n })();\n\n</script>\n</head>\n<body>\n\n<div id=\"fb-root\">\n <!-- you must include this div for the JS SDK to load properly -->\n</div>\n<script>\n window.fbAsyncInit = function() {\n FB.init({\n appId : '138146182878222', // App ID\n channelUrl : '//WWW.YOUR_DOMAIN.COM/channel.html', // Channel File\n status : true, // check login status\n cookie : true, // enable cookies to allow the server to access the session\n xfbml : true // parse XFBML\n });\n\n // Additional initialization code here\n };\n\n // Load the SDK Asynchronously\n (function(d){\n var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];\n if (d.getElementById(id)) {return;}\n js = d.createElement('script'); js.id = id; js.async = true;\n js.src = \"//connect.facebook.net/en_US/all.js\";\n ref.parentNode.insertBefore(js, ref);\n }(document));\n</script>\n \n \n\n\n <div id=\"page\">\n <div id=\"header\">\n <div name=\"top\" class=\"top_bar\"><div class=\"top_bar-inner\">\n <div class=\"padding-top\"></div>\n <div class=\"top_bar_content\">\n <div class=\"search_box\">\n \t<form action=\"/search\" method=\"get\" enctype=\"application/x-www-form-urlencoded\">\n <input type=\"text\" name=\"query\" class=\"search_form_query\" placeholder=\"Search\" id=\"query\" /> <!-- \t <input class=\"search_form_submit\" type=\"image\" value=\"submit\" src=\"\"/> -->\n \t <input class=\"search_form_submit\" type=\"submit\" value=\"\" />\n \t</form>\n </div>\n <div class=\"homelink\">\n \t<a href=\"/\">\n <img src=\"/images/layout/topbar_logo.png\">\n \t</a>\n </div>\n \n \n \n <div class=\"top_menus\">\n <div class=\"top_menu user_menu\">\n \t\t <a class=\"user_login smooth_hover\" href=\"/login\">\n \t\t\t\t<span class=\"\">Login</span>\n \t\t </a>\n </div>\n \n \n \n <div class=\"top_menu about_menu\">\n \t\t <a class=\"top_menu_button about_box smooth_hover\" href=\"javascript:void(0)\">\n \t\t\t\t<span class=\"about_name\">About</span>\n \t\t <img class=\"more_triangle\" src=\"/images/layout/topbar_triangle.png\">\n \t\t </a>\n \t\t <ul class=\"\">\n \t\t<li class=\"hidden\"><a class=\"smooth_hover\" href=\"/whatiseyeem\"><span>What is EyeEm?</span></a></li>\n \t\t<li class=\"hidden\"><a class=\"smooth_hover\" href=\"/gettheapp\"><span>Download the App</span></a></li>\n \t\t<li class=\"hidden\"><a class=\"smooth_hover\" href=\"/contact\"><span>Contact and Press</span></a></li>\n \t\t<li class=\"hidden\"><a class=\"smooth_hover\" href=\"/team\"><span>Team & Jobs</span></a></li>\n \t\t<li class=\"hidden\"><a class=\"smooth_hover\" href=\"http://blog.eyeem.com\" target=\"_blank\"><span>Blog</span></a></li>\n \t\t<li class=\"hidden\"><a class=\"smooth_hover\" href=\"/pages/service.html\"><span>Terms of service</span></a></li>\n \t\t </ul>\n </div> \n </div>\n \n </div>\n</div></div>\n <div class=\"top_bar_back\"></div>\n </div> <!-- /#header -->\n <div id=\"content\">\n \n\n<div class=\"join_block\">\n <div class=\"join_inner\">\n <span class=\"join_description\">\n <p>Take & Discover photos</p>\n <p>together with EyeEm!</p>\n </span>\n <div class=\"join_now\">\n <div><a class=\"eyeem_button join_button\" href=\"/signup\">Join now!</a></div>\n <div class=\"learn_more\"><a class=\"\" href=\"/whatiseyeem\">Learn more</a></div>\n </div>\n </div>\n</div>\n<div class=\"inner-content photo_inner_content\">\n <div class=\"photo_indicator\"><img src=\"/images/layout/triangle_indicator.png\"></div>\n <div class=\"viewports-wrapper\">\n <div class=\"viewport active\" data-photo-id=\"326629\">\n \n\n <div class=\"viewport-user\">\n \t<a href=\"/u/8157\">\n \t\t<img class=\"user_face\" src=\"http://www.eyeem.com/thumb/sq/50/2033ff7cc732c4b8e1ee4375aa00b16d365b51c7.jpg\">\n \t</a>\n \t<span class=\"user_text\">\n \t<a class=\"user_name\" href=\"/u/8157\">\n \t\t<span><h2>Sven Kr\xC3\xA4uter</h2></span>\n \t</a>\n \t<div class=\"meta\">\n <div class=\"viewport-age\">\n \t <span>4</span> days ago </div>\n \t</div>\n \t</span>\n </div> \t\t\n \t\t\n \t\t\n <div class=\"viewport-pic\">\n <img src=\"http://www.eyeem.com/thumb/h/1024/e35db836c5d3f02498ef60fc3d53837fbe621561-1334126483\">\n </div>\n \n \n <div class=\"viewport-albums\">\n <div class=\"tags tags_arrow\">\n \n \n <div class=\"album_tag_box hover_container\">\n <a class=\"album_tag tag\" href=\"/a/168255\">#coffeediary</a>\n </div> \t \t\n \t </div>\n <div class=\"places tags_arrow\">\n \t </div>\n </div>\n \n \n\n <div class=\"viewport-likes\">\n <div class=\"likes_count count\">1 like</div>\n <span class=\"user_thumbs\">\n <a class=\"user_thumb hover_container\" href=\"/u/85456\">\n <img class=\"user_face\" alt=\"filtercake-nophoto\" src=\"http://www.eyeem.com/thumb/sq/50/a5799d443153b9becad3a1e15d15c1ad79739f32.jpg\">\n </a>\n </span>\n \t<span class=\"like_area\">\n <div class=\"like_action action\">\n \t \t\t \t\t\t<a class=\"photo_like eyeem_button like_button\" href=\"javascript:void(0)\">Like<img class=\"button_spinner\" src=\"/images/layout/spinner.gif\"></a>\n \t\t \t </div> \t\n \t\n \t</span>\n </div>\n \n \n <div class=\"viewport-comments\">\n \t<div class=\"comments_count count\">1 comment</div>\n \t \t<div class=\"comment_box\">\n <a class=\"user_face_link\" href=\"/u/8157\">\n <img class=\"user_face\" src=\"http://www.eyeem.com/thumb/sq/50/2033ff7cc732c4b8e1ee4375aa00b16d365b51c7.jpg\">\n </a>\n <span class=\"comment_display\">\n <a class=\"user_name\" href=\"/u/8157\">\n Sven Kr\xC3\xA4uter </a>\n <div class=\"comment_body\">\n still using the bialetti until the spare parts for the espresso machine arrive. quite cozy actually. </div>\n <div class=\"comment_age\"><span>4</span> days ago</div>\n </span>\n</div>\n \t </div>\n \n <div class=\"viewport-social\">\n <div class=\"social\">\n <div class=\"twitter-like\">\n <script src=\"http://platform.twitter.com/widgets.js\" type=\"text/javascript\"></script>\n <a href=\"http://twitter.com/share\" class=\"twitter-share-button\" data-url=\"http://www.eyeem.com/p/326629\">Tweet</a>\n </div>\n <div class=\"facebook-like\">\n <div class=\"fb-like\" data-href=\"http://www.eyeem.com/p/326629\" data-send=\"false\" data-layout=\"button_count\" data-width=\"20\" data-show-faces=\"false\" data-font=\"verdana\"></div>\n </div>\n </div>\n </div>\n\n </div>\n </div>\n</div> </div> <!-- /#content -->\n </div> <!-- /#page -->\n \n <script type=\"text/javascript\">\n var app_url = 'http://www.eyeem.com/';\nvar signup_url = 'http://www.eyeem.com/signup';\nvar authenticated = false;\n </script>\n\n <script type=\"text/javascript\" src=\"/js/eyeem.c.js?1334330223\"></script>\n\n</body>\n</html>"
|
532
530
|
end
|
533
531
|
|
534
|
-
|
@@ -0,0 +1,22 @@
|
|
1
|
+
HTTP/1.1 200 OK
|
2
|
+
cache-control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0
|
3
|
+
content-length: 32656
|
4
|
+
content-type: application/json;charset=utf-8
|
5
|
+
date: Fri, 28 Jun 2013 17:55:47 GMT
|
6
|
+
expires: Tue, 31 Mar 1981 05:00:00 GMT
|
7
|
+
last-modified: Fri, 28 Jun 2013 17:55:47 GMT
|
8
|
+
pragma: no-cache
|
9
|
+
server: tfe
|
10
|
+
set-cookie: lang=de
|
11
|
+
set-cookie: guest_id=v1%3A137244214779516322; Domain=.twitter.com; Path=/; Expires=Sun, 28-Jun-2015 17:55:47 UTC
|
12
|
+
status: 200 OK
|
13
|
+
strict-transport-security: max-age=631138519
|
14
|
+
x-access-level: read
|
15
|
+
x-frame-options: SAMEORIGIN
|
16
|
+
x-rate-limit-limit: 180
|
17
|
+
x-rate-limit-remaining: 179
|
18
|
+
x-rate-limit-reset: 1372443047
|
19
|
+
x-transaction: d71db59d56b39732
|
20
|
+
x-xss-protection: 1; mode=block
|
21
|
+
|
22
|
+
{"statuses":[{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Jun 28 04:22:55 +0000 2013","id":350469335690645504,"id_str":"350469335690645504","text":"#kaffee1.0 #coffee #pics #tasskaff #coffeediary #smkh #dailycoffee http:\/\/t.co\/4cu5M83yG5","source":"\u003ca href=\"http:\/\/instagram.com\" rel=\"nofollow\"\u003eInstagram\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":5402272,"id_str":"5402272","name":"oliver kreimer","screen_name":"011i","location":"Hameln, Germany","description":"#coffee #kids #computerscience #photography #biking","url":"http:\/\/t.co\/BXWfd1Nj9h","entities":{"url":{"urls":[{"url":"http:\/\/t.co\/BXWfd1Nj9h","expanded_url":"http:\/\/nullenundeinsenschubser.de","display_url":"nullenundeinsenschubser.de","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":491,"friends_count":788,"listed_count":38,"created_at":"Sun Apr 22 14:31:06 +0000 2007","favourites_count":6289,"utc_offset":3600,"time_zone":"Berlin","geo_enabled":true,"verified":false,"statuses_count":15542,"lang":"de","contributors_enabled":false,"is_translator":false,"profile_background_color":"6E6868","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/18162319\/013d2.jpg","profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/18162319\/013d2.jpg","profile_background_tile":true,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3639187245\/004dd88961b270f1b93956217c0dc1c2_normal.jpeg","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3639187245\/004dd88961b270f1b93956217c0dc1c2_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/5402272\/1355478803","profile_link_color":"243964","profile_sidebar_border_color":"948D7B","profile_sidebar_fill_color":"5888EB","profile_text_color":"000000","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"kaffee1","indices":[0,8]},{"text":"coffee","indices":[11,18]},{"text":"pics","indices":[19,24]},{"text":"tasskaff","indices":[25,34]},{"text":"coffeediary","indices":[35,47]},{"text":"smkh","indices":[48,53]},{"text":"dailycoffee","indices":[54,66]}],"symbols":[],"urls":[{"url":"http:\/\/t.co\/4cu5M83yG5","expanded_url":"http:\/\/instagram.com\/p\/bFs2o7SfBx\/","display_url":"instagram.com\/p\/bFs2o7SfBx\/","indices":[67,89]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"ja"},"created_at":"Thu Jun 27 11:55:31 +0000 2013","id":350220846079553537,"id_str":"350220846079553537","text":"You'll see. #coffeediary #Hipstamatic #Tinto1884 #Dylan @ \u30d5\u30ec\u30c3\u30b7\u30e5\u30cd\u30b9\u30d0\u30fc\u30ac\u30fc \u7d4c\u5802\u5e97 http:\/\/t.co\/SbEHLk86Md","source":"\u003ca href=\"http:\/\/instagram.com\" rel=\"nofollow\"\u003eInstagram\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":28969581,"id_str":"28969581","name":"Saiko Minomusi","screen_name":"saikom","location":"under your bed..","description":"Love music\/noise\/festivals\/f1\/\uf8ff\/art and science\/paprika and bambie\/etc. ''I thought what I'd do was, I'd pretend I was one of those deaf-mutes or should I?''","url":null,"entities":{"description":{"urls":[]}},"protected":false,"followers_count":955,"friends_count":783,"listed_count":52,"created_at":"Sun Apr 05 10:34:04 +0000 2009","favourites_count":2300,"utc_offset":32400,"time_zone":"Tokyo","geo_enabled":false,"verified":false,"statuses_count":16327,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"2E2916","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/450080932\/kinokonoko.jpg","profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/450080932\/kinokonoko.jpg","profile_background_tile":true,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1156733233\/photo6_normal.jpg","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1156733233\/photo6_normal.jpg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/28969581\/1361186037","profile_link_color":"FA4605","profile_sidebar_border_color":"8A2BE2","profile_sidebar_fill_color":"333333","profile_text_color":"3BCBFF","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":{"type":"Point","coordinates":[35.64910858,139.63653356]},"coordinates":{"type":"Point","coordinates":[139.63653356,35.64910858]},"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"coffeediary","indices":[12,24]},{"text":"Hipstamatic","indices":[26,38]},{"text":"Tinto1884","indices":[39,49]},{"text":"Dylan","indices":[50,56]}],"symbols":[],"urls":[{"url":"http:\/\/t.co\/SbEHLk86Md","expanded_url":"http:\/\/instagram.com\/p\/bD7q8Jg89I\/","display_url":"instagram.com\/p\/bD7q8Jg89I\/","indices":[75,97]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"ja"},{"metadata":{"result_type":"recent","iso_language_code":"de"},"created_at":"Thu Jun 27 09:35:52 +0000 2013","id":350185703415623684,"id_str":"350185703415623684","text":"Kleine St\u00e4rkung :) #coffee #coffeediary @ Impala Coffee http:\/\/t.co\/bm1UvT9dcR","source":"\u003ca href=\"http:\/\/instagram.com\" rel=\"nofollow\"\u003eInstagram\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":280928169,"id_str":"280928169","name":"N. White","screen_name":"citoyenberlin","location":"Berlin","description":"Liest B\u00fccher, sammelt Operngesamtaufnahmen, trinkt gerne Tee und mag meist nicht abwarten.\r\nBooks, opera recordings, tea; sometimes impatient.","url":null,"entities":{"description":{"urls":[]}},"protected":false,"followers_count":191,"friends_count":281,"listed_count":10,"created_at":"Tue Apr 12 09:04:47 +0000 2011","favourites_count":2499,"utc_offset":3600,"time_zone":"Berlin","geo_enabled":true,"verified":false,"statuses_count":7378,"lang":"de","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/821228029\/3d42a951fb39ce38eef572ad0794357e.jpeg","profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/821228029\/3d42a951fb39ce38eef572ad0794357e.jpeg","profile_background_tile":true,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1308803654\/neu_normal.jpg","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1308803654\/neu_normal.jpg","profile_link_color":"0084B4","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":{"type":"Point","coordinates":[52.49834597,13.354063]},"coordinates":{"type":"Point","coordinates":[13.354063,52.49834597]},"place":{"id":"3078869807f9dd36","url":"http:\/\/api.twitter.com\/1\/geo\/id\/3078869807f9dd36.json","place_type":"city","name":"Berlin","full_name":"Berlin, Berlin","country_code":"DE","country":"Germany","bounding_box":{"type":"Polygon","coordinates":[[[13.088303999999999,52.338079],[13.760909,52.338079],[13.760909,52.675323],[13.088303999999999,52.675323]]]},"attributes":{}},"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"coffee","indices":[19,26]},{"text":"coffeediary","indices":[27,39]}],"symbols":[],"urls":[{"url":"http:\/\/t.co\/bm1UvT9dcR","expanded_url":"http:\/\/instagram.com\/p\/bDr4hbpc4f\/","display_url":"instagram.com\/p\/bDr4hbpc4f\/","indices":[56,78]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"de"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Thu Jun 27 04:05:04 +0000 2013","id":350102453888356352,"id_str":"350102453888356352","text":"#kaffee1.0 #coffee #pics #tasskaff #coffeediary #smkh #dailycoffee http:\/\/t.co\/q6xOREZRQE","source":"\u003ca href=\"http:\/\/instagram.com\" rel=\"nofollow\"\u003eInstagram\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":5402272,"id_str":"5402272","name":"oliver kreimer","screen_name":"011i","location":"Hameln, Germany","description":"#coffee #kids #computerscience #photography #biking","url":"http:\/\/t.co\/BXWfd1Nj9h","entities":{"url":{"urls":[{"url":"http:\/\/t.co\/BXWfd1Nj9h","expanded_url":"http:\/\/nullenundeinsenschubser.de","display_url":"nullenundeinsenschubser.de","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":491,"friends_count":788,"listed_count":38,"created_at":"Sun Apr 22 14:31:06 +0000 2007","favourites_count":6289,"utc_offset":3600,"time_zone":"Berlin","geo_enabled":true,"verified":false,"statuses_count":15542,"lang":"de","contributors_enabled":false,"is_translator":false,"profile_background_color":"6E6868","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/18162319\/013d2.jpg","profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/18162319\/013d2.jpg","profile_background_tile":true,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3639187245\/004dd88961b270f1b93956217c0dc1c2_normal.jpeg","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3639187245\/004dd88961b270f1b93956217c0dc1c2_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/5402272\/1355478803","profile_link_color":"243964","profile_sidebar_border_color":"948D7B","profile_sidebar_fill_color":"5888EB","profile_text_color":"000000","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"kaffee1","indices":[0,8]},{"text":"coffee","indices":[11,18]},{"text":"pics","indices":[19,24]},{"text":"tasskaff","indices":[25,34]},{"text":"coffeediary","indices":[35,47]},{"text":"smkh","indices":[48,53]},{"text":"dailycoffee","indices":[54,66]}],"symbols":[],"urls":[{"url":"http:\/\/t.co\/q6xOREZRQE","expanded_url":"http:\/\/instagram.com\/p\/bDGBAASfOD\/","display_url":"instagram.com\/p\/bDGBAASfOD\/","indices":[67,89]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Wed Jun 26 04:46:18 +0000 2013","id":349750442579861506,"id_str":"349750442579861506","text":"#kaffee1.0 #coffee #pics #tasskaff #coffeediary #smkh #dailycoffee http:\/\/t.co\/ks8i92krK1","source":"\u003ca href=\"http:\/\/instagram.com\" rel=\"nofollow\"\u003eInstagram\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":5402272,"id_str":"5402272","name":"oliver kreimer","screen_name":"011i","location":"Hameln, Germany","description":"#coffee #kids #computerscience #photography #biking","url":"http:\/\/t.co\/BXWfd1Nj9h","entities":{"url":{"urls":[{"url":"http:\/\/t.co\/BXWfd1Nj9h","expanded_url":"http:\/\/nullenundeinsenschubser.de","display_url":"nullenundeinsenschubser.de","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":491,"friends_count":788,"listed_count":38,"created_at":"Sun Apr 22 14:31:06 +0000 2007","favourites_count":6289,"utc_offset":3600,"time_zone":"Berlin","geo_enabled":true,"verified":false,"statuses_count":15542,"lang":"de","contributors_enabled":false,"is_translator":false,"profile_background_color":"6E6868","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/18162319\/013d2.jpg","profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/18162319\/013d2.jpg","profile_background_tile":true,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3639187245\/004dd88961b270f1b93956217c0dc1c2_normal.jpeg","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3639187245\/004dd88961b270f1b93956217c0dc1c2_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/5402272\/1355478803","profile_link_color":"243964","profile_sidebar_border_color":"948D7B","profile_sidebar_fill_color":"5888EB","profile_text_color":"000000","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"kaffee1","indices":[0,8]},{"text":"coffee","indices":[11,18]},{"text":"pics","indices":[19,24]},{"text":"tasskaff","indices":[25,34]},{"text":"coffeediary","indices":[35,47]},{"text":"smkh","indices":[48,53]},{"text":"dailycoffee","indices":[54,66]}],"symbols":[],"urls":[{"url":"http:\/\/t.co\/ks8i92krK1","expanded_url":"http:\/\/instagram.com\/p\/bAl8P3yfHW\/","display_url":"instagram.com\/p\/bAl8P3yfHW\/","indices":[67,89]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"de"},"created_at":"Tue Jun 25 13:57:51 +0000 2013","id":349526857881882625,"id_str":"349526857881882625","text":"Earlier today: Flat White with @ailine #coffeediary @ R\u00f6stst\u00e4tte http:\/\/t.co\/xQTAXL4qFU","source":"\u003ca href=\"http:\/\/instagram.com\" rel=\"nofollow\"\u003eInstagram\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":24479611,"id_str":"24479611","name":"Sebastian Waters","screen_name":"sebastianwaters","location":"Berlin","description":"User Experience Designer \/ Information Architect, Co-Founder of supernov.ae, Contributor to @DMIG & @siteswelike","url":"http:\/\/t.co\/uvpIVrAgxk","entities":{"url":{"urls":[{"url":"http:\/\/t.co\/uvpIVrAgxk","expanded_url":"http:\/\/www.sebastianwaters.com","display_url":"sebastianwaters.com","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":1351,"friends_count":391,"listed_count":54,"created_at":"Sun Mar 15 03:24:57 +0000 2009","favourites_count":5384,"utc_offset":3600,"time_zone":"Berlin","geo_enabled":true,"verified":false,"statuses_count":22155,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"022330","profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme15\/bg.png","profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme15\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3529955269\/0a49735e70e4d804ddaa814ef4ae17b3_normal.jpeg","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3529955269\/0a49735e70e4d804ddaa814ef4ae17b3_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/24479611\/1366105227","profile_link_color":"0084B4","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"FFF7CC","profile_text_color":"0C3E53","profile_use_background_image":false,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":{"type":"Point","coordinates":[52.529113,13.397711]},"coordinates":{"type":"Point","coordinates":[13.397711,52.529113]},"place":{"id":"3078869807f9dd36","url":"http:\/\/api.twitter.com\/1\/geo\/id\/3078869807f9dd36.json","place_type":"city","name":"Berlin","full_name":"Berlin, Berlin","country_code":"DE","country":"Germany","bounding_box":{"type":"Polygon","coordinates":[[[13.088303999999999,52.338079],[13.760909,52.338079],[13.760909,52.675323],[13.088303999999999,52.675323]]]},"attributes":{}},"contributors":null,"retweet_count":0,"favorite_count":1,"entities":{"hashtags":[{"text":"coffeediary","indices":[39,51]}],"symbols":[],"urls":[{"url":"http:\/\/t.co\/xQTAXL4qFU","expanded_url":"http:\/\/instagram.com\/p\/a-xYSMxOlP\/","display_url":"instagram.com\/p\/a-xYSMxOlP\/","indices":[65,87]}],"user_mentions":[{"screen_name":"ailine","name":"Ailine Liefeld","id":15747756,"id_str":"15747756","indices":[31,38]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"de"},{"metadata":{"result_type":"recent","iso_language_code":"de"},"created_at":"Tue Jun 25 04:50:07 +0000 2013","id":349389018473050114,"id_str":"349389018473050114","text":"#kaffee1.0 #coffee #pics #tasskaff #coffeediary #smkh #dailycoffee @ b\u00e4ckerei deiterding http:\/\/t.co\/3SR5tliTNP","source":"\u003ca href=\"http:\/\/instagram.com\" rel=\"nofollow\"\u003eInstagram\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":5402272,"id_str":"5402272","name":"oliver kreimer","screen_name":"011i","location":"Hameln, Germany","description":"#coffee #kids #computerscience #photography #biking","url":"http:\/\/t.co\/BXWfd1Nj9h","entities":{"url":{"urls":[{"url":"http:\/\/t.co\/BXWfd1Nj9h","expanded_url":"http:\/\/nullenundeinsenschubser.de","display_url":"nullenundeinsenschubser.de","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":491,"friends_count":788,"listed_count":38,"created_at":"Sun Apr 22 14:31:06 +0000 2007","favourites_count":6289,"utc_offset":3600,"time_zone":"Berlin","geo_enabled":true,"verified":false,"statuses_count":15542,"lang":"de","contributors_enabled":false,"is_translator":false,"profile_background_color":"6E6868","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/18162319\/013d2.jpg","profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/18162319\/013d2.jpg","profile_background_tile":true,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3639187245\/004dd88961b270f1b93956217c0dc1c2_normal.jpeg","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3639187245\/004dd88961b270f1b93956217c0dc1c2_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/5402272\/1355478803","profile_link_color":"243964","profile_sidebar_border_color":"948D7B","profile_sidebar_fill_color":"5888EB","profile_text_color":"000000","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":{"type":"Point","coordinates":[52.13038741,9.24720903]},"coordinates":{"type":"Point","coordinates":[9.24720903,52.13038741]},"place":{"id":"c7c87475904f3037","url":"http:\/\/api.twitter.com\/1\/geo\/id\/c7c87475904f3037.json","place_type":"city","name":"Hessisch Oldendorf","full_name":"Hessisch Oldendorf, Hameln-Pyrmont","country_code":"DE","country":"Germany","bounding_box":{"type":"Polygon","coordinates":[[[9.156,52.094006],[9.387540999999999,52.094006],[9.387540999999999,52.220873999999995],[9.156,52.220873999999995]]]},"attributes":{}},"contributors":null,"retweet_count":0,"favorite_count":1,"entities":{"hashtags":[{"text":"kaffee1","indices":[0,8]},{"text":"coffee","indices":[11,18]},{"text":"pics","indices":[19,24]},{"text":"tasskaff","indices":[25,34]},{"text":"coffeediary","indices":[35,47]},{"text":"smkh","indices":[48,53]},{"text":"dailycoffee","indices":[54,66]}],"symbols":[],"urls":[{"url":"http:\/\/t.co\/3SR5tliTNP","expanded_url":"http:\/\/instagram.com\/p\/a-BlbTyfK5\/","display_url":"instagram.com\/p\/a-BlbTyfK5\/","indices":[89,111]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"de"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Mon Jun 24 04:54:32 +0000 2013","id":349027739510116353,"id_str":"349027739510116353","text":"RT @011i: #kaffee1.0 #coffee #pics #tasskaff #coffeediary #smkh #dailycoffee http:\/\/t.co\/fNrWe0V5NS","source":"\u003ca href=\"https:\/\/twitter.com\/coffeers\" rel=\"nofollow\"\u003ecoffeers\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":1262960174,"id_str":"1262960174","name":"coffee lovers","screen_name":"coffeers","location":"","description":"","url":null,"entities":{"description":{"urls":[]}},"protected":false,"followers_count":3121,"friends_count":0,"listed_count":42,"created_at":"Tue Mar 12 21:55:18 +0000 2013","favourites_count":0,"utc_offset":null,"time_zone":null,"geo_enabled":false,"verified":false,"statuses_count":98216,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_image_url_https":"https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png","profile_background_tile":false,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3386217165\/314887eafa9cf0cf2d4ba229156992b3_normal.jpeg","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3386217165\/314887eafa9cf0cf2d4ba229156992b3_normal.jpeg","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":true,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Mon Jun 24 04:38:15 +0000 2013","id":349023641448628224,"id_str":"349023641448628224","text":"#kaffee1.0 #coffee #pics #tasskaff #coffeediary #smkh #dailycoffee http:\/\/t.co\/fNrWe0V5NS","source":"\u003ca href=\"http:\/\/instagram.com\" rel=\"nofollow\"\u003eInstagram\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":5402272,"id_str":"5402272","name":"oliver kreimer","screen_name":"011i","location":"Hameln, Germany","description":"#coffee #kids #computerscience #photography #biking","url":"http:\/\/t.co\/BXWfd1Nj9h","entities":{"url":{"urls":[{"url":"http:\/\/t.co\/BXWfd1Nj9h","expanded_url":"http:\/\/nullenundeinsenschubser.de","display_url":"nullenundeinsenschubser.de","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":491,"friends_count":788,"listed_count":38,"created_at":"Sun Apr 22 14:31:06 +0000 2007","favourites_count":6289,"utc_offset":3600,"time_zone":"Berlin","geo_enabled":true,"verified":false,"statuses_count":15542,"lang":"de","contributors_enabled":false,"is_translator":false,"profile_background_color":"6E6868","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/18162319\/013d2.jpg","profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/18162319\/013d2.jpg","profile_background_tile":true,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3639187245\/004dd88961b270f1b93956217c0dc1c2_normal.jpeg","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3639187245\/004dd88961b270f1b93956217c0dc1c2_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/5402272\/1355478803","profile_link_color":"243964","profile_sidebar_border_color":"948D7B","profile_sidebar_fill_color":"5888EB","profile_text_color":"000000","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":1,"favorite_count":0,"entities":{"hashtags":[{"text":"kaffee1","indices":[0,8]},{"text":"coffee","indices":[11,18]},{"text":"pics","indices":[19,24]},{"text":"tasskaff","indices":[25,34]},{"text":"coffeediary","indices":[35,47]},{"text":"smkh","indices":[48,53]},{"text":"dailycoffee","indices":[54,66]}],"symbols":[],"urls":[{"url":"http:\/\/t.co\/fNrWe0V5NS","expanded_url":"http:\/\/instagram.com\/p\/a7bbLDyfLq\/","display_url":"instagram.com\/p\/a7bbLDyfLq\/","indices":[67,89]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"en"},"retweet_count":1,"favorite_count":0,"entities":{"hashtags":[{"text":"kaffee1","indices":[10,18]},{"text":"coffee","indices":[21,28]},{"text":"pics","indices":[29,34]},{"text":"tasskaff","indices":[35,44]},{"text":"coffeediary","indices":[45,57]},{"text":"smkh","indices":[58,63]},{"text":"dailycoffee","indices":[64,76]}],"symbols":[],"urls":[{"url":"http:\/\/t.co\/fNrWe0V5NS","expanded_url":"http:\/\/instagram.com\/p\/a7bbLDyfLq\/","display_url":"instagram.com\/p\/a7bbLDyfLq\/","indices":[77,99]}],"user_mentions":[{"screen_name":"011i","name":"oliver kreimer","id":5402272,"id_str":"5402272","indices":[3,8]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Mon Jun 24 04:38:15 +0000 2013","id":349023641448628224,"id_str":"349023641448628224","text":"#kaffee1.0 #coffee #pics #tasskaff #coffeediary #smkh #dailycoffee http:\/\/t.co\/fNrWe0V5NS","source":"\u003ca href=\"http:\/\/instagram.com\" rel=\"nofollow\"\u003eInstagram\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":5402272,"id_str":"5402272","name":"oliver kreimer","screen_name":"011i","location":"Hameln, Germany","description":"#coffee #kids #computerscience #photography #biking","url":"http:\/\/t.co\/BXWfd1Nj9h","entities":{"url":{"urls":[{"url":"http:\/\/t.co\/BXWfd1Nj9h","expanded_url":"http:\/\/nullenundeinsenschubser.de","display_url":"nullenundeinsenschubser.de","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":491,"friends_count":788,"listed_count":38,"created_at":"Sun Apr 22 14:31:06 +0000 2007","favourites_count":6289,"utc_offset":3600,"time_zone":"Berlin","geo_enabled":true,"verified":false,"statuses_count":15542,"lang":"de","contributors_enabled":false,"is_translator":false,"profile_background_color":"6E6868","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/18162319\/013d2.jpg","profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/18162319\/013d2.jpg","profile_background_tile":true,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/3639187245\/004dd88961b270f1b93956217c0dc1c2_normal.jpeg","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/3639187245\/004dd88961b270f1b93956217c0dc1c2_normal.jpeg","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/5402272\/1355478803","profile_link_color":"243964","profile_sidebar_border_color":"948D7B","profile_sidebar_fill_color":"5888EB","profile_text_color":"000000","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":1,"favorite_count":0,"entities":{"hashtags":[{"text":"kaffee1","indices":[0,8]},{"text":"coffee","indices":[11,18]},{"text":"pics","indices":[19,24]},{"text":"tasskaff","indices":[25,34]},{"text":"coffeediary","indices":[35,47]},{"text":"smkh","indices":[48,53]},{"text":"dailycoffee","indices":[54,66]}],"symbols":[],"urls":[{"url":"http:\/\/t.co\/fNrWe0V5NS","expanded_url":"http:\/\/instagram.com\/p\/a7bbLDyfLq\/","display_url":"instagram.com\/p\/a7bbLDyfLq\/","indices":[67,89]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Mon Jun 24 04:00:20 +0000 2013","id":349014100828889088,"id_str":"349014100828889088","text":"Photo: coffeediary: #vscocam #vscofeature #coffeethogo #coffeediary #coffee #flatwhite #hamburg #welovehh... http:\/\/t.co\/lNYQwhEg1k","source":"\u003ca href=\"http:\/\/www.tumblr.com\/\" rel=\"nofollow\"\u003eTumblr\u003c\/a\u003e","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":7164732,"id_str":"7164732","name":"Jandy Jean","screen_name":"JandyJean","location":"Singapore","description":"I spazz Super Junior and Beast! http:\/\/t.co\/l62yuSbZ5D http:\/\/t.co\/5FjOytZuMD","url":"http:\/\/t.co\/3mMeERavC4","entities":{"url":{"urls":[{"url":"http:\/\/t.co\/3mMeERavC4","expanded_url":"http:\/\/jandyjean.tumblr.com","display_url":"jandyjean.tumblr.com","indices":[0,22]}]},"description":{"urls":[{"url":"http:\/\/t.co\/l62yuSbZ5D","expanded_url":"http:\/\/jandyjean.blogspot.sg","display_url":"jandyjean.blogspot.sg","indices":[32,54]},{"url":"http:\/\/t.co\/5FjOytZuMD","expanded_url":"http:\/\/about.me\/jandy.jean","display_url":"about.me\/jandy.jean","indices":[55,77]}]}},"protected":false,"followers_count":345,"friends_count":92,"listed_count":17,"created_at":"Sat Jun 30 02:28:02 +0000 2007","favourites_count":4,"utc_offset":28800,"time_zone":"Singapore","geo_enabled":false,"verified":false,"statuses_count":33865,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"FFFFFF","profile_background_image_url":"http:\/\/a0.twimg.com\/profile_background_images\/155409525\/twitter_bg_new.png","profile_background_image_url_https":"https:\/\/si0.twimg.com\/profile_background_images\/155409525\/twitter_bg_new.png","profile_background_tile":true,"profile_image_url":"http:\/\/a0.twimg.com\/profile_images\/1415178815\/twitterdp_normal.JPG","profile_image_url_https":"https:\/\/si0.twimg.com\/profile_images\/1415178815\/twitterdp_normal.JPG","profile_banner_url":"https:\/\/pbs.twimg.com\/profile_banners\/7164732\/1347985384","profile_link_color":"E3B10D","profile_sidebar_border_color":"E3B10D","profile_sidebar_fill_color":"000000","profile_text_color":"F57A08","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"vscocam","indices":[20,28]},{"text":"vscofeature","indices":[29,41]},{"text":"coffeethogo","indices":[42,54]},{"text":"coffeediary","indices":[55,67]},{"text":"coffee","indices":[68,75]},{"text":"flatwhite","indices":[76,86]},{"text":"hamburg","indices":[87,95]},{"text":"welovehh","indices":[96,105]}],"symbols":[],"urls":[{"url":"http:\/\/t.co\/lNYQwhEg1k","expanded_url":"http:\/\/tmblr.co\/ZNaDAyo2dFPa","display_url":"tmblr.co\/ZNaDAyo2dFPa","indices":[109,131]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"en"}],"search_metadata":{"completed_in":0.027,"max_id":350469335690645504,"max_id_str":"350469335690645504","next_results":"?max_id=349014100828889087&q=%25coffeediary%20filter%3Alinks&count=10&include_entities=1&result_type=recent","query":"%25coffeediary+filter%3Alinks","refresh_url":"?since_id=350469335690645504&q=%25coffeediary%20filter%3Alinks&result_type=recent&include_entities=1","count":10,"since_id":0,"since_id_str":"0"}}
|
data/tweetlr.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "tweetlr"
|
3
|
-
s.version = "0.1.
|
3
|
+
s.version = "0.1.30"
|
4
4
|
s.author = "Sven Kraeuter"
|
5
5
|
s.email = "sven.kraeuter@gmail.com"
|
6
6
|
s.homepage = "http://tweetlr.5v3n.com"
|
@@ -16,12 +16,14 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.add_dependency "json", ">= 1.7.7"
|
17
17
|
s.add_dependency "nokogiri"
|
18
18
|
s.add_dependency "oauth"
|
19
|
+
s.add_dependency "twitter"
|
19
20
|
|
20
21
|
s.add_development_dependency "rake"
|
21
22
|
s.add_development_dependency "rspec"
|
22
23
|
s.add_development_dependency "rdoc"
|
23
24
|
s.add_development_dependency "simplecov"
|
24
25
|
s.add_development_dependency "coveralls"
|
26
|
+
s.add_development_dependency "fakeweb", ["~> 1.3"]
|
25
27
|
|
26
28
|
s.files = `git ls-files`.split("\n")
|
27
29
|
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tweetlr
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.30
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-06-28 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: daemons
|
@@ -107,6 +107,22 @@ dependencies:
|
|
107
107
|
- - ! '>='
|
108
108
|
- !ruby/object:Gem::Version
|
109
109
|
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: twitter
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :runtime
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
110
126
|
- !ruby/object:Gem::Dependency
|
111
127
|
name: rake
|
112
128
|
requirement: !ruby/object:Gem::Requirement
|
@@ -187,6 +203,22 @@ dependencies:
|
|
187
203
|
- - ! '>='
|
188
204
|
- !ruby/object:Gem::Version
|
189
205
|
version: '0'
|
206
|
+
- !ruby/object:Gem::Dependency
|
207
|
+
name: fakeweb
|
208
|
+
requirement: !ruby/object:Gem::Requirement
|
209
|
+
none: false
|
210
|
+
requirements:
|
211
|
+
- - ~>
|
212
|
+
- !ruby/object:Gem::Version
|
213
|
+
version: '1.3'
|
214
|
+
type: :development
|
215
|
+
prerelease: false
|
216
|
+
version_requirements: !ruby/object:Gem::Requirement
|
217
|
+
none: false
|
218
|
+
requirements:
|
219
|
+
- - ~>
|
220
|
+
- !ruby/object:Gem::Version
|
221
|
+
version: '1.3'
|
190
222
|
description: tweetlr crawls twitter for a given term, extracts photos out of the collected
|
191
223
|
tweets' short urls and posts the images to tumblr.
|
192
224
|
email: sven.kraeuter@gmail.com
|
@@ -223,6 +255,7 @@ files:
|
|
223
255
|
- spec/processors/tumblr_processor_spec.rb
|
224
256
|
- spec/processors/twitter_processor_spec.rb
|
225
257
|
- spec/spec_helper.rb
|
258
|
+
- spec/support/fixtures/twitter_search_api_response.json
|
226
259
|
- tweetlr.gemspec
|
227
260
|
homepage: http://tweetlr.5v3n.com
|
228
261
|
licenses: []
|
@@ -236,12 +269,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
236
269
|
- - ! '>='
|
237
270
|
- !ruby/object:Gem::Version
|
238
271
|
version: '0'
|
272
|
+
segments:
|
273
|
+
- 0
|
274
|
+
hash: -4221572964862274532
|
239
275
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
240
276
|
none: false
|
241
277
|
requirements:
|
242
278
|
- - ! '>='
|
243
279
|
- !ruby/object:Gem::Version
|
244
280
|
version: '0'
|
281
|
+
segments:
|
282
|
+
- 0
|
283
|
+
hash: -4221572964862274532
|
245
284
|
requirements: []
|
246
285
|
rubyforge_project: tweetlr
|
247
286
|
rubygems_version: 1.8.25
|
@@ -257,3 +296,4 @@ test_files:
|
|
257
296
|
- spec/processors/tumblr_processor_spec.rb
|
258
297
|
- spec/processors/twitter_processor_spec.rb
|
259
298
|
- spec/spec_helper.rb
|
299
|
+
- spec/support/fixtures/twitter_search_api_response.json
|