Created
April 5, 2016 17:12
-
-
Save kovenko/d915fe4ca57cb01fc079f8a7e9d0b524 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # https://github.com/moomerman/twitter_oauth | |
| module TwitterOAuth | |
| class Client | |
| def media_upload(mediadata, options={}) | |
| data = Base64.encode64(open(mediadata) {|io| io.read}) | |
| post('/media/upload.json', {media: data}) | |
| end | |
| end | |
| end | |
| class TwitterController < ApplicationController | |
| def clear | |
| session[:request_token] = nil | |
| session[:request_token_secret] = nil | |
| session[:twitter_access_token] = nil | |
| session[:twitter_secret_token] = nil | |
| session[:twitter_expires] = nil | |
| end | |
| def login | |
| # Если токен пользователя есть в БД, передать его в параметре | |
| session[:twitter_access_token] ||= params[:access_token] | |
| session[:twitter_secret_token] ||= params[:secret_token] | |
| if session[:twitter_access_token].nil? || session[:twitter_secret_token].nil? | |
| api_config | |
| @client = TwitterOAuth::Client.new( | |
| consumer_key: @@consumer_key, | |
| consumer_secret: @@consumer_secret | |
| ) | |
| request_token = @client.authentication_request_token(:oauth_callback => @@oauth_callback) | |
| session[:request_token] = request_token.token | |
| session[:request_token_secret] = request_token.secret | |
| redirect_to request_token.authorize_url | |
| else | |
| render text: 'Вроде как все, данные о пользователе уже были сохранены ранее.<br>Переходим к выбору поста для размещения.' | |
| end | |
| end | |
| def authorize | |
| api_config | |
| client = TwitterOAuth::Client.new( | |
| consumer_key: @@consumer_key, | |
| consumer_secret: @@consumer_secret | |
| ) | |
| access_token = client.authorize( | |
| session[:request_token], | |
| session[:request_token_secret], | |
| :oauth_verifier => params[:oauth_verifier] | |
| ) | |
| if client.authorized? | |
| @token_for_save = true | |
| session[:twitter_access_token] = access_token.token | |
| session[:twitter_secret_token] = access_token.secret | |
| session[:twitter_expires] = 0 | |
| session[:request_token] = nil | |
| session[:request_token_secret] = nil | |
| result = info | |
| if result.nil? | |
| render text: 'Что-то пошло не так.<br />Вернуть к начальной странице выбора соцюсети.' | |
| else | |
| render text: 'Данные о пользователе сохранены.<br />Переходим к выбору поста для размещения.' | |
| end | |
| else | |
| render text: 'Не удалось авторизоваться.<br />Вернуть к начальной странице выбора соцюсети.' | |
| end | |
| end | |
| def info | |
| api_config | |
| client = TwitterOAuth::Client.new( | |
| consumer_key: @@consumer_key, | |
| consumer_secret: @@consumer_secret, | |
| token: session[:twitter_access_token], | |
| secret: session[:twitter_secret_token] | |
| ) | |
| if defined?(client.info[:id]) | |
| @user_info = save_user_info client.info | |
| else | |
| clear | |
| return nil | |
| end | |
| end | |
| def wallpost | |
| api_config | |
| @client = TwitterOAuth::Client.new( | |
| consumer_key: @@consumer_key, | |
| consumer_secret: @@consumer_secret, | |
| token: session[:twitter_access_token], | |
| secret: session[:twitter_secret_token] | |
| ) | |
| # Получить из параметров запроса | |
| text = 'Ах у дуба, ах у ели, зайцы прыгали и пели!' | |
| image = '/home/kvb/Ruby/social.2wifi.ru/app/controllers/a.jpg' | |
| url = 'http://2wifi.ru' | |
| media_id = upload_image image | |
| post_id = post_to_wall text, media_id, url | |
| if post_id.nil? | |
| render text: 'Не удалось опубликовать пост.<br />Вернуть к начальной странице выбора соцюсети.' | |
| else | |
| render json: post_id | |
| end | |
| end | |
| private | |
| def api_config | |
| File.open(Rails.root + "config/twitter_secret.yml", "r").each_line do |line| | |
| if line.include? 'consumer_key' | |
| @@consumer_key = line.split('=')[1].strip | |
| elsif line.include? 'consumer_secret' | |
| @@consumer_secret = line.split('=')[1].strip | |
| elsif line.include? 'oauth_callback' | |
| @@oauth_callback = line.split('=')[1].strip | |
| end | |
| end | |
| end | |
| # Сохраняет информацию о пользователе | |
| def save_user_info info | |
| if @token_for_save.nil? | |
| token = nil | |
| else | |
| token = {} | |
| token[:access_token] = session[:twitter_access_token] | |
| token[:secret_token] = session[:twitter_secret_token] | |
| token[:expires] = session[:twitter_expires] | |
| end | |
| user_info = TwitterUserParser.new(info, token).parse | |
| user_info[:access_token] = nil | |
| user_info[:secret_token] = nil | |
| user_info[:expires] = nil | |
| # Сохранить данные в модели social | |
| return user_info | |
| end | |
| # Сохраняет изображение для публикации на стене пользователя | |
| def upload_image(image) | |
| if image.nil? || image.empty? | |
| return nil | |
| end | |
| upload_client = TwitterOAuth::Client.new( | |
| consumer_key: @@consumer_key, | |
| consumer_secret: @@consumer_secret, | |
| token: session[:twitter_access_token], | |
| secret: session[:twitter_secret_token], | |
| api_host: 'upload.twitter.com' | |
| ) | |
| result = upload_client.media_upload image | |
| return result['media_id_string'] | |
| end | |
| # Сохраняет пост на стене пользователя | |
| def post_to_wall(text, media_id = nil, url = nil) | |
| if text.size > 89 | |
| text = "#{text[0,89]}...\n#{url}" | |
| else | |
| text = "#{text}\n#{url}" | |
| end | |
| options = {} | |
| options[:media_ids] = media_id unless media_id.nil? || media_id.empty? | |
| result = @client.update(text, options) | |
| return result['id_str'] | |
| end | |
| end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment