Skip to content

Instantly share code, notes, and snippets.

@Mumakil
Last active August 29, 2015 14:08
Show Gist options
  • Save Mumakil/1d184a3f06bcd087c5e2 to your computer and use it in GitHub Desktop.
Save Mumakil/1d184a3f06bcd087c5e2 to your computer and use it in GitHub Desktop.
Generate Flowdock oauth token
#!/usr/bin/env ruby
begin
require 'oauth2'
rescue LoadError
puts "You need to install oauth2 gem, run `gem install oauth2`"
exit 1
end
require 'uri'
require 'net/http'
redirect_uri = 'urn:ietf:wg:oauth:2.0:oob'
$site = ENV['FLOWDOCK_API_URL'] || "https://api.flowdock.com"
$email = nil
$password = nil
def ask_credentials
return if $email
puts "\nPlease input your email address\n"
$email = gets.chomp
puts "Please input your password\n"
$password = gets.chomp
end
if ENV['FLOWDOCK_OAUTH_APP_ID'] && ENV['FLOWDOCK_OAUTH_APP_SECRET']
client_id = ENV['FLOWDOCK_OAUTH_APP_ID']
client_secret = ENV['FLOWDOCK_OAUTH_APP_SECRET']
puts "Using preconfigured OAuth app #{client_id}."
else
puts "First, let's setup an OAuth app."
puts "\nYou can skip this by adding\n FLOWDOCK_OAUTH_APP_ID\n FLOWDOCK_OAUTH_APP_SECRET\nto your environment variables."
ask_credentials
puts "\nPlease input a name for your app\n"
app_name = gets.chomp
url = URI("#{$site}/oauth/applications")
response = Net::HTTP.start(url.host, url.port, use_ssl: url.scheme == 'https') do |http|
req = Net::HTTP::Post.new(url.path)
req.body = JSON.dump(application: {name: app_name, redirect_uri: redirect_uri})
req.basic_auth $email, $password
req['Accept'] = 'application/json'
req['Content-Type'] = 'application/json'
http.request(req)
end
if response.code.to_i < 400
app_data = JSON.parse(response.body)
else
puts "Failed creating app with code #{response.code}:"
puts response.body.inspect
exit 1
end
puts "\nCreated OAuth app:"
puts "Application id: #{app_data['client_id']}"
puts "Application secret: #{app_data['client_secret']}"
client_id = app_data['client_id']
client_secret = app_data['client_secret']
end
ask_credentials
puts "\nCreating an access token. Continue?\n"
gets
client = OAuth2::Client.new(client_id, client_secret, :site => $site)
token = client.password.get_token($email, $password, redirect_uri: redirect_uri, scope: 'flow integration')
puts "\nYour OAuth token is:\n====================\n#{token.token}\n===================="
puts "\n\nNow fetching your flows"
response = token.get('/flows.json')
flows = JSON.parse(response.body).select { |flow| flow['open'] }
puts 'Flows you have open: '
flows.each_with_index do |flow, index|
puts "#{index + 1}. #{flow['name']} (#{flow['organization']['name']})"
end
puts "\nNext we'll create a source in each flow."
puts "Please input a comma separated list of flows you want to add (1,3,5) or hit enter to create a source in every flow.\n"
input = gets.chomp
flows_to_add = if input == ''
flows
else
input.split(',').map(&:chomp).map(&:to_i).map { |i| flows[i-1] }
end
puts "Selected #{flows_to_add.size} flows."
puts "Name for the source:\n"
source_name = gets.chomp
puts "\nCreating sources:"
flows_to_add.each do |flow|
response = token.post("#{flow["url"]}/sources", body: {name: source_name})
data = JSON.parse(response.body)
puts "Flow #{flow['name']} (#{flow['organization']['name']}) with id #{flow['id']}:"
puts "Source { id: #{data['id']}, name: '#{data['name']}', flow_token: '#{data['flow_token']}' }"
end
@Mumakil
Copy link
Author

Mumakil commented Nov 14, 2014

Great that it works. And that not needing to use random gists is something that's going to get done eventually! =) We just published this so that we could get the heaven stuff easily out now.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment