emacs - ifree's Blog - it's my way

emacs 小黄鸡插件

周末耍了下simsim,发现这只小鸡的对话能力简直超强啊,心想写代码些无聊了有只小鸡陪聊还是不错的,于是这个插件就诞生了,平时主要用emacs,所以就只写了emacs版.

惯例,上图上代码:

 

;simsim robot


(defun http-url-encode (str content-type)
  "URL encode STR using CONTENT-TYPE as the coding system."
  (apply 'concat
	 (mapcar (lambda (c)
		   (if (or (and (>= c ?a) (<= c ?z))
			   (and (>= c ?A) (<= c ?Z))
			   (and (>= c ?0) (<= c ?9)))
		       (string c)
		     (format "%%%02x" c)))
		 (encode-coding-string str content-type))))

(defun ask-simsim (content &optional lc)
  (let ((dest (concat "http://www.simsimi.com/func/req?lc=" (or lc "zh") "&msg=" 
		      (http-url-encode content 'utf-8)
		      ))
	)
    (get-url-content dest)
    )
)

(defun get-url-content (url)
  "simplily get content from url"
  (let (ret )
    (with-current-buffer
      (url-retrieve-synchronously  url) 
;      (setq status url-http-response-status)
      (goto-char (point-min))
      (if  (search-forward-regexp "{" nil t)
	  (setq ret (decode-coding-string (substring (car (split-string (buffer-substring (point) (point-max)) "," )) 12 -1) 'utf-8)
		)
	(message "invalid request")
	)
      )
    ret
    )
 )

(defun sim-eof ()
  (=
   (count-lines (point-min) (point-max))
   (count-lines (point-min) (point))
   )
)

(defun talk-to-sim (&optional arg)
       (interactive)	
       ;(save-excursion
	 (if (sim-eof)
	     (if (re-search-backward "me:\\(.+\\)" nil t)
		 ((lambda (msg)
		    "insert msg to content"
		    (goto-char (point-max))
		    (insert (concat "\n\n" "simsim:" msg "\n\n"  ))
		    (insert "me:")
		    )
		  (ask-simsim (match-string-no-properties 1))
		  )
	       )
	   (message "unknow error")
	   )
	; )
)

(defun simsim-start ()
  (let ((buffer-name "simsim"))
    (if (get-buffer buffer-name)
	(pop-to-buffer buffer-name)
      (pop-to-buffer (get-buffer-create buffer-name))
      (insert "simsim:主人好! \n\n")
      (insert "me:")
      )
     )
)

(defvar simsim-mode-hook nil "hook for simsim")
(defvar simsim-mod-map nil "key map")
(if simsim-mod-map
    ()
  (setq simsim-mod-map (make-sparse-keymap))
  (define-key simsim-mod-map  [return] 'talk-to-sim)
)


(defun simsim ()
  "simsim bot mod.... just for fun"
  (interactive)
  (simsim-start);//switch to simsim buffer
  (kill-all-local-variables)
  (use-local-map simsim-mod-map)
;  (setq major-mode 'simsim-mod
;  	mode-name  "simsim"
;	)

)

(provide 'simsim)

### 补

Orz,官方竟然发现了....下面是解决办法,referr和ua换了 ps,emacs的ua还

 

(defun get-url-content (url)
  "simplily get content from url"
  (let ((ret nil)
;	(url-proxy-services '(("http" . "localhost:8888")))
	(url-request-extra-headers 
	  '(("Content-Type" . "application/json; charset=utf-8")
	    ("X-Requested-With" . "XMLHttpRequest")
	    ("User-Agent" . " Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.75 Safari/537.1")
	    ("Referer" . "http://www.simsimi.com/talk.htm")
	    )
	))
    (with-current-buffer
      (url-retrieve-synchronously  url) 
;      (setq status url-http-response-status)
      (goto-char (point-min))
      (if  (search-forward-regexp "{" nil t)
	  (setq ret (decode-coding-string (substring (car (split-string (buffer-substring (point) (point-max)) "," )) 12 -1) 'utf-8)
		)
;	  (message (buffer-substring (point-min) (point-max)))
	(message "invalid request")
	)
      )
    ret
    )
 )

###补

官方采用了api形式对请求做了限制,请访问http://developer.simsimi.com/获取授权