Archive

emacs-w3m上で短縮URLを取得する – その1

Twitterを使用するようになってからTinyURLとかbit.ly使用する機会が増えたのでemacs上のw3mから簡単に短縮URLを取得できるように関数を作成しました。Twitter自体自動的にURLを短縮する機能を持っているようですけど。

この投稿については内容が更新されています。「emacs-w3m上で短縮URLを取得する – その2」の方を利用してください。

以下の関数を.emacsとかに書き込みます。

;; URLを短縮してkill-ringの中に入れる関数(TinyURLを使用バージョン ... API使用)
(defun shorten-url-tinyurl(url)
  (let ((shorten-uri "http://tinyurl.com/api-create.php")
        (url-request-method "POST")
        (url-request-extra-headers
             '(("Content-Type" . "application/x-www-form-urlencoded")))
        (url-request-data (concat "url=" (url-hexify-string url))))
    (url-retrieve shorten-uri
                  '(lambda (status cbargs)
                     (point-min)
                     (if (re-search-forward  "\\(http://tinyurl.com/.+\\)" nil t)
                         (progn
                           (setq result-url (match-string-no-properties 1))
                           (kill-new result-url nil)
                           (message "Copy '%s' to ring, shorten %s" result-url cbargs)))
                     (kill-buffer (current-buffer)))
                  (list url))))

;; URLを短縮してkill-ringの中に入れる関数(bit.lyを使用バージョン ... API不使用)
(defun shorten-url-bitly (url)
  (let ((shorten-uri "http://bit.ly")
        (shorten-uri-get-regexp "id *= *\"shortened-url\" +value *= *\"\\(http://bit.ly/.+\\)\" +/>")
        (url-request-method "POST")
        (url-request-extra-headers
             '(("Content-Type" . "application/x-www-form-urlencoded")))
        (url-request-data (concat "url=" (url-hexify-string url))))
    (url-retrieve shorten-uri
                  '(lambda (status cbargs)
                     (point-min)
                     (if (re-search-forward (car (cdr cbargs)) nil t)
                         (progn
                           (setq result-url (match-string-no-properties 1))
                           (kill-new result-url nil)
                           (message "Copy '%s' to ring, shorten %s" result-url (car cbargs))))
                     (kill-buffer (current-buffer)))
                  (list (list url shorten-uri-get-regexp)))))



;; 上をw3m上から使用するための関数
(defun my-w3m-shorten-url ()
  (interactive)
  (shorten-url-tinyurl ;; もしくは shorten-url-bitly
   (or (w3m-url-valid (w3m-anchor))
       (w3m-url-valid w3m-current-url))))

キーバインドとかは必要だったら適当にしてください。

(eval-after-load "w3m"
  '(progn
     ;; w3m-mode-map key binds
     (define-key w3m-mode-map "\C-cs" 'my-w3m-shorten-url)))

ちなみにTinyURLbit.lyバージョンを用意しています。好きな方を選択してください。ただしbit.lyバージョンはAPIではなく通常のWebページから取得しているためWebページの改装等で使用できなくなる可能性があります。