mewl_hayabusa

すき家

Sep 2nd, 2018
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 6.07 KB | None | 0 0
  1. --
  2. -- Created by IntelliJ IDEA.
  3. -- User: hs-sh
  4. -- Date: 18/01/04
  5. -- Time: 13:57
  6. -- To change this template use File | Settings | File Templates.
  7. --
  8. debug = false
  9.  
  10. local http    = require ("socket.http")
  11. package.path = package.path..";./lib/xml2lua/?.lua"
  12. package.cpath = package.cpath .. ";./lib/lua-iconv-7/?.so;"
  13. require ("xml2lua")
  14.  
  15. urlencode = function(str)
  16.     if (str) then
  17.         str = string.gsub(str, "\n", "\r\n")
  18.         str = string.gsub(str, "([^%w ])",
  19.             function(c)
  20.                 return string.format("%%%02X",string.byte(c))
  21.             end)
  22.         str = string.gsub (str, " ", "+")
  23.         str = string.gsub (str, "%%2E",".")
  24.         str = string.gsub (str, "%%28","(")
  25.         str = string.gsub (str, "%%29",")")
  26.     end
  27.     return str
  28. end
  29.  
  30. getLocation = function(placename)
  31.     if placename == nil then
  32.         return nil
  33.     end
  34.  
  35.     -- Yahoo! Weather APIで地名をキーにして取得
  36.     local xml = http.request("https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text=\""..urlencode(placename)..'")')
  37.     local handler = require("xmlhandler.tree")
  38.     local parser = xml2lua.parser(handler)
  39.     xml = string.gsub(xml,"yweather:","yweather_") --テーブル名に:が入ってめんどくさい
  40.     xml = string.gsub(xml,"geo:","geo_") --テーブル名に:が入ってめんどくさい
  41.     parser:parse(xml)
  42.  
  43.     if handler.root.query.results.channel == nil then
  44.         return nil
  45.     end
  46.  
  47.     return handler.root.query.results.channel.item.geo_lat[1],handler.root.query.results.channel.item.geo_long[1], handler.root.query.results.channel.yweather_location._attr.country.." "..handler.root.query.results.channel.yweather_location._attr.region.." "..handler.root.query.results.channel.yweather_location._attr.city
  48. end
  49.  
  50. main = function(placename)
  51.     local lat, lng, location= getLocation(placename)
  52.  
  53.     if location == nil then
  54.         location = "❔"
  55.     end
  56.  
  57.     if lat == nil or lng == nil then
  58.         return {2, "それは・・・どこですか?"}
  59.     end
  60.  
  61.     if debug then
  62.         print("lat: " .. lat)
  63.         print("lng: " .. lng)
  64.  
  65.         print("Map: " .. "http://maps.sukiya.jp/p/zen004/nmap.htm"
  66.                 .."?lat=" .. lat
  67.                 .."&lon=" .. lng)
  68.     end
  69.  
  70.     local cgi_url = "http://maps.sukiya.jp/p/zen004/zdcemaphttp2.cgi?"
  71.     cgi_url = cgi_url .. "target=" ..  urlencode("http://127.0.0.1/p/zen004/nlist.htm?"
  72.             .."&lat="..lat
  73.             .."&lon="..lng
  74.             .."&latlon="..lat-0.098856209 .. ',' .. lng-0.159068627 .. ',' .. lat+0.9885621 .. ',' .. lng+0.159068628
  75.             .."&srchplace=" .. ',' .. lat .. ',' .. lng
  76.             .."&radius=0&jkn=(COL_02:1%20AND%20COL_04:2)"
  77.             .."&page=0&cond1=1&cond2=1&&his=nm"
  78.             .."&PARENT_HTTP_HOST=maps.sukiya.jp")
  79.     cgi_url = cgi_url .. "&zdccnt=5" .. "&enc=EUC" .. "&encodeflg=0"
  80.  
  81.     --print("cgi_url: "..cgi_url)
  82.  
  83.     local htm = http.request(cgi_url)
  84.  
  85.      -- CGIから帰ってくるのがEUC-JPなのでUTF-8に変換
  86.     local iconv = require("iconv")
  87.     cd = iconv.new("UTF-8", "EUC-JP")
  88.     htm = cd:iconv(htm)
  89.  
  90.     htm = string.gsub(htm, "^.*<div% id%=\"kyotenListDt\">\\n\\t\\t","")
  91.     htm = string.gsub(htm, "\\n\\t</div>\\n\\t<div% class%=\"custKyotenListHd\">\\n\\t\\t<table% class%=\"custKyotenListHeader\">.*$", '')
  92.  
  93.     -- 邪魔なものを消す
  94.     htm = string.gsub(htm, "\\n", ' ')
  95.     htm = string.gsub(htm, "\\t", '')
  96.     htm = string.gsub(htm, "&nbsp;", '')
  97.     htm = string.gsub(htm, "<br>",'')
  98.     htm = string.gsub(htm, "onMouse.-;\"", '')
  99.     htm = string.gsub(htm, "onClick.-;\"", '')
  100.     htm = string.gsub(htm, "<table% id%=\"kyotenListTable\">(.-)</table>", '<sukiya>%1</sukiya>')
  101.     htm = string.gsub(htm, "<img% src%=\"http%://maps.sukiya.jp/cgi/icon_select.cgi%?cid%=zen000&icon_id=50\" />", '') -- すき家のロゴ
  102.     htm = string.gsub(htm, "<tr>% <td>% <div% class%=\"kyotenListName\">(.-)</td>% </tr>", "<kyoten>%1</kyoten>") -- tr td divを1タグに
  103.     htm = string.gsub(htm, "\"% >", "\">")
  104.  
  105.     -- 住所の部分を整形
  106.     htm = string.gsub(htm, "<div% class%=\"kyotenListData\"> 〒(.-)</div>", '<address> 〒%1</address>')
  107.  
  108.     -- お店のタイプを整形
  109.     htm = string.gsub(htm, "<div% class%=\"kyotenListData\">(.-)</div>", "<list>%1</list>")
  110.     htm = string.gsub(htm, "<img% src%=\"http%://maps.sukiya.jp/cgi/sys_icon_select.cgi%?cid%=zen000&icon_id=[0-9]-\"% alt%=\"(.-)\"% title%=\".-\">", "<data>%1</data>")
  111.  
  112.     -- 店名とURLを整形
  113.     --htm = string.gsub(htm, "<a href=\"(.-(.))\" *>", '<url>%1</url>')
  114.     htm = string.gsub(htm, "<a href=\"(.-)?.-\" *> (.-)</a> *</div>", "<url> %1 </url> <name> %2 </name>")
  115.     --htm = string.gsub(htm, "<url> (.-)?.- </url>", "</url>")
  116.  
  117.     local r = -1
  118.     while r ~= 0 do  -- スペースが2つ重なっているところがなくなるまで繰り返し
  119.         htm,r = string.gsub(htm, "  ", ' ')
  120.     end
  121.  
  122.     --htm = string.gsub(htm, "<a href=\"(.-(.))\" *>", '<url>%1</url>')
  123.  
  124.     if debug then
  125.         print (htm)
  126.     end
  127.  
  128.     if select(2, string.gsub(htm, "最寄店舗がありませんでした", "")) == 0 then
  129.         local handler = require("xmlhandler.tree")
  130.         local parser = xml2lua.parser(handler)
  131.         parser:parse(htm)
  132.  
  133.         local ret = placename .. "(" ..location .. ") の最寄りのすき家は、"..handler.root.sukiya.kyoten[1].name.."で、".."以下のものを取り扱っています: "
  134.  
  135.         for l, w in pairs(handler.root.sukiya.kyoten[1].list.data) do
  136.             ret = ret .. w .. "、 "
  137.         end
  138.  
  139.         ret = ret .. "\n場所は、"..handler.root.sukiya.kyoten[1].address.."で、URLは "..handler.root.sukiya.kyoten[1].url.." です。"
  140.         return {0, ret}
  141.     else
  142.         local ret = "ごめんなさい・・・。 "..placename .. "(" .. location .. ") の最寄りのすき家は見つけられませんでした・・・。"
  143.         return {1, ret}
  144.     end
  145. end
  146.  
  147. local ret = main(io.read())
  148. print(ret[1].." "..ret[2])
Advertisement
Add Comment
Please, Sign In to add comment