vkontakte_api: VK API рдХреЗ рд▓рд┐рдП рд░реВрдмреА рдПрдбрд╛рдкреНрдЯрд░

рдЗрд╕ рд╡рд░реНрд╖ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рд░реЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕реЗ рд╡реАрдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдХрд╛рд╢, рдореБрдЭреЗ рдРрд╕рд╛ рдХреЛрдИ рд░рддреНрди рдирд╣реАрдВ рдорд┐рд▓рд╛ рдЬреЛ рдореБрдЭреЗ рдЕрдиреБрдХреВрд▓ рд▓рдЧреЗ: рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдореБрдЭреЗ рдХреИрдорд▓рдХреЗрд╕ рдореЗрдВ рддрд░реАрдХреЛрдВ рдХреЗ рдирд╛рдо рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ (рдЬреЛ рд░реВрдмреА рдХреЛрдб рдореЗрдВ рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХ рджрд┐рдЦрддрд╛ рд╣реИ), рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдпрд╣ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдЧреБрдЬрд░рдирд╛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╣реИ (рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдореИрдВрдиреЗ рдУрдореНрдиреНрдпреВрде рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдерд╛ ) рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рд╣рд░ рдЬрдЧрд╣, рдПрдкреАрдЖрдИ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рд╛рд░реНрдбрдХреЛрдб Net::HTTP , рдЬреЛ рдЗрд╡реЗрдВрдЯ рдорд╢реАрди рд░рд┐рдПрдХреНрдЯрд░ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рдерд╛, рдЬрд┐рд╕реЗ рдореИрдВ рддрдм рдирд┐рд╢рд╛рдирд╛ рдмрдирд╛рддрд╛ рдерд╛ред рд╕рд╛рде рд╣реА, рдкреНрд░рд▓реЗрдЦрди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рджреБрдЦрдж рдерд╛, рдФрд░ рдореБрдЭреЗ рд▓рдЧрд╛рддрд╛рд░ рд╕реНрд░реЛрдд рдХреЛрдб рдкрдврд╝рдирд╛ рдкрдбрд╝рд╛ред

рддреЛ vkontakte_api рдХрд╛ рдЬрдиреНрдо рд╣реБрдЖред рд░реЗрд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛, рдЬреЛ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╣рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рдереА, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрд░рд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реА - рд▓реЗрдХрд┐рди рдордгрд┐ рд░рд╣рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд╣реИ, рдЬреБрд▓рд╛рдИ рдореЗрдВ 1.0 рд╕рдВрд╕реНрдХрд░рдг рддрдХ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ (рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣рд╛рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрд╡рд╛ рдХреА)ред faraday рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдгрдпреЛрдВ рдХреЛ рди рд▓реЗрдХрд░, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд┐рд╕реА рднреА рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ, VKontakte рд╕рд░реНрд╡рд░ рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдореЗрдВ рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ vkontakte_api рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣реЛрдЧрд╛ рдЬреЛ OAuth2 рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкрд╛рд░рд┐рдд рдХрд░ рдЪреБрдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдорд┐рддреНрд░реЛрдВ ( рджреЛрд╕реНрддреЛрдВ ) рдФрд░ рджреЛрд╕реНрддреЛрдВ ( рдорд┐рддреНрд░реЛрдВ ) рдХреА рд╕реВрдЪреА (рд╕рдореВрд╣) рдХреЛ рдПрдХ рд╕рдорд╛рдЪрд╛рд░ рдлрд╝реАрдб (рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐ рдиреНрдпреВрдЬрдлреАрдб.рдЧреЗрдЯ ) рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:



рд╕рдорд╛рдпреЛрдЬрди


рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдИрдбреА рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ VKontakte рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рдВрдкрд╛рджрди рдкреГрд╖реНрда рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ; рд╕рд╛рде рд╣реА рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ_рдпреВрд░реА, рдЬрд┐рд╕реЗ рдмрд╛рдж рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпреЗ рдкреИрд░рд╛рдореАрдЯрд░ VkontakteApi.configure рдмреНрд▓реЙрдХ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЬреЛ рдЖрд╕рд╛рдиреА рд╕реЗ config/initializers/vkontakte_api.rb рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ; рд░реЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ, рдЖрдк рдЗрд╕ рдлрд╛рдЗрд▓ рдХреЛ рдмрд┐рд▓реНрдЯ-рдЗрди рдЬрдирд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдЬреЗрдирд░реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 $ rails generate vkontakte_api:install 

рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЗрдВрдЧрд┐рдд рдХреА рдЧрдИ рд╣реИрдВред

 # config/initializers/vkontakte_api.rb VkontakteApi.configure do |config| config.app_id = '123' # ID  config.app_secret = 'AbCdE654' #   config.redirect_uri = 'http://vkontakte-on-rails.herokuapp.com/callback' end 

(рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╡рд┐рдХрд▓реНрдк рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмрд╛рдХреА рдХреА рдпрд╣рд╛рдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА)

рдкреНрд░рд╛рдзрд┐рдХрд░рдг


рдЖрдкрдХреЛ рдХреЗрд╡рд▓ VKontakte рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╛рдЗрдЯ рдкрд░ omniauth рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП omniauth рдХрд╛ рдЙрдкрдпреЛрдЧ omniauth рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдирд╣реАрдВ рд╣реЛрдЧрд╛ - рд╣рдо vkontakte_api рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

VKontakte рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдкреНрд░рд╛рдзрд┐рдХрд░рдг OAuth2 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдПрдХ рдПрдХреНрд╕реЗрд╕ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕реЗ рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ VKontakte рдкрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдВрдХ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ, "рдЕрдиреБрдорддрд┐ рджреЗрдВ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЕрдкрдиреЗ (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛) рдбреЗрдЯрд╛ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдПрдХреНрд╕реЗрд╕ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣рдордд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ VKontakte URL рдкрд░ code рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкрд░ рд╡рд╛рдкрд╕ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдкреНрд▓рд┐рдХреЗрд╢рди, рдЗрд╕ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ user_id рдЯреЛрдХрди рдФрд░ user_id рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рддреНрд░ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдмрдЪрд╛рддрд╛ рд╣реИред

CSRF рд╣рдорд▓реЛрдВ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, OAuth2 рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реНрдерд╛рди рдкрд░ рдЗрд╕реЗ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рднреЗрдЬрддреЗ рд╕рдордп рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде state рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИ; рдФрд░ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╡рд╛рдкрд╕ рд▓реМрдЯрддрд╛ рд╣реИ, рддреЛ рд╕рд╣реЗрдЬреЗ рдЧрдП рдорд╛рди рдХреЗ рд╕рд╛рде рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкреНрд░рд╛рдкреНрдд state рдЬрд╛рдВрдЪ рдХрд░реЗрдВред

рддреЛ, рд▓реЙрдЧрд┐рди рдкреГрд╖реНрда рдкрд░ рдЖрдкрдХреЛ VKontakte рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреГрд╖реНрда рдкрд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд▓рд┐рдВрдХ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред vkontakte_api рдЗрд╕ рдкреГрд╖реНрда рдкрд░ URL рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП VkontakteApi.authorization_url рд╕рд╣рд╛рдпрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ; рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдЖрдкрдХреЛ scope рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдпреЗ рдЕрдзрд┐рдХрд╛рд░ рд╣реИрдВ рдЬреЛ рдЖрд╡реЗрджрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ, рд╡рд░реНрдгреЛрдВ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ (рдпрд╛ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рддрд╛рд░) - рдФрд░ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд state ред

 # app/controllers/sessions_controller.rb class SessionsController < ApplicationController def new #   state srand session[:state] ||= Digest::MD5.hexdigest(rand.to_s) #  URL   @vk_url = VkontakteApi.authorization_url(scope: [:friends, :groups, :offline, :notify], state: session[:state]) end end 


 <!-- app/views/sessions/new.html.erb --> <%= link_to @vk_url, class: 'btn btn-primary' do %> <i class="icon-home icon-white"></i>    <% end %> 

рдпрд╣рд╛рдВ рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреБрдЫ рдЕрдЬреНрдЮрд╛рдд рдХрд╛рд░рдгреЛрдВ рд╕реЗ VKontakte state рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ state рдпрджрд┐ notify scope рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИред

рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрд╡реЗрджрди рдХреЗ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдкрд╣рд▓реЗ рдмрддрд╛рдП рдЧрдП рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ_рдпреВрд░реА рдкрд░ рднреЗрдЬ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдЬрд┐рд╕рдореЗрдВ SessionsController#callback рд▓рд┐рдП рд░рд╛рд╕реНрддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ), рдФрд░ state рдФрд░ code рдкреИрд░рд╛рдореАрдЯрд░ URL рдкрд░ рдкрд╛рд░рд┐рдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, state рдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╣реЗрдЬреЗ рдЧрдП рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ code рдкрд░ рд░рд╣рддреЗ рд╣реИрдВред

рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдПрдХ рдкрд╣реБрдВрдЪ рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ VKontakte рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдореЗрдВ рднрд╛рдЧ рдирд╣реАрдВ рд▓реЗрддрд╛ рд╣реИ - рдпрд╣ рдЕрдиреБрд░реЛрдз рд╣рдорд╛рд░реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рд╕реАрдзреЗ vk.com рдкрд░ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП, vkontakte_api рдПрдХ рд╕рд╣рд╛рдпрдХ рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - VkontakteApi.authorize , рдПрдХрдорд╛рддреНрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреБрдЦреНрдпрд╛рдд code ред

 # encoding: utf-8 class SessionsController < ApplicationController def callback #  state if session[:state].present? && session[:state] != params[:state] redirect_to root_url, alert: ' ,    .' and return end #   @vk = VkontakteApi.authorize(code: params[:code]) #      session[:token] = @vk.token #   id    -    session[:vk_id] = @vk.user_id redirect_to root_url end end 

рдЬрдм рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдХреЗрд╡рд▓ рд╕рддреНрд░ рдХреЛ рд╕рд╛рдл рдХрд░рддреЗ рд╣реИрдВ:

 class SessionsController < ApplicationController def destroy session[:token] = nil session[:vk_id] = nil redirect_to root_url end end 

рдЯреЛрдХрди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЖрдк рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рд╣реА рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐ рдХреЙрд▓


рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ VkontakteApi::Client рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдмрд╕ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдЯреЛрдХрди рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдк рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рд╣реА рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпреМрдЧрд┐рдХ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рддрд░реАрдХреЗ рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ: vk.users.get(params) ред рд░реВрдмреА рд╕рдореБрджрд╛рдп рдореЗрдВ рдЕрдкрдирд╛рдП рдЧрдП рд╕рдореНрдореЗрд▓рдиреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╡рд┐рдзрд┐ рдХреЗ рдирд╛рдо snake_case рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ: API рдкрд╕рдВрдж likes.getList рдкрджреНрдзрддрд┐ рдХреЛ vk.likes.get_list рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рднреА рдПрдкреАрдЖрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд╛рдо рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╛рдореЛрдВ рд╕реЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рд╣реИрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП vk.users.get(uid: 1) ред рдпрджрд┐ API рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ - vkontakte_api рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк vkontakte_api рдЧреЛрдВрдж рдХрд░реЗрдЧрд╛ (рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдореЗрдВ scope рдкреИрд░рд╛рдореАрдЯрд░ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реЛрддрд╛ рд╣реИ)ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк рддрд╛рд░ рдХреЗ рдмрдЬрд╛рдп рд╡рд░реНрдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдЪрд╛рд░ рдлрд╝реАрдб, рдорд┐рддреНрд░реЛрдВ рдФрд░ рд╕рдореВрд╣реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдиреЗрд╡рд┐рдЧреЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдЕрд╡рддрд╛рд░ рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред рдХреНрд░рдорд╢рдГ рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП newsfeed.get , friends.get , groups.get рдФрд░ users.get рд╡рд┐рдзрд┐рдпрд╛рдВ рд╣реИрдВ (рд╣рдо рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдИрдбреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдХреЗ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХрд╣реЗрдВрдЧреЗ)ред newsfeed.get рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдорд╛рдЪрд╛рд░реЛрдВ рдореЗрдВ рд╣реА рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдФрд░ рд╕рдореВрд╣реЛрдВ рдХреА рдЖрдИрдбреА рд╣реЛрддреА рд╣реИ, рдФрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдФрд░ рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рд╛рде рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд░рдгрд┐рдпрд╛рдБ рд╣реЛрддреА рд╣реИрдВ; MainController#process_feed рд╡рд┐рдзрд┐ рдпрд╣рд╛рдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдИ рдЧрдИ рд╣реИ рдкреНрд░рддреНрдпреЗрдХ рд╕рдорд╛рдЪрд╛рд░ рдореЗрдВ рдЗрд╕рдХрд╛ рд╕реНрд░реЛрдд (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рд╕рдореВрд╣ рдЬрд┐рд╕рдиреЗ рдкреЛрд╕реНрдЯ рд▓рд┐рдЦрд╛ рд╣реИ) рдкреНрд░рдореБрдЦ source рддрд╣рдд рдЬреЛрдбрд╝рддрд╛ рд╣реИред

 class MainController < ApplicationController def index #    API vk = VkontakteApi::Client.new(session[:token]) #     @user = vk.users.get(uid: session[:vk_id], fields: [:screen_name, :photo]).first #   @friends = vk.friends.get(fields: [:screen_name, :sex, :photo, :last_seen]) #   ,      @friends_online = @friends.select { |friend| friend.online == 1 } #  @groups = vk.groups.get(extended: 1) #    - - ;    @groups.shift #    raw_feed = vk.newsfeed.get(filters: 'post') #     @newsfeed = process_feed(raw_feed) end end 

рддрд░реАрдХреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ Hashie::Mash рдХреЗ рд░реВрдк рдореЗрдВ Hashie::Mash рд╣реИрд╢реА рдордгрд┐ рд╕реЗ рдорд╛рдирдХ Hash рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рддрддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдирд╛рдо рд╣реИрд╢ рдореЗрдВ рдЗрд╕ рддрддреНрд╡ рдХреА рдХреБрдВрдЬреА рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ ( user.name == user[:name] )ред

рдиреЗрд╡рд┐рдЧреЗрд╢рди рдореЗрдВ рдЖрдкрдХреЛ VKontakte рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рдЕрд╡рддрд╛рд░ рдФрд░ рдирд╛рдо рджрд┐рдЦрд╛рдирд╛ рд╣реЛрдЧрд╛ред

 <%= link_to vk_url(@user), target: '_blank' do %> <%= image_tag(@user.photo, width: 20) %> <%= "#{@user.first_name} #{@user.last_name}" %> <% end %> 

рдЗрд╕рдХреЗ рдмрд╛рдж, рдХрдИ рд╕рд░рд▓ рд╕рд╣рд╛рдпрдХреЛрдВ ( vk_url , name_for , avatar_for рдЖрджрд┐) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдП рдЧрдП рд╣реИрдВ - рд╡реЗ рд╕рднреА рдХрд╛рдлреА рддреБрдЪреНрдЫ рд╣реИрдВ, рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдпрд╣рд╛рдВ рдХреЛрдб рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдм рд╣рдо рдкреГрд╖реНрда рдкрд░ рд╕рдорд╛рдЪрд╛рд░ рдлрд╝реАрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

 <!-- app/views/main/index.html.erb --> <% @newsfeed.each do |item| %> <tr> <td> <%= link_to vk_url(item.source), target: '_blank' do %> <%= image_tag avatar_for(item.source) %> <% end %> </td> <td class="wide"> <div class="pull-right"><%= formatted_time_for(item.date) %></div> <%= link_to name_for(item.source), vk_url(item.source), target: '_blank' %> <p><%=raw render_links(item.text) %></p> <% item.attachments.each do |attachment| %> <%= render 'attachment', attachment: attachment %> <% end if item.attachments? %> </td> </tr> <% end %> <!-- app/views/main/_attachment.html.erb --> <p> <% case attachment.type %> <% when 'link' %> <%= link_to attachment.link.title, attachment.link.url, target: '_blank' %> <% when 'photo' %> <%= image_tag attachment.photo.src_big %> <% when 'video' %> <%= image_tag attachment.video.image_big %> <% end %> </p> <div class="clearfix"></div> 

рдФрд░ рдЕрдВрдд рдореЗрдВ, рд╕рд╛рдЗрдб рдмрд╛рд░ рджреЛрд╕реНрддреЛрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рдореВрд╣реЛрдВ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред

 <!-- app/views/main/_sidebar.html.erb --> <div class="tab-pane active" id="friends_online"> <h6> </h6> <%= render 'friends', friends: @friends_online %> </div> <div class="tab-pane" id="friends"> <h6> </h6> <%= render 'friends', friends: @friends %> </div> <div class="tab-pane" id="groups"> <h6></h6> <%= render 'groups' %> </div> <!-- app/views/main/_friends.html.erb --> <table class="table"> <% if friends.empty? %> <tr> <td>  </td> </tr> <% else %> <% friends.each do |friend| %> <tr> <td> <%= link_to image_tag(friend.photo), vk_url(friend), target: '_blank' %> </td> <td class="wide"> <i class="icon-user"></i> <%= link_to "#{friend.first_name} #{friend.last_name}", vk_url(friend), target: '_blank' %> <br /> <%= online_status(friend) %> </td> </tr> <% end %> <% end %> </table> <!-- app/views/main/_groups.html.erb --> <table class="table"> <% if @groups.empty? %> <tr> <td>    </td> </tr> <% else %> <% @groups.each do |group| %> <tr> <td> <%= link_to image_tag(group.photo), vk_url(group), target: '_blank' %> </td> <td class="wide"> <i class="icon-comment"></i> <%= link_to group.name, vk_url(group), target: '_blank' %> </td> </tr> <% end %> <% end %> </table> 

рдЖрдк рдпрд╣рд╛рдВ рд▓рд╛рдЗрд╡ рдбреЗрдореЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ (рд╕рд╛рд╡рдзрд╛рдиреА, рдореБрдлреНрдд рд╣реЗрд░реЛрдХреВ)ред рдпрд╣ VKontakte рдкрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ - рд╕рднреА рдПрдкреАрдЖрдИ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдкрдврд╝рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдХ рдкреГрд╖реНрда рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рднреА рдХреЛрдб Github рдкрд░ рд╣реИред

vkontakte_api рдкрд░ рдХреБрдЫ рдФрд░ рд╕рд╛рдордЧреНрд░реА


Source: https://habr.com/ru/post/In151585/


All Articles