org-mode で twitter を読む

Emacsユーザーでツイッターのアカウントを持っている人なら Twittering Mode というのがあるようなのでそちらを使うほうが良いでしょう。

私はツイッターのアカウントを持っていないのでgoogle readerrssを拾って読んでいるのですが、更新されるのがやや遅いのとちょっとしたニュースのチェックくらいはEmacsでやってしまいたい。それで普段使っているorg-modeでrssを取得できるということを知ったのでやってみました。

参考
Emacs org-modeを使ってみる: (22) RSSフィードを取り込む - 屯遁のパズルとプログラミングの日記

こちらのサイトを参考にrssの設定をします。

(setq org-feed-retrieve-method 'wget)
;;(setq org-feed-retrieve-method 'curl)

(setq org-feed-default-template "\n* %h\n  - %U\n  - %a  - %description")

(setq org-feed-alist nil)
(add-to-list 'org-feed-alist
	     '("google" "https://twitter.com/statuses/user_timeline/42123706.rss"
	       "~/Org/rss.org" "google news"))
(add-to-list 'org-feed-alist
	     '("afpbb" "http://twitter.com/statuses/user_timeline/14756409.rss"
	       "~/Org/rss.org" "afpbb news"))

参考ページと同様に ~/Org/rss.org ファイルの最初には以下のように記述しておく.

#+DRAWERS: PROPERTIES CLOCK LOGBOOK FEEDSTATUS
#+TODO: TOREAD | DONE
#+COLUMNS: %60ITEM %TAGS

これでツイッターのrssは取得できるのですが表示されるのは文字コードの羅列です。それを日本語に変換してやらないといけません。

(defun perl-command (command)
  (interactive "sInput perl one-liner: ")
    ;; replace ' with \x27.
    (when (string-match "'" command)
      (setq command (replace-regexp-in-string "'" "\\\\x27" command)))
    (if (and mark-active transient-mark-mode)
        (if (string-match "print" command)
            (shell-command-on-region
             (region-beginning) (region-end) (concat "perl -ne \'" command "\'") nil t)
          (shell-command-on-region 
           (region-beginning) (region-end) (concat "perl -pe \'" command "\'") nil t))
      (insert (shell-command-to-string (concat "perl -e \'" command "\'")))))

(defun number-to-char (x) (format "%c" x))

(defun charcode-to-char (beg end)
  (goto-char beg)
  (while (re-search-forward "&#\\([0-9]+\\);" end t) 
    (replace-match (number-to-char (string-to-number (match-string 1))))))

(defun org-rss-get-buffer ()
  (interactive)
  (pop-to-buffer (find-file-noselect "~/Org/rss.org"))
  (org-feed-update-all)	
  (mark-whole-buffer)
  (perl-command "s/^ +-.*\n$//sg") ;; tweet のみ表示
  ;;(perl-command "s/^ +-.*http.*\n$//sg; s/^ +- [^[].*\n$//sg") ;; 時間も表示
  ;; 特殊タグの処理
  (perl-command "s/&amp;/&/g; s/&gt;/>/g; s/&lt;/</g; s/&nbsp;/ /g; s/&quot;/\x22/g")
  ;; 
  (charcode-to-char (point-min) (point-max))
  (goto-char (point-min))
  (while (re-search-forward ":FEED" nil t) (org-cycle))
  (goto-char (point-min))
  (basic-save-buffer))

perl-command は以前紹介しましたが、わりと便利なユーティリティーなので再掲しておきます。

以上で

M-x org-rss-get-buffer

とするとツイッターをrssで取ってきて別バッファ(~/Org/rss.org)に表示します。読み終わったらセーブしておしまい。

私の場合は読んだツイートはさっさと削除してしまいます。後でgoogle readerに落ちてくるので。