Mechanizeã¨Nokogiriã§ããããWebã¹ã¯ã¬ã¤ãã³ã°
ç¥ãåãã®é ¼ã¿ã§ãæãªã¬ã³ã¸ã®SNSãµã¤ãã«èªåã§åçä»ãã³ã¡ã³ããæç¨¿ããã¹ã¯ãªãããæ¸ãã¦ãã¦ã¿ãã®ã§ããããªãã¤ã³ããªã©ãã¡ã¢ã£ã¦ãããã¨æãã
ãï¼ãªãã®è¨èªã§ãã£ããã£ã¦ï¼
ãããªã®Rubyã«æ±ºã¾ã£ã¨ãï½ï½ï½
使ç¨ããGem
jimweirich/rake · GitHub
mechanizeã¯ç°¡åãªWebãã©ã¦ã¸ã³ã°ãèªååã§ãããã¤ã§ãnokogiriã¯xmlãªã©ãç°¡åã«ãã¼ã¹ã§ããã馴æã¿ã¹ã¯ã¬ã¤ãã³ã°ãã¼ã«ã
ãã¨ã¯ã¡ãã£ã¨ããIDã¨ãã®ç®¡çãDB管çã«ãããã£ãã®ã§ActiveRecordã¨Rakeããã®ã¾ã¾ä½¿ã£ã¦sqlite3ã§ç®¡çããã
ä½ã£ããã®ã®ä»æ§
æSNSã«ãã°ã¤ã³
æç¨¿ããããã¼ã¸ã«é·ç§»
åçä»ãã§ã³ã¡ã³ããæç¨¿
ãããªãã¤ã³ã
ãªããªããã°ã¤ã³åºæ¥ãªã
pã¨ãã§åºåãã¦ããã¾ãé ¼ãã«ãªãæ
å ±ãåºã¦ãªãã¨æã£ã¦ããããåã«ãªãã¤ã¬ã¯ãããã¦ããã ãã ã£ãã
ããã©ã«ãã§ã¯meta refreshãªã©ã®ãªãã¤ã¬ã¯ãã«è¿½éããªãããã ã
ããã§Mechanizeã®åæåæã«ä»¥ä¸ã®æ§ãªè¨å®ãå
¥ãã
def initialize @mecha = Mechanize.new { |agent| agent.user_agent_alias = 'Mac Safari' agent.follow_meta_refresh = true agent.default_encoding = 'EUC-JP' agent.force_default_encoding = true } end
follow_meta_refreshãtrueã«ãã¦ããã
ä»ã®è¨å®ã¯å¿
è¦ãªã¨ãã«è¿½å ãã¦ãã£ãã
ã¨ã³ã³ã¼ãã£ã³ã°ãEUC-JPã§ã³ã£ããããã
ãã©ã¦ã¶ã§ã¯ã³ã¡ã³ããã©ã¼ã ãåºã¦ããã®ã«ã¹ã¯ãªããã§è¦ããã³ã¡ã³ããã©ã¼ã ããªãï¼ï¼ï¼
åã«ãã©ã¦ã¶ã§è¦ã¦ããã¦ã¼ã¶ã¼ã¨ã¹ã¯ã¬ã¤ãã³ã°ã«ä½¿ã£ã¦ããã¦ã¼ã¶ã¼ãéã£ãã ãã ã£ãï½
åçãæç¨¿ã§ããªã
ä»ã®ãµã¤ãã¯ã»ã¨ãã©ãjavascript使ã£ã¦ãããããã£ã¦ããã
ç¹ã«ãã¡ã¤ã«ã¢ãããã¼ããå¿
è¦ãªæã£ã¦ããã¡ã¤ã«ãè¤æ°ã¢ãããã¼ãã§ããããã«ããã©ã¼ã ã¯javascriptã使ã£ã¦åçã«
æ¿å
¥ãã¦ããå ´åãããã
ãã®å ´åmechanizeã§ãã¡ã¤ã«ã¢ãããã¼ããã£ã¼ã«ããåå¾ããã¨ãã¦ãç¡æå³ï¼ãã èããããã«ã¯ç©ºã£ã½ã®ãã£ã¼ã«ããããã®ã¿ï¼ï¼
ãã¦ï¼ããã§ãã ãããã®ãã¹ã¯ã¬ã¤ãã³ã°ãã¦éä¿¡ããã ãã§ã¯ãã¡ã ã¨åãã£ãã
ããã§Nokogiriããã®åºçªã
ããªã¼ã»ã¢ã³ãã¯ããããjavascriptã§ãããã¡ã¤ã«ç¨ã®ãã£ã¼ã«ããåºãªãããªããã©ããã¦èªåã§ä½ããªãã®ãããï¼ã
ã¨ããããã§ããã¡ã¤ã«ã¢ãããã¼ãã®ãã£ã¼ã«ããä½ãã
mechanize/form.rb at master · sparklemotion/mechanize · GitHub
ãããè¦ãã°ããããã©ãFormã¯ã©ã¹ã£ã¦
attr_reader :fields, :buttons, :file_uploads, :radiobuttons, :checkboxes
ã£ã¦ãªã£ã¦ã¦ããã¡ã¤ã«ã¢ãããã¼ãç¨ã®ãã£ã¼ã«ããããã®ã§ãè¦ç´ ãèªä½ãã¦ããã¤ã«çªã£è¾¼ãã§ããã°ããã
ã§ãã§ããã½ã¼ã¹ããããã¡ãã£ã¨æ±ãã®ã§èª°ãç¾ããæ¸ãæ¹æ³ãç¥ã£ã¦ãããæãã¦ä¸ãããã£ã¦ãããèªåã§ãªãã¡ã¯ã¿ãªã³ã°ããï½
doc = Nokogiri::XML::Document.parse '<input>' input_tag = Nokogiri::XML::Node.new 'input', doc input_tag['type'] = 'file' input_tag['name'] = 'photo1' input_tag['id'] = 'photo1' input_tag['value'] = file upload = Mechanize::Form::FileUpload.new input_tag, file form.file_uploads << upload
inputã¿ã°ã«ã¡ãã£ã¨ã¥ã¤è¦ç´ ãå
¥ãã¦ããã®ãã©ãã«ããããããã®ã¸ãã¯ã¾ã çè§£ã§ãã¦ãªããªãã
ã¡ãªã¿ã«fileã£ã¦ããã¨ããã¯ãã¡ã¤ã«ãã¹ãimgãã£ã¬ã¯ããªã®ä¸ã®hoge.jpegã ã¨ããã¨'./img/hoge.jpeg'çãªã
ã¡ãªã¿ã«ããã®ããã«ãã¡ã¤ã«åã ãæå®ããå½¢å¼ã ã¨ã.jpegã¿ããã«ç¹å®ã®æ¡å¼µååã§ãªãã¨ã¢ããã§ããªãã£ã½ã(ããã®ã½ã¼ã¹ã¯èªãã§ããªã)ã
このへんã«æ¸ãã¦ãã£ããã©ãmime_typeãæå®ããã°ããã£ã½ã(試ãã¦ãªã)ã
ææ³
ã¡ãªã¿ã«ä¸çªããã£ãã®ã¯ã³ã¡ã³ããã©ã¼ã ãåºãªããã¤ã§ãï½ï½ï½ ã¢ãã¹ï½ï½ï½
ããã¾é¢ä¿ãªããã©ãä»ã¾ã§Railsã§ããActiveRecordã¨ãRakeã¨ã使ã£ããã¨ãªãã£ããã©ãä»åã¹ã¯ãªããã§åä½ã§ä½¿ã£ã¦ã¿ã¦ãããçµæ§çè§£ãæ·±ã¾ã£ãæããããyamlã¨ããè¨å®ãã¡ã¤ã«ã¨ããã®ãçµæ§æ¥½ã ã£ãããä»ã¾ã§ã®Rubyã®ã³ã¼ãã®ä¸ã ã¨å²ã¨ããæ¸ããããªã
ãã ãããã¡ãã£ã¨ã¡ããã¨è¨è¨ãã¦æ¸ãã¨ç¶ºéºã«ãªããããªã®ã¨ãã¯ã©ã¹è¨è¨ã¨ãããã¡ãã£ã¨ãã¦ããããã®ã§ãã¡ã¿ããæ¬ã¨ããã¼ãã§ã¯ããªãã¤ã¨ãã¡ããã¨èªã¿ãããªã
TODO
wheneverå ¥ãã¦cron管ç
åè
turks/mixi at master · takasing/turks · GitHub
(ã¹ãã æç¨¿ã¨ããã¦ããããã§ã¯ãªãã®ã§è¨±ãã¦ãã ããï½)