-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgenerate.rb
132 lines (101 loc) · 2.52 KB
/
generate.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
require 'net/http'
require 'net/https'
require 'rubygems'
require 'cgi'
require 'json'
require 'RMagick'
include Magick
require 'sinatra'
get '/twitter' do
error 400 if !params[:url]
content_type 'image/png'
begin
get_twitter_stats(params[:url])
rescue
get_image('blank', '0', '#ffffff')
end
end
get '/facebook' do
error 400 if !params[:url]
content_type 'image/png'
begin
get_facebook_stats(params[:url])
rescue
get_image('blank', '0', '#ffffff')
end
end
def to_query(params, *parent)
query = ''
stack = ''
params.each do |k, v|
if v.class == Hash
parent = k
stack = v
else
query << "#{CGI.escape(k)}=#{CGI.escape(v)}&"
end
end
stack.each do |k,v|
query << "#{CGI.escape(parent)}[#{CGI.escape(k)}]=#{CGI.escape(v)}&"
end
return query.chop!
end
def shortenNumber(number)
case(number.length)
when 9
number = number[0, 3] + 'M'
when 8
number = number[0, 2] + 'M'
when 7
number = number[0, 1] + 'M'
when 6
number = number[0, 3] + 'K'
when 5
number = number[0, 2] + 'K'
when 4
number = number[0, 1] + 'K'
else
return number
end
return number;
end
def http_get(domain,path,params)
path = unless params == ''
path + "?" + params.collect { |k,v| "#{k}=#{CGI::escape(v.to_s)}" }.join('&')
else
path
end
request = Net::HTTP.get(domain, path)
end
def get_image(media, count, color)
background = ImageList.new(media + '.png')
canvas = ImageList.new
canvas.new_image(45, 40, TextureFill.new(background))
txt = Draw.new
txt.font_family = 'sans-serif'
txt.pointsize = 11
txt.gravity = CenterGravity
txt.annotate(canvas, 45,35,0,5, shortenNumber(count)){
self.fill = color
}
canvas.format = 'PNG'
return canvas.to_blob
end
def get_facebook_stats(url)
params = {
:query => 'SELECT total_count FROM link_stat WHERE url = "' + url + '"',
:format => 'json'
}
http = http_get('api.facebook.com', '/method/fql.query', params)
stats = JSON.parse(http[1..-2])
return get_image('facebook', stats['total_count'].to_s, '#000000')
end
def get_twitter_stats(url)
uri = URI.parse('http://urls.api.twitter.com')
http = Net::HTTP.new(uri.host, uri.port)
path = '/1/urls/count.json'
params = to_query({'url' => url})
resp, data = http.post(path, params)
stats = JSON.parse(data)
return get_image('twitter', stats['count'].to_s, '#00A5E4')
end