Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2007-10-28

DrakmaでTwitterに投稿

| 20:00 | DrakmaでTwitterに投稿 - わだばLisperになる を含むブックマーク はてなブックマーク - DrakmaでTwitterに投稿 - わだばLisperになる

Drakma(Common Lispで書かれたウェブクライアント)を使ったことがなかったので、これを使って何かしてみたいと思いTwitterに与えられた文字列を投稿する関数を書いてみました。

本当は、自分が利用している図書館の本の予約状況を取得するようなものを作りたかったんですが、日本語を扱っているページでは、UTF-8以外のページのクッキーの取得が上手く行かず*1、自力では解決できなかったので、UTF-8でできているTwitterで何かすることに方向転換しました。

UTF-8のページだと、殆どDrakmaのチュートリアルの通りですんなりとできました。

本当は、パスワード等は、別ファイルに書き出して読み込ませる方が良いと思いますが直に書いてます。

Drakmaは思った以上に便利なんですが、どうやったら文字コードの問題がクリアできるのかー。

(defun update-twitter-status (mesg)
  "twitterに投稿する"
  (let ((mesg-list (split-by-length mesg 50))
	(cj (make-instance 'drakma:cookie-jar)))
    ;; login
    (drakma:http-request "http://twitter.com/sessions" 
			 :external-format-in :utf-8 
			 :external-format-out :utf-8
			 :method :post
			 :cookie-jar cj
			 :parameters `(("username_or_email" . "おなまえ") 
				       ("password" . "パスワード")))
    ;; update
    (do ((m mesg-list (cdr m)))
	((endp m) (length mesg))
      (drakma:http-request "http://twitter.com/status/update" 
			   :external-format-in :utf-8
			   :external-format-out :utf-8
			   :method :post
			   :cookie-jar cj
			   :parameters `(("status" . ,(car m))))
      (unless (endp (cdr m)) (sleep 5)))))

(defun split-by-length (str len)
  "指定した長さ`len'で文字列`str'を区切り、結果を文字列のリストにして返す。"
  (let ((slen (length str)))
    (if (> slen len)
	(do ((pos len (+ pos len))
	     res)
	    ((> pos slen) 
	     (nreverse (push (subseq str (- pos len) slen) res)))
	  (push (subseq str (- pos len) pos) res))
	`(,str))))

*1::external-format-inで、:euc-jpの扱いが良く分からず、:force-binary tで読み込んで、octets-to-stringで戻すことはできるけれど、それだとcookieは拾ってくれない、などとぐるぐる悩む