/
core.clj
96 lines (80 loc) · 2.96 KB
/
core.clj
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
(ns ozwiena.core
(:require [compojure.handler :as handler]
[compojure.route :as route]
[compojure.core :refer [GET POST defroutes]]
[ring.util.codec :refer [url-encode]]
[ring.adapter.jetty :as jetty]
[cheshire.core :as json]
[clojure.java.io :as io]
[clojure.string :refer [join]]
[clj-http.client :as client]
[environ.core :refer [env]]
[overtone.at-at :refer [every mk-pool]])
(:import [java.net URLEncoder]
[java.util Base64])
(:use [ring.util.response]))
(def root (if (env :dev)
"resources/dev/"
"resources/public/"))
(defn render [file]
(file-response file {:root root}))
(defn base64 [data]
(-> Base64
(. getEncoder)
(.encode (.getBytes data))
String.))
(defn get-bearer [key secret]
(let [auth (base64 (str key ":" secret))]
(-> (client/post "https://api.twitter.com/oauth2/token"
{:headers {"Authorization" (str "Basic " auth)}
:content-type "application/x-www-form-urlencoded;charset=UTF-8"
:body "grant_type=client_credentials"})
:body
(json/parse-string true)
:access_token)))
(def bearer (atom ""))
(defn- log [msg & vals]
(let [line (apply format msg vals)]
(locking System/out (println line))))
(defn encode-params [request-params]
(let [encode #(URLEncoder/encode (str %) "UTF-8")
coded (for [[n v] request-params] (str (encode (name n)) "=" (encode v)))]
(apply str (interpose "&" coded))))
(defn twitter-search [query]
(let [url (str "https://api.twitter.com/1.1/search/tweets.json?"
(encode-params query))
key (env :twitter-key)
secret (env :twitter-secret)]
(if (empty? @bearer)
(swap! bearer (fn [_ e] e) (get-bearer key secret)))
(client/get url
{:headers {"Authorization" (str "Bearer " @bearer)}
:as :json})))
(defn json-response [data]
(-> (response (json/generate-string data))
(content-type "aplication/json")
(charset "UTF-8")))
(defroutes app-routes
(GET "/" [] (render "index.html"))
(GET "/tweets.json" [& params] (try
(json-response (:body (twitter-search params)))
(catch Exception e (-> (response (str e))
(status 500)))))
(GET "/ping" [] (str "Pong!"))
(route/resources "/")
(route/not-found "Page not found"))
(def app
(-> #'app-routes
(handler/api)))
(defn -main []
(when (env :ping)
(let [addr (env :ping)
pool (mk-pool)]
(every (* 60 1000)
#(try
(log (str "Ping: " addr))
(client/get addr)
(catch Exception e (print e)))
pool)))
(let [port (Integer/parseInt (get (System/getenv) "PORT" "5000"))]
(jetty/run-jetty app {:port port})))