Skip to content

Instantly share code, notes, and snippets.

@weiland
Last active February 17, 2021 09:38
Show Gist options
  • Save weiland/4d8445d7cf2200b366eba8f3f6afe97f to your computer and use it in GitHub Desktop.
Save weiland/4d8445d7cf2200b366eba8f3f6afe97f to your computer and use it in GitHub Desktop.
GoTo Meeting ruby script to obtain an *opener* url

GoToMeeting Opener in ruby

Requirements

  • ruby >= 2.5
  • nokogiri gem (gem install nokogiri)

Usage

ruby gtm.rb 0123456

# or
ruby gtm.rb 'My-Meeting-slug'

# don't automatically open goto-opener
ruby gtm.rb 'My-Meeting-slug' -n

# show url for browser (unfortunately chrome only)
ruby gtm.rb 'My-Meeting-slug' -b

License

ISC

require 'net/http'
require 'uri'
require 'cgi'
require 'nokogiri'
# require 'open-uri'
SHORT_URL = 'https://www.gotomeet.me/'
JOIN_URL = 'https://global.gotomeeting.com/join/'
IFRAME_URL = 'https://launch.getgo.com/launcher2/launch.html?token='
USER_AGENT = 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:77.0) Gecko/20100101 Firefox/77.0'
OPENER_URL = 'gotoopener://launch.getgo.com/launcher2/launch/'
def get_body(url)
uri = URI.parse(url)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true if uri.scheme == 'https'
req = Net::HTTP::Get.new(uri, {'User-Agent' => USER_AGENT})
res = http.start { |http| http.request req }
Nokogiri::HTML.parse res.body
end
def get_token_by_id(id)
url = "#{JOIN_URL}#{id}"
get_token(url)
end
def get_token(url)
doc = get_body(url)
parse_token(get_iframe_url(doc))
end
def get_token_by_url(url)
doc = get_body url
url = get_meeting_url doc
get_token(url)
end
def get_token_by_name(name)
url = "#{SHORT_URL}#{name}"
doc = get_body url
url = get_meeting_url doc
get_token(url)
end
def get_iframe_url(doc)
doc.css('iframe').attr('src').value
end
def get_meeting_url(doc)
doc.css('.g2mm-join-link').attr('href').value
end
def get_meeting_url(doc)
doc.css('.g2mm-join-link').attr('href').value
end
def parse_token(url)
uri = URI(url)
query = CGI::parse(uri.query)
query["token"][0]
end
def get_opener_url(token)
"#{OPENER_URL}#{token}"
end
def get_id_by_name(name)
url = "#{SHORT_URL}#{name}"
doc = get_body url
get_meeting_url doc
end
def get_browser(token, is_id)
unless is_id
"#{SHORT_URL}#{token}"
end
get_id_by_name(token)
end
def open(url)
system("open #{url}")
end
def main
id_or_name = ARGV.first
id_or_name = Integer(id_or_name) if id_or_name.match(/^\d+$/)
dont_open = ARGV[1] == '-n' || ARGV[1] == '--no-open'
browser = ARGV[1] == '-b' || ARGV[1] == '--browser'
is_id = id_or_name.is_a? Integer
if is_id
token = get_token_by_id(id_or_name)
elsif id_or_name.include? 'gotomeet.me'
token = get_token_by_url(id_or_name)
else id_or_name =~ URI::regexp
token = get_token_by_name(id_or_name)
end
opener_url = get_opener_url(token)
# if browser url (for chrome) should be returned
if browser
print get_browser(id_or_name, is_id)
# don't automatically open gotoopener and only print the url
elsif dont_open
print opener_url
else
# by default open the opener url
open opener_url
end
end
main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment