`
hot88zh
  • 浏览: 183554 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Ruby如何用Oauth与第三方网站互动

阅读更多

首先是介绍一下这个gem:oauth

项目首页是:http://oauth.rubyforge.org/,封装了Oauth的一些加密的过程和获取access token的过程,直接调用相应方法就可以了,里面也有例子可以参考。

 

这个Gem有一点问题还没有解决,比如微博需要上传文件,就不行咯。。。。大概原理是这样滴,这个gem会自动对传过去的所有参数进行签名,具体的签名方法请参考Oauth认证的详细说明……拿新浪微博举例子吧,需要一个status参数和一个pic参数,如果按照封装的方法传入这两个参数之后,会对status和pic参数进行签名,但是一般pic文件都是直接采用binary方式上传到服务器,并不需要签名。这样就无法用封装的方法了,遇到这种情况还是自己写吧。

 

下面是具体的方法,使用的时候直接调用upload_weibo就可以了~

 

CRLF = "\r\n"
  #发布带图片的微博信息,因为Oauth这个gem暂时还不支持带图片参数的post请求
  #所以自己构造请求的body部分,然后使用sign!这个方法来为请求的参数签名
  def upload_weibo(req_path, consumer, access_token, status, file_path)
    url = URI.parse(req_path)
    Net::HTTP.new(url.host, url.port).start do |http|
      req = Net::HTTP::Post.new(url.request_uri)
      req.set_form_data({"status" => CGI.escape(status.to_s)})
      add_oauth(req, consumer, access_token)
      add_multipart_data(req, {:pic=> File.new(file_path, "rb"), :status=> status})
      res = http.request(req)
      res.body
    end
  end


  private

  #对请求主体进行签名,调用Oauth的sign!方法
  #因为pic参数一般不进行签名,所以现在的请求主体不包含pic信息
  #仅仅包含请求的微博文本信息
  def add_oauth(req, consumer, access_token)
    consumer.sign!(req, access_token)
  end

  #创建请求的body部分,包含所有的信息(文字信息,上传的图片)
  def add_multipart_data(req, params)
    boundary = Time.now.to_i.to_s(16)
    req["Content-Type"] = "multipart/form-data; boundary=#{boundary}"
    body = ""
    params.each do |key,value|
      esc_key = CGI.escape(key.to_s)
      body << "--#{boundary}#{CRLF}"
      if value.respond_to?(:read)
        body << "Content-Disposition: form-data; name=\"#{esc_key}\"; filename=\"#{File.basename(value.path)}\"#{CRLF}"
        body << "Content-Type: #{mime_type(value.path)}#{CRLF*2}"
        body << value.read
      else
        body << "Content-Disposition: form-data; name=\"#{esc_key}\"#{CRLF*2}#{CGI.escape(value.to_s)}"
      end
      body << CRLF
    end
    body << "--#{boundary}--#{CRLF*2}"
    req.body = body
    req["Content-Length"] = req.body.size
  end

  #检测文件的类型
  #传入的参数是文件的路径信息,根据正则表达式判断为什么类型的文件
  def mime_type(file)
    case
    when file =~ /\.jpg/ then 'image/jpg'
    when file =~ /\.gif$/ then 'image/gif'
    when file =~ /\.png$/ then 'image/png'
    else 'application/octet-stream'
    end
  end
 
3
11
分享到:
评论
2 楼 hot88zh 2011-05-20  
Hooopo 写道
为什么这么多踩的呢

呃。。还真是,你不说我都没有注意到,真想看看是谁在踩。。。
1 楼 Hooopo 2011-05-16  
为什么这么多踩的呢

相关推荐

    假书:使用ruby在Rails上创建的Facebook副本

    6. **omniauth**:身份验证库,允许用户通过OAuth协议与第三方服务进行身份验证。 7. **用户认证**:涉及用户注册、登录、密码重置、权限控制等,通常会使用Devise等gem来实现。 8. **PostgreSQL/SQLite**:Rails...

    精品课程网站经典源码

    7. **视频播放功能**:在线课程往往包含视频内容,源码可能使用HLS、DASH等流媒体协议,或者与第三方视频服务如阿里云、腾讯云视频进行集成。 8. **评论与评分系统**:用户可以对课程进行评价和打分,这部分涉及...

    twip-4.1-r196.tar 推特api

    TWIP(可能代表Twitter Without Internet普适性项目)是一个针对推特API的第三方库或框架,它可能简化了与推特API的交互过程,以便开发者能更方便地在不同环境中使用。 在"twip-4.1-r196.tar"这个压缩包中,我们...

    视频博客源码

    同时,源码可能提供了API接口,允许第三方应用或服务集成,例如社交媒体分享、视频推荐算法的接入。 6. **评论与社交互动**: 视频博客鼓励用户间的互动,因此源码可能内置了评论系统,支持点赞、回复、举报等功能...

    skagh留言程序

    7. **API集成**:如果程序包含社交分享、发送邮件等功能,可能需要集成第三方API,如社交媒体的OAuth认证或SMTP服务提供商的API。 8. **部署与运维**:程序上线前,需要考虑服务器环境配置、版本控制(Git)、持续...

    【源码编号:MF00265】云课堂源码

    - 第三方服务如阿里云、腾讯云的直播服务可能会被接入,提供稳定的视频播放体验。 6. **课程管理和发布**: - 课程结构和内容管理模块,允许教师上传课件、视频、测验等,支持分章节、分课时的组织方式。 - 内容...

    Facebook API Developers Guide

    - OAuth 2.0 是一种授权协议,允许第三方应用安全地访问用户的 Facebook 数据。 - 分析了 OAuth 2.0 的工作流程,包括授权码模式、简化模式等不同应用场景下的实现细节。 3. **Webhooks 与订阅**: - Webhooks ...

    价值3000元的某家教网源码

    5. **支付接口**:家教网可能涉及付费服务,因此源码中会有与第三方支付平台(如支付宝、微信支付)的接口集成,实现支付功能。 6. **课程管理**:课程发布、预约、评价等功能的实现,通常会有一套完整的课程管理...

    BOSSZ众筹平台.zip

    4. **支付集成**:BOSSZ众筹平台需要与第三方支付服务提供商(如支付宝、微信支付或PayPal)进行集成,实现在线支付功能。这就需要熟悉API接口调用、支付回调处理、交易状态同步等技术。 5. **用户体验**:良好的...

    毕业设计-在线学习.zip

    对于付费课程,需要集成第三方支付平台如PayPal、Stripe或Alipay,处理交易和订阅。 9. **性能优化**: - 缓存策略(如Redis或Memcached)减少数据库压力,提高响应速度。 - CDNs(内容分发网络)加速静态资源的...

    integrations:主页,以获得文档和API集成示例

    9. **Rate limiting**:处理API的速率限制是集成中的常见挑战,需要理解并实施相应的策略,例如使用`Retry-After`头信息或第三方库如`ratelimitador`。 10. **缓存策略**:为了提高性能,开发者可能需要在客户端...

    scheduled_tweets

    10. **错误处理与日志记录**: 使用`Logger`或第三方库如`Airbrake`进行错误报告和日志记录,以便追踪和修复问题。 这些知识点构成了一个预定推文系统的整体框架,展示了如何使用Ruby来实现这个功能,并提供了可能的...

    仿豆瓣社区圈子

    以及OAuth或OpenID实现安全的第三方登录。 2. **用户系统**:用户注册、登录、个人信息管理,通常采用MD5加密存储密码,JWT(JSON Web Tokens)或Session来处理用户会话。 3. **内容发布与展示**:基于Markdown的...

    社交管理系统源代码.zip

    4. **API接口集成**:社交管理系统往往需要与第三方平台(如Facebook、Twitter)进行数据交换,因此会涉及到API接口的调用和管理。这可能涉及到OAuth认证、RESTful API的设计和使用等技术。 5. **安全性**:保护...

    producthunt:ProductHunt克隆

    6. **API集成**:ProductHunt克隆可能需要与第三方服务集成,如社交媒体分享、邮件服务、分析工具等。学习API调用和处理返回的数据是必要的。 7. **实时更新**:为了实时显示新产品的上架和用户的互动,可以采用...

    在线博客(完整源码)

    9. **第三方集成**: - 可能包含社交媒体分享按钮,便于用户分享博客到Facebook、Twitter等平台。 - Google Analytics或其他分析工具可能用于追踪网站流量和用户行为。 这个“在线博客(完整源码)”压缩包中可能...

    漂亮个性博客源码漂亮个性博客源码漂亮个性博客源码漂亮个性博客源码

    可以采用原生评论系统或者集成第三方服务如Disqus,同时需考虑垃圾评论的过滤和用户举报机制。 6. **SEO优化**:为了提高搜索引擎的可见度,博客源码应包含元标签、URL结构优化和Sitemap等SEO最佳实践。 7. **部署...

    博客系统 blog

    同时,可通过OAuth等协议实现第三方账号登录。 9. **SEO优化**:为了提高搜索引擎排名,博客系统应支持SEO(搜索引擎优化)功能,如自定义元标签、友好的URL结构、文章索引等。 10. **数据备份与恢复**:为了防止...

    “闲一品”交易平台.zip

    5. **支付集成**:平台可能需要与第三方支付平台如支付宝、微信支付或PayPal进行集成,处理在线支付,这就需要熟悉这些支付API的调用和回调处理。 6. **用户管理系统**:包括注册、登录、密码找回等功能,以及权限...

Global site tag (gtag.js) - Google Analytics