(ns dhynan.main (:require [clojure.java.shell :refer [sh]] [cheshire.core :as json] [clojure.string :as string] [babashka.curl :as curl]) (:import (javax.crypto Mac) (javax.crypto.spec SecretKeySpec))) (defn generate-token [api-secret] (let [encoder (java.util.Base64/getEncoder) header-raw (->> (json/encode {"alg" "HS512" "typ" "JWT"}) .getBytes (.encodeToString encoder)) ; TODO can't figure out how to apply this with an anon function header (clojure.string/replace header-raw "=" "") date (-> (sh "date" "-u" "+%s") :out (clojure.string/replace "\n" "")) payload-raw (->> (json/encode {"iat" date}) .getBytes (.encodeToString encoder)) ; TODO can't figure out how to apply this with an anon function payload (clojure.string/replace payload-raw "=" "") algo "HmacSHA512" mac (Mac/getInstance algo)] (.init mac (SecretKeySpec. (.getBytes api-secret) algo)) (let [sig (->> (.doFinal mac (.getBytes (str header "." payload))) (.encodeToString encoder)) signature (-> sig ; TODO should do url encode here (string/replace "/" "_") (string/replace "=" "") (string/replace "+" "-"))] (str header "." payload "." signature)))) (defn filterer [m] (filter (fn [x] (.contains (get x :url) "bandcamp")) m)) (def token (generate-token (System/getenv "token"))) (defn shaarli-request [offset] (-> (curl/get (str "http://links.mossnet.lan/api/v1/links?searchtags=music&limit=" offset) {:headers {"Authorization" (str "Bearer " token)}}) (:body) (json/parse-string true))) (defn get-all-shaarli-data ([] (get-all-shaarli-data {} 0)) ([data offset] (let [new-data (shaarli-request offset) total-data (concat data new-data) old-last (last data) new-last (last new-data)] (if (= old-last new-last) total-data (get-all-shaarli-data total-data (+ offset 100)))))) (let [shaarli-data (get-all-shaarli-data) ; filter to bandcamp (and maybe others?) filtered-shaarli-data (filterv #(.contains (get % :url) "bandcamp") shaarli-data) file-data (sh "ls" (System/getenv "folder")) ; remove anything in () [] {} filtered-file-data (filterv #(string/replace % #"(.*)" "") file-data)] (->> filtered-shaarli-data (mapv #(select-keys % [:url :title])))) (comment (shaarli-request 0) (count (get-all-shaarli-data)) (filterer {:url "bandcamp"}) (filter (fn [x] (.contains (get x :url) "bandcamp")) [{:url "bandcamp"}]) (println "somestring") (.getBytes (str {"iat" (sh "date" "-u" "+%s")})) (def signature (-> (Mac/getInstance "HmacSHA256") (.init (SecretKeySpec. (.getBytes "test secret") "HmacSHA256")) (.doFinal (.getBytes (str "header.payload") "UTF-8")))) (def sig (let [algo "HmacSHA256" mac (Mac/getInstance algo)] (.init mac (SecretKeySpec. (.getBytes "test secret") algo)) (str (.doFinal mac (.getBytes "header.payload" "UTF-8"))))) (println sig) (.contains "https://somesite.bandcamp.com.au" "bandcamp") (str {"alg" "HS512" "typ" "JWT"}))