mewl_hayabusa

sukiya

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