class Nx::WeiboSso
Constants
- VERSION
Public Class Methods
token(username, password)
click to toggle source
# File lib/nx/weibo-sso.rb, line 12 def self.token(username, password) # url login: url_prelogin = "https://login.sina.com.cn/sso/prelogin.php" url_login = "https://login.sina.com.cn/sso/login.php" # prepare data: su = Base64.strict_encode64(username.sub("@", "%40")) # regexp prelogin_data = { entry: "sso", callback: "sinaSSOController.preloginCallBack", su: su, rsakt: "mod", client: "ssologin.js(v1.4.15)", _: Time.now.to_i.to_s, } ## prelogin: res = open("#{url_prelogin}?#{URI.encode_www_form(prelogin_data)}") prelogin_response = JSON.parse PRELOGIN_JSONP_RE.match(res.read)[0] pwdkey = prelogin_response["servertime"].to_s + "\t" + prelogin_response["nonce"].to_s + "\n" + password.to_s pub = OpenSSL::PKey::RSA::new pub.set_key(OpenSSL::BN.new(prelogin_response["pubkey"], 16), 65537, nil) sp = pub.public_encrypt(pwdkey).unpack("H*").first data = { "entry" => "weibo", "gateway" => 1, "from" => "", "savestate" => 30, "useticket" => 0, "pagerefer" => "", "vsnf" => 1, "service" => "sso", "pwencode" => "rsa2", "sr" => "1920 * 1200", "encoding" => "UTF-8", "cdult" => 3, "domain" => "sina.com.cn", "returntype" => "TEXT", } data.merge!(prelogin_response).merge!({ "su" => su, "sp" => sp, "prelt" => 56, }) login_response = Net::HTTP.post_form(URI(url_login), data) url_ticket = JSON.parse(login_response.body)["crossDomainUrlList"][0] weibo_sso_res = Net::HTTP.get_response(URI(url_ticket)) weibo_sso_res.get_fields("set-cookie")[0] end