Initial commit, with real-time condition.

Signed-off-by: imi415 <imi415.public@gmail.com>
This commit is contained in:
imi415 2021-05-05 20:20:31 +08:00
commit 02c21e303e
Signed by: imi415
GPG Key ID: 17F01E106F9F5E0A
16 changed files with 172 additions and 0 deletions

7
Gemfile Normal file
View File

@ -0,0 +1,7 @@
source 'https://rubygems.org'
gemspec
gem "faraday", "~> 1.4"
gem "faraday_middleware", "~> 1.0"

33
Gemfile.lock Normal file
View File

@ -0,0 +1,33 @@
PATH
remote: .
specs:
moji_weather (0.0.1)
faraday (~> 1.4)
GEM
remote: https://rubygems.org/
specs:
faraday (1.4.1)
faraday-excon (~> 1.1)
faraday-net_http (~> 1.0)
faraday-net_http_persistent (~> 1.1)
multipart-post (>= 1.2, < 3)
ruby2_keywords (>= 0.0.4)
faraday-excon (1.1.0)
faraday-net_http (1.0.1)
faraday-net_http_persistent (1.1.0)
faraday_middleware (1.0.0)
faraday (~> 1.0)
multipart-post (2.1.1)
ruby2_keywords (0.0.4)
PLATFORMS
x86_64-linux
DEPENDENCIES
faraday (~> 1.4)
faraday_middleware
moji_weather!
BUNDLED WITH
2.2.16

11
README.md Normal file
View File

@ -0,0 +1,11 @@
# Moji Weather API (for Aliyun Cloud Market)
## Usage:
### Condition:
```ruby
condition = MojiWeather::Api::Condition.new app_code: "YOUR_APP_CODE"
pp condition.query location: {lat: 39.95, lon: 116.36}
pp condition.query city_id: 2
```

11
lib/moji_weather.rb Normal file
View File

@ -0,0 +1,11 @@
require 'json'
require 'uri'
require 'faraday'
require 'faraday_middleware'
require 'moji_weather/api'
require 'moji_weather/error'
module MojiWeather
end

13
lib/moji_weather/api.rb Normal file
View File

@ -0,0 +1,13 @@
require 'moji_weather/api/alert'
require 'moji_weather/api/condition'
require 'moji_weather/api/aqi_forecast_5days'
require 'moji_weather/api/aqi'
require 'moji_weather/api/forecast_15days'
require 'moji_weather/api/forecast_24hrs'
require 'moji_weather/api/limit'
require 'moji_weather/api/live_index'
module MojiWeather
module Api
end
end

View File

View File

View File

@ -0,0 +1,19 @@
require 'moji_weather/api/rest_client'
module MojiWeather
module Api
class Condition < MojiWeather::Api::RestClient
def query(options = {})
if !options[:city_id].nil? then
response = cityid_request('condition', city_id: options[:city_id], token: '50b53ff8dd7d9fa320d3d3ca32cf8ed1')
elsif !options[:location].nil? then
response = location_request('condition', location: options[:location], token: 'ff826c205f8f4a59701e64e9e64e01c4')
else
raise MojiWeather::ClientError.new("Invalid request: either city_id or location needs to be set.")
end
response
end
end
end
end

View File

View File

View File

View File

View File

@ -0,0 +1,58 @@
module MojiWeather
module Api
class RestClient
def initialize(options = {})
if options[:app_code].nil?
raise MojiWeather::ClientError.new("AppCode not provided.")
end
@app_code = options[:app_code]
@cityid_base = "http://aliv18.data.moji.com/whapi/json/alicityweather"
@location_base = "http://aliv8.data.moji.com/whapi/json/aliweather"
end
private
def cityid_request(api_uri, options = {})
conn = Faraday.new do |f|
f.request :url_encoded
f.response :json
f.response :raise_error
end
begin
response = conn.post("#{@cityid_base}/#{api_uri}") do |req|
req.body = {"cityId" => options[:city_id], "token" => options[:token]}
req.headers["Authorization"] = "APPCODE #{@app_code}"
end
rescue Faraday::ClientError => e
raise MojiWeather::ClientError.new("API client error, code: #{response.status}, msg: #{response.body}")
rescue Faraday::ServerError => e
raise MojiWeather::ServerError.new("API server error, code: #{response.status}, msg: #{response.body}")
end
response.body
end
def location_request(api_uri, options = {})
conn = Faraday.new do |f|
f.request :url_encoded
f.response :json
f.response :raise_error
end
begin
response = conn.post("#{@location_base}/#{api_uri}") do |req|
req.body = {"lat" => options[:location][:lat], "lon" => options[:location][:lon], "token" => options[:token]}
req.headers["Authorization"] = "APPCODE #{@app_code}"
end
rescue Faraday::ClientError => e
raise MojiWeather::ClientError.new("API client error, code: #{response.status}, msg: #{response.body}")
rescue Faraday::ServerError => e
raise MojiWeather::ServerError.new("API server error, code: #{response.status}, msg: #{response.body}")
end
response.body
end
end
end
end

View File

@ -0,0 +1,7 @@
module MojiWeather
# Exception bash class.
class Error < StandardError; end
class ClientError < Error; end
class ServerError < Error; end
end

13
moji_weather.gemspec Normal file
View File

@ -0,0 +1,13 @@
Gem::Specification.new do |s|
s.name = 'moji_weather'
s.version = '0.0.1'
s.summary = "Moji Weather"
s.description = "Moji Weather API provided by Aliyun"
s.authors = ["imi415"]
s.email = "imi415.public@gmail.com"
s.files = ["lib/moji_weather.rb"]
s.license = "MIT"
s.add_dependency "faraday", "~> 1.4"
s.add_dependency "faraday_middleware", "~> 1.0"
end