ç§ã¯Rubyããã£ãšè¯ãåŠã³ããã£ãã®ã§ãããå®éã®ãã©ããã¯ãããŸããã§ããã ãããŠãYandex Direct APIã§åäœããgemãäœæããããšããŸããã
ããã€ãã®çç±ããããŸããã ãã®äžã§ããYandex Direct APIã¯ãYandexããã³ææ°ã®RESTãµãŒãã¹å
šè¬ã§éåžžã«äžè¬çã§ãã å
žåçãªééããçè§£ããŠå
æããã°ãä»ã®Yandex APIã®ã¢ããã°ãç°¡åãã€è¿
éã«æžãããšãã§ããŸãïŒããã ãã§ã¯ãããŸããïŒã ããã§ããªããç§ãèŠã€ãããã¹ãŠã®ã¢ããã°ã¯ãDirectã®ããŒãžã§ã³ã®ãµããŒãã«åé¡ããããŸããïŒããã€ãã¯4ã®äžã§ã·ã£ãŒãã«ãããä»ã¯æ°ãã5ã®äžã§ã·ã£ãŒãã«ããããŠãããã¯ã©ãã§ããµããŒãããŠããŸããã§ããã
gemã®äž»ãªã¢ã€ãã¢ã¯ãRubyãPythonã®ãããªèšèªã§ã¯æ°ããã¡ãœãããšJSONã®ãããªãªããžã§ã¯ãããã®å Žã§äœæã§ãããããRESTãµãŒãã¹ã«ã¢ã¯ã»ã¹ããããã®ã€ã³ã¿ãŒãã§ãŒã¹ã¡ãœããã¯RestãµãŒãã¹èªäœã®æ©èœãç¹°ãè¿ãããšãã§ãããšããããšã§ãã æ¬¡ã®ããã«æžãããšãã§ããŸãïŒ
request = { "SelectionCriteria" => { "Types" => ["TEXT_CAMPAIGN"] }, "FieldNames" => ["Id", "Name"], "TextCampaignFieldNames" => ["BiddingStrategy"] } options = { token: Token } @direct = Ya::API::Direct::Client.new(options) json = direct.campaigns.get(request)
ãããŠããã«ããæžã代ããã«ãæå®ãããAPIã䜿çšããŠãŠãŒã¶ãŒãããã¥ã¢ã«ã«éããŸãã
ããšãã°ã次ã®ãããªå€ãããŒãžã§ã³ã®ã¡ãœãããåŒã³åºããŸãã
json = direct.v4.GetCampaignsList
èªãããšã«èå³ã¯ãªããã詊ããŠã¿ããå Žåã¯ããããã宿ããå®ç³ãå
¥æã§ããŸãïŒ
twitterã®äŸãããã¬ãŒã«ãã omnââiauth-tokenãååŸããæ¹æ³ãåŠã¶ããšãã§ããŸãã ãŸããã¡ãœããã®ååãšç»é²æé ã¯ãYandexã®ããã¥ã¡ã³ãã§éåžžã«è©³ãã説æãããŠããŸã ã
詳现ãè峿·±ãå Žå-ããã«è©³çްã§ãã
éçºãéå§
ãã¡ããããã®èšäºã§ã¯æãåºæ¬çãªçµéšãšæãç°¡åãªããšã«ã€ããŠèª¬æããŠããŸãã ããããããã¯å
žåçãªå®ç³ãäœæããããã®ãªãã€ã³ããŒãšããŠãåå¿è
ïŒç§ã®ãããªïŒã«åœ¹ç«ã¡ãŸãã ãã¡ãããèšäºã«é¢ããæ
å ±ãåéããããšã¯è峿·±ãã§ãããé·ãéã§ãã
æåŸã«ãèªè
ã®äžã«ã¯ãYandex Direct APIãµããŒãããããžã§ã¯ãã«ãã°ãã远å ããå¿
èŠãããå ŽåããããŸãã
ãŸãããã£ãŒãããã¯ã®èгç¹ãããç§ã«ãšã£ãŠã圹ç«ã€ã§ãããã
ãã¹ãã¹ã¯ãªãã
ãŸããYandex Directã«ç»é²ããããã§ãã¹ãã¢ããªã±ãŒã·ã§ã³ãäœæãããã®ããã®äžæããŒã¯ã³ãååŸããŸãã
次ã«ã Yandex Direct APIãã«ããéããã¡ãœãããåŒã³åºãæ¹æ³ãåŠã³ãŸãã ãã®ãããªãã®ïŒ
ããŒãžã§ã³5ã®å ŽåïŒ
require "net/http" require "openssl" require "json" Token = "TOKEN"
ããŒãžã§ã³4 Liveã®å ŽåïŒããŒã¯ã³ã¯äž¡æ¹ã«é©ããŠããŸãïŒïŒ
require "net/http" require "openssl" require "json" Token = "TOKEN"
ãããã®ã¹ã¯ãªããã¯ããããã°ããã³ã¯ã€ãã¯ãã¹ãã¯ãšãªã«æ¢ã«é©ããŠããŸãã
ããããïŒç¥è©±äžã®ïŒãã³ã»ãã³ã¹ãæããŠããããã«ãããèªäœã®ã¹ã¯ãªãããšä»ã®äººã®ã©ã€ãã©ãªã¯ã2ã€ã®ç°ãªãã¯ã©ã¹ã®ã¢ããªã±ãŒã·ã§ã³ã§ãã ãããŠã1ã€ãå¥ã®ãã®ã«æž¡ãã«ã¯ãæ±ããããªããã°ãªããŸããã
å®ç³ãäœæãã
ãããããååãæ±ºå®ããå¿
èŠããããŸãã-ã·ã³ãã«ã§å¿ãããããŸããã ãããŠã ya-api-directãå¿
èŠãªãã®ã§ãããšããçµè«ã«éããŸããã
ãŸããæ§é èªäœãè«ççã§ããããšãã°ãya-api-weatherã衚瀺ãããå ŽåããããäœãæããŠããããæç¢ºã«ãªããŸãã 第äºã«ãåæšããã¬ãã£ãã¯ã¹ãšããŠäœ¿çšããYandexã®å
¬åŒè£œåããŸã ãããŸããã ããã«ãããã¯ya.ruã®ãã³ãã§ããã以åã®ç°¡æœãªãã¶ã€ã³ãæ³šææ·±ãä¿åãããŠããŸãã
ãã¹ãŠã®ãã©ã«ããŒãæã§äœæããã®ã¯å°ãé¢åã§ãã ãã³ãã©ãŒã«ããããããŠãã ããïŒ
bundle gem ya-api-direct
UnitTestã®ããŒã«ãšããŠããããã¹ãã瀺ããŸããã æ¬¡ã«ãçç±ãæããã«ãªããŸãã
ããã§ãã©ã«ããŒãäœæããããã®äžã«ã¢ã»ã³ããªgemã®æºåãæŽããŸããã å¯äžã®æ¬ ç¹ã¯ãå®å
šã«ç©ºã§ããããšã§ãã
ããããä»ãããä¿®æ£ããŸãã
ãã¹ããæžã
UnitTestã¯ãunningãªé ãããã°ãæ€åºããã®ã«éåžžã«åœ¹ç«ã¡ãŸãã ããã«ããããããããœãŒã¹ã³ãŒãã«é ããŠããæ¹æ³ã«æ²¿ã£ãŠããããæžããæ°ååã®ãã°ãä¿®æ£ããããšãã§ããã»ãšãã©ãã¹ãŠã®ããã°ã©ããŒã¯ã圌ãåžžã«ããããæžãããšãçŽæããŸãã ãããã圌ã¯ãŸã æžããŸããã
äžéšã®ãããžã§ã¯ãïŒç¹ã«æ ãè
ã®ããã°ã©ããŒã«ãã£ãŠæžããããã®ïŒã¯ããã¹ããšä»æ§ãã¹ãã®äž¡æ¹ãåæã«è¡ããŸãã ããããminitestã®ææ°ããŒãžã§ã³ã§ã¯ãçªç¶ä»æ§ã€ã³ã¿ãŒãã§ã€ã¹ãåŠç¿ãã仿§ã ãã§å¯ŸåŠããããšã«ããŸããã
ãªã³ã©ã€ã³ã€ã³ã¿ãŒãã§ãŒã¹ããããããã«ããªã¯ãšã¹ãããšã«ãã€ã³ããå·®ãåŒãããã®ã§ãYandex Direct APIããã®åçãåœé ããŸãã ãããè¡ãã«ã¯ãããªãããŒãªgem webmockãå¿
èŠã§ã ã
å®ç³ã«è¿œå
group :test do gem 'rspec', '>= 2.14' gem 'rubocop', '>= 0.37' gem 'webmock' end
æŽæ°ãããã¹ããã©ã«ããŒã®ååãspecã«å€æŽããŸãã æ¥ãã§ããã®ã§ãå€éšã€ã³ã¿ãŒãã§ã€ã¹ã®ã¿ã®ãã¹ããæžããŸããã
require 'ya/api/direct' require 'minitest/autorun' require 'webmock/minitest' describe Ya::API::Direct::Client do Token = "TOKEN"
webmockã¯ãHTTPãæäœããããã®æšæºã©ã€ãã©ãªã®ã¡ãœããã眮ãæããŸããããã«ãããç¹å®ã®ããã£ãšããããŒãæã€ãªã¯ãšã¹ããè¿ããããšãã«ã察å¿ããã¬ã¹ãã³ã¹ãè¿ãããŸãã
èšå®ãééãããšããŠãã倧ããããšã§ã¯ãããŸããã ãã£ã«ã¿ãŒã«ãªããªã¯ãšã¹ããéä¿¡ããããšãããšãwebmockã¯ãšã©ãŒãå ±åããã¹ã¿ããæ£ããæžãæ¹æ³ãæããŠãããŸãã
ãããŠã仿§ãæžããŸãïŒ
describe "when does a request" do it "works well with version 4" do assert @clientV4.v4.GetCampaignsList == @campaigns_get_body end it "works well with version 5" do assert @clientV5.campaigns.get == @campaigns_get_body end end
ããã
Rakeã¯éåžžã«æè»ãã€ç°¡åã«å®è£
ãããŠãããããã»ãŒãã¹ãŠã®ã©ã€ãã©ãªã«ç¬èªã®æ¹æ³ããããŸãã ã ããç§ã¯åœŒã«spec _ *ãRbãšåŒã°ãããã¹ãŠã®ãã¡ã€ã«ãå®è¡ããããã«åœŒã«èšã£ããããã¯specãã£ã¬ã¯ããªã«ããïŒ
require "bundler/gem_tasks" require "rake/testtask" task :spec do Dir.glob('./spec/**/spec_*.rb').each { |file| require file} end task test: [:spec] task default: [:spec]
ããã§ã仿§ã次ã®ããã«åŒã³åºãããšãã§ããŸãã
rake test
ãŸãã¯ïŒ
rake
確ãã«ã圌ã¯ãŸã ãã¹ããããã®ããããŸããã
å®ç³ãæžã
ãŸããgemã«é¢ããæ
å ±ãå
¥åããŸãïŒãã®ãã³ãã«ããªããšãèµ·åãæåŠãããŸãïŒã 次ã«ã䜿çšãããµãŒãããŒãã£ã©ã€ãã©ãªãgemspecã«æžã蟌ã¿ãŸãã
gem 'jruby-openssl', platforms: :jruby gem 'rake' gem 'yard' group :test do gem 'rspec', '>= 2.14' gem 'rubocop', '>= 0.37' gem 'webmock' gem 'yardstick' end
ãã
bundle install
libã«ç§»åããŠãã¡ã€ã«ãäœæããŸãã
çšæãããã¡ã€ã«ã¯æ¬¡ã®ãšããã§ãã
- client.rb-ããã³ããšã³ã
- direct_service_base.rb -APIã䜿çšããããã®åºæ¬ãµãŒãã¹
- direct_service_v4.rb -API 4ããã³4 Liveã䜿çšããããã®ãµãŒãã¹
- direct_service_v5.rb -API 5ã䜿çšããããã®ãµãŒãã¹
- gateway.rb-ãããã¯ãŒã¯èŠæ±ã®è»¢éãšåŠç=
- url_helper.rb - gateway.rbã«å Žæããªããã¹ãŠã®çš®é¡ã®éç颿°
- constants.rb-å©çšå¯èœãªYandex DIrect APIã¡ãœããã®ãªã¹ã
- exception.rb -APIãšã©ãŒã衚瀺ããäŸå€
- version.rb-ããŒãžã§ã³èšå®ä»ãã®ãµãŒãã¹ãã¡ã€ã«
ç°ãªãããŒãžã§ã³ã®ã³ã³ãããŒã©ãŒ
æåã«ã宿°ãå«ããã¡ã€ã«ãäœæããŸãããã®ãã¡ã€ã«ã«ãAPIã®ãã¹ãŠã®é¢æ°ãæžã蟌ã¿ãŸãã
contants.rb
module Ya module API module Direct API_V5 = { "Campaigns" => [ "add", "update", "delete", "suspend", "resume", "archive", "unarchive", "get" ],
次ã«ãããŒãžã§ã³4ããã³5ã®ãµãŒãã¹ãç¶æ¿ããåºæ¬çãªãµãŒãã¹ã©ãããŒãäœæããŸãã
direct_service_base.rb
module Ya::API::Direct class DirectServiceBase attr_reader :method_items, :version def initialize(client, methods_data) @client = client @method_items = methods_data init_methods end protected def init_methods @method_items.each do |method| self.class.send :define_method, method do |params = {}| result = exec_request(method, params || {}) callback_by_result result result[:data] end end end def exec_request(method, request_body) client.gateway.request method, request_body, @version end def callback_by_result(result={}) end end end
ã³ã³ã¹ãã©ã¯ã¿ãŒã§ã圌ã¯ãœãŒã¹ã¯ã©ã€ã¢ã³ããšã¡ãœããã®ãªã¹ããååŸããŸãã ãããŠãdefine_methodãä»ããŠãããããäœæããŸãã
respond_to_missingã¡ãœããã§ããŸããããªãã®ã¯ãªãã§ããïŒ ïŒå€ãã®å®ç³ããŸã ããã§ããããã«ïŒïŒ é
ãã®ã§ããŸã䟿å©ã§ã¯ãªãããã§ãã ãããŠããããªãã§ã¯ãé
ãã€ã³ã¿ãŒããªã¿ãŒãäŸå€ã®åŸã«ããã«å
¥ããis_respond_to_missingïŒ..ããã§ãã¯ã€ã³ããŸããããã«ããã®æ¹æ³ã§äœæãããã¡ãœããã¯ã¡ãœããåŒã³åºãã®çµæã«åé¡ããããããã°ã«äŸ¿å©ã§ãã
次ã«ãããŒãžã§ã³4ããã³4 Liveã®ãµãŒãã¹ãäœæããŸãã
direct_service_v4.rb
require "ya/api/direct/constants" require "ya/api/direct/direct_service_base" module Ya::API::Direct class DirectServiceV4 < DirectServiceBase def initialize(client, methods_data, version = :v4) super(client, methods_data) @version = version end def exec_request(method, request_body = {}) @client.gateway.request method, request_body, nil, (API_V4_LIVE.include?(method) ? :v4live : @version) end end end
ããŒãžã§ã³5ã§ã¯ããµãŒããŒã¯ãŠãŒã¶ãŒãªã¯ãšã¹ãã«å¿çããã ãã§ãªããæåŸã®ãªã¯ãšã¹ãã«è²»ãããããã€ã³ãæ°ãæ®ã£ãŠãããã€ã³ãæ°ãçŸåšã®ã»ãã·ã§ã³ã«ãã£ããã€ã³ãæ°ãå ±åããŸãã ç§ãã¡ã®ãµãŒãã¹ã¯ããããåè§£ã§ããã¯ãã§ãïŒãããããããã©ã®ããã«è¡ããã«ã€ããŠã¯ãŸã æžããŠããŸããïŒã ãã ããã¡ã€ã³ã¯ã©ã€ã¢ã³ãã¯ã©ã¹ã®ãã£ãŒã«ããæŽæ°ããå¿
èŠãããããšãäºåã«ç€ºããŸãã
direct_service_v5.rb
require "ya/api/direct/direct_service_base" module Ya::API::Direct class DirectServiceV5 < DirectServiceBase attr_reader :service, :service_url def initialize(client, service, methods_data) super(client, methods_data) @service = service @service_url = service.downcase @version = :v5 end def exec_request(method, request_body={}) @client.gateway.request method, request_body, @service_url, @version end def callback_by_result(result={}) if result.has_key? :units_data @client.update_units_data result[:units_data] end end end end
ãšããã§ãè¬ãããã²ãŒããŠã§ã€ããªã¯ãšã¹ãã®åŒã³åºãã«é¢äžããŠããããšã«æ°ã¥ããŸãããïŒ
ã²ãŒããŠã§ã€ãšUrlHelper
Gatewayã¯ã©ã¹ã¯ãªã¯ãšã¹ããæäŸããŸãã ã¹ã¯ãªããã®ã»ãšãã©ã®ã³ãŒãã¯ããã«ç§»åããŸããã
gateway.rb
require "net/http" require "openssl" require "json" require "ya/api/direct/constants" require "ya/api/direct/url_helper" module Ya::API::Direct class Gateway
æšæºã®Net :: HTTPã¯ãçæã®ããã«åçŽã§ãããããé¢ä¿ããŠããŸãã ãã¡ã©ããŒããã¯ãšãªãéä¿¡ããããšãã§ããŸãã OmniAuthã¯æ¢ã«åäœããŸãïŒããã«ã€ããŠã¯ä»¥äžã§èª¬æããŸãïŒã®ã§ãã¢ããªã±ãŒã·ã§ã³ãgemã§ãªãŒããŒããŒããããããšã¯ãããŸããã
æåŸã«ãURLãçæããããŒã¿ãè§£æãããŠããããè§£æããéç颿°ãUrlHelperã«å
¥åããŸãïŒç°¡åã§ãïŒã
require "json" require "ya/api/direct/exception" module Ya::API::Direct RegExUnits = Regexp.new /(\d+)\/(\d+)\/(\d+)/ class UrlHelper def self.direct_api_url(mode = :sandbox, version = :v5, service = "") format = :json protocol = "https" api_prefixes = { sandbox: "api-sandbox", production: "api" } api_prefix = api_prefixes[mode || :sandbox] site = "%{api}.direct.yandex.ru" % {api: api_prefix} api_urls = { v4: { json: '%{protocol}://%{site}/v4/json', soap: '%{protocol}://%{site}/v4/soap', wsdl: '%{protocol}://%{site}/v4/wsdl', }, v4live: { json: '%{protocol}://%{site}/live/v4/json', soap: '%{protocol}://%{site}/live/v4/soap', wsdl: '%{protocol}://%{site}/live/v4/wsdl', }, v5: { json: '%{protocol}://%{site}/json/v5/%{service}', soap: '%{protocol}://%{site}/v5/%{service}', wsdl: '%{protocol}://%{site}/v5/%{service}?wsdl', } } api_urls[version][format] % { protocol: protocol, site: site, service: service } end def self.extract_response_units(response_header) matched = RegExUnits.match response_header["Units"] matched.nil? ? {} : { just_used: matched[1].to_i, units_left: matched[2].to_i, units_limit: matched[3].to_i } end private def self.parse_data(response, ver) response_body = JSON.parse(response.body) validate_response! response_body result = { data: response_body } if [:v5].include? ver result.merge!({ units_data: self.extract_response_units(response) }) end result end def self.validate_response!(response_body) if response_body.has_key? 'error' response_error = response_body['error'] raise Exception.new(response_error['error_detail'], response_error['error_string'], response_error['error_code']) end end end end
ãµãŒããŒããšã©ãŒãè¿ããå Žåããã®ããã¹ããšãšãã«äŸå€ãã¹ããŒããŸãã
ã³ãŒãã¯èªæã®ããã§ãããã¯ããªãè¯ãããšã§ãã èªæã®ã³ãŒãã¯ä¿å®ãç°¡åã§ãã
ã¯ã©ã€ã¢ã³ã
次ã«ãå€éšã€ã³ã¿ãŒãã§ã€ã¹ãšããåãããã¯ã©ã€ã¢ã³ãã¯ã©ã¹èªäœãèšè¿°ããå¿
èŠããããŸãã ã»ãšãã©ã®æ©èœã¯æ¢ã«å
éšã¯ã©ã¹ã«ç§»åããŠãããããéåžžã«çããªããŸãã
require "ya/api/direct/constants" require "ya/api/direct/gateway" require "ya/api/direct/direct_service_v4" require "ya/api/direct/direct_service_v5" require "ya/api/direct/exception" require 'time' module Ya::API::Direct AllowedAPIVersions = [:v5, :v4] class Client attr_reader :cache_timestamp, :units_data, :gateway, :v4, :v5 def initialize(config = {}) @config = { token: nil, app_id: nil, login: '', locale: 'en', mode: :sandbox, format: :json, cache: true, api: :v5, ssl: true }.merge(config) @units_data = { just_used: nil, units_left: nil, units_limit: nil } raise "Token can't be empty" if @config[:token].nil? raise "Allowed Yandex Direct API versions are
ããŒãžã§ã³4ã®ã¡ãœããã¯v4ããããã£ã«æžã蟌ãŸããããŒãžã§ã³5ã®ã¡ãœããã¯åå¥ã®ãµãŒãã¹ã«ãã£ãŠã°ã«ãŒãåãããæ¢ã«ããã£ãŠããæ§ç¯ãéããŠã¯ã©ã€ã¢ã³ãã¯ã©ã¹ã®ã¡ãœããã«ãªããŸãã ããŠãclient.campaigns.getãåŒã³åºããšãRubyã¯æåã«client.campaignsïŒïŒãå®è¡ããŠãããçµæã®ãµãŒãã¹ã§getã¡ãœãããåŒã³åºããŸãã
ã¯ã©ã¹ãdo ... endæ§æã§äœ¿çšã§ããããã«ãã³ã³ã¹ãã©ã¯ã¿ãŒã®æåŸã®çšèªãå¿
èŠã§ãã
åæåã®çŽåŸã«ãïŒèšå®ã§æå®ãããŠããå ŽåïŒstart_cacheïŒãå®è¡ããŠããã£ãã·ã¥ãæå¹ã«ããã³ãã³ããAPIã«éä¿¡ããŸãã èšå®ã®ããŒãžã§ã³ã¯ããã«ã®ã¿åœ±é¿ããã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ããã¯äž¡æ¹ã®ããŒãžã§ã³ã®ã¡ãœãããåŒã³åºãããšãã§ããŸãã åä¿¡ããæ¥ä»ã¯cache_timestampããããã£ã§å©çšå¯èœã«ãªããŸãã
units_dataããããã£ã«ã¯ãUnitsã®ææ°æ
å ±ãå«ãŸããŸãã
ãŸãããããžã§ã¯ãã«ã¯ãããŒãžã§ã³èšå®ãšäŸå€ãå«ãã¯ã©ã¹ããããŸãã 圌ãã«ã¯ãã¹ãŠãã¯ã£ããããŠããã®ã§ãèšãããšã¯ãããŸããã ããŒãžã§ã³èšå®ãæã€ã¯ã©ã¹ã¯ããããžã§ã¯ããšãšãã«ãã³ãã«ã«ãã£ãŠçæãããŸãã
ããŠã direct.rbãã¡ã€ã«ã§ã¯ãå€éšãããŠãŒã¶ãŒã«è¡šç€ºãããã¯ã©ã¹ãæå®ããå¿
èŠããããŸãã ç§ãã¡ã®å Žåãããã¯ã¯ã©ã€ã¢ã³ãã¯ã©ã¹ã®ã¿ã§ãã ããã«ãããŒãžã§ã³ãšäŸå€ïŒå®å
šã«å
¬åŒã§ãïŒã
ã³ã³ãã€ã«ããŠå¡ãã€ã¶ã
gemãã³ã³ãã€ã«ããã«ã¯ãRubyGems.orgã®ããã¥ã¢ã«ã«åŸã£ãŠãã ããïŒè€éãªããšã¯äœããããŸããïŒã ãŸãã¯RailsããMountable Engineãé©çšããŸãã
ãããŠãrubygemsã«ã¢ããããŒãããŸã-çªç¶ããã®gemã¯ç§ãã¡ã ãã§ãªã圹ã«ç«ã€ãããããŸããã
Ruby on RailsããããŒã¯ã³ãååŸããæ¹æ³
RailsããYandec APIã«ãã°ã€ã³ããŠããŒã¯ã³ãååŸããããšã¯ãéçºè
ã«ãšã£ãŠéåžžã«ç°¡åãªããšã§ã...åããŠã§ã¯ãããŸããã
æ¢ã«åŠãã ããã«ãDirect APIã«ã¢ã¯ã»ã¹ããã«ã¯ããŒã¯ã³ãå¿
èŠã§ãã Yandexã®ãã«ããã ãTwitterãFacebookãå«ãå€ãã®ãµãŒãã¹ã§äœ¿çšãããå€ãè¯ãOAuth2ãç§ãã¡ã®åã«ããããšãããããŸãã
Rubyã«ã¯ãããŸããŸãªãµãŒãã¹ã®OAuth2å®è£
ãç¶æ¿ããå€å
žçãªgem omnââiauthããããŸãã ãã§ã«å®è£
ããã omnââiauth-yandex ã ç§ãã¡ã¯åœŒã«å¯ŸåŠããããšããŸãã
æ°ããRailsã¢ããªã±ãŒã·ã§ã³ãäœæããŸãããïŒåŠç¿ããåŸãäœæ¥äžã®ãããžã§ã¯ãã«è¿œå ããŸãïŒã Gemfileã«è¿œå ïŒ
gem "omniauth-yandex"
ãããŠããã³ãã«ã€ã³ã¹ããŒã«ãè¡ããŸãã
ãããŠãã¬ãŒã«çšã®OmniauthèªèšŒãã€ã³ã¹ããŒã«ããããã®ããã¥ã¢ã«ã䜿çšããŸãã twitterã®äŸã次ã«ç€ºããŸãã ããã翻蚳ããèªãçŽãããšã¯ãããã ãã®äŸ¡å€ã¯ãªããšæããŸã-èšäºã¯å·šå€§ã§ããããšã倿ããŸããã
ãã®èšäºã§èª¬æãããŠããäŸã¯ãç§ã«ãšã£ãŠã¯ããŸããããŸããã å¯äžã®ä¿®æ£ã¯ãSQLiteããããããµããŒãããªããããUserããŒãã«ã«è¿œå ã®ã€ã³ããã¯ã¹ãæžã蟌ãŸãªãã£ãããšã§ãã
確ãã«ããã®èšäºã¯ããŒã¯ã³ãé ããŠããå Žæã瀺ããŠããŸããã ããããããã¯ãŸã£ããç§å¯ã§ã¯ãããŸããã SessionControllerã§ååŸã§ããŸã
request.env['omniauth.auth'].credentials.token
èŠããŠãããŠãã ãã-ãã®ãããªèªèšŒã¯ãã¹ãŠããŒã¯ã³ãåçæããŸãã ãããŠãåŸã§çŽæ¥ããŒã¯ã³ã䜿çšããŠã¹ã¯ãªããã䜿çšããããšãããšããµãŒããŒã¯å€ãã¹ã¯ãªããã¯ãã¯ãé©åã§ã¯ãªããšèšããŸãã Yandexã¢ããªã±ãŒã·ã§ã³ã®èšå®ã«æ»ãããããã°ã³ãŒã«ããã¯URLïŒ__ https://oauth.yandex.ru/verification_code__ ïŒãå床æå®ããŠãããããŒã¯ã³ãåçæããå¿
èŠããããŸãã
ããã«è¯ãããšã«ããããã°ã«å¹²æžããªãããã«ãéçããŒã¯ã³çšã«å¥ã®ã¢ããªã±ãŒã·ã§ã³ãäœæããŸãã
åç
§è³æ