#: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