#:g1: とりあえずCLで書く (2012-08-24)

Posted 2012-08-23 18:25:00 GMT

やりたいこと

私は、TwitterのつぶやきはSLIMEから投稿していて、面白いLisp系ブログがあったらリンクを流したりしていますが、同じ記事をRedditにも投稿することが多く、二度手間なのでどちらにも一度で投稿できるようにしたいな、というところ。とりあえず、Redditに投稿できる仕組みができれば、既存のものと適当に組み合わせて使えるので、それでOK。

(in-package :g1.arc)
(in-readtable :g1.arc)


(cl:defclass reddit-session ()
  ((cookie :initform (cl:make-instance 'drakma:cookie-jar)
           :accessor reddit-session-cookie)
   (user-hash :initform nil
              :accessor reddit-session-user-hash)))


(cl:defvar reddit-session* (cl:make-instance 'reddit-session))


(cl:defvar reddit-user-login-info-file*
  (cl:merge-pathnames (cl:make-pathname :name ".REDDIT-LOGIN" 
                                        :case :common)
                      (cl:user-homedir-pathname) ))


(def reddit-post (url params)
  (let drakma:*drakma-default-external-format* :utf-8
    (drakma:http-request url 
                         :method :post
                         :cookie-jar (reddit-session-cookie reddit-session*)
                         :parameters params)))


(def reddit-login (username)
  (cl:multiple-value-bind (body stat)
                          (reddit-post (+ "https://ssl.reddit.com/api/login/" username)
                                       (cl:acons "api_type" "json"
                                                 (w/infile in reddit-user-login-info-file*
                                                   (cl:read in) )))
    (and (is 200 stat)
         (json:json-bind (json.data.modhash)
                         (babel:octets-to-string body)
           (= (reddit-session-user-hash reddit-session*)
              json.data.modhash )))))


(def reddit-submit (title url sr (o uh (reddit-session-user-hash reddit-session*)) (o kind "link"))
  (babel:octets-to-string
   (reddit-post "http://www.reddit.com/api/submit"
                (cl:pairlis '("title" "url" "sr" "uh" "kind")
                            (list title url sr uh kind) ))))

コード解説

ArcっぽいものとCLっぽいものを混ぜると、Arcっぽいところは短かくてコンパクトだけど、CLなところは横長だなーと思ったりします

comments powered by Disqus