Skip to content

Instantly share code, notes, and snippets.

@kovenko
Created April 5, 2016 17:12
Show Gist options
  • Select an option

  • Save kovenko/d915fe4ca57cb01fc079f8a7e9d0b524 to your computer and use it in GitHub Desktop.

Select an option

Save kovenko/d915fe4ca57cb01fc079f8a7e9d0b524 to your computer and use it in GitHub Desktop.
# 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