tweetlr 0.1.23 → 0.1.30
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 +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
|