রেলের উপর Google ডেটা

এরিক বিডেলম্যান, Google Data APIs টিম
ফেব্রুয়ারি 2009

ভূমিকা

" ক্লায়েন্ট লাইব্রেরির তালিকায় রুবি কোথায়?"

আমাদের ডেভেলপারদের উগ্র ক্ষুধা এবং Ruby on Rails (RoR) এর স্থায়ী জনপ্রিয়তা দ্বারা অনুপ্রাণিত হয়ে, আমার সহকর্মী জেফ ফিশার মাউন্ট ডুমের অগ্নিগর্ভ গভীরতা থেকে একটি রুবি ইউটিলিটি লাইব্রেরি তৈরি করেছেন৷ মনে রাখবেন, এটি একটি পূর্ণ-বিকশিত ক্লায়েন্ট লাইব্রেরি নয়, তবে এটি প্রমাণীকরণ এবং মৌলিক XML ম্যানিপুলেশনের মতো মৌলিক বিষয়গুলি পরিচালনা করে। এটির জন্য আপনাকে REXML মডিউল এবং XPath ব্যবহার করে অ্যাটম ফিডের সাথে সরাসরি কাজ করতে হবে।

শ্রোতা

এই নিবন্ধটি Ruby ব্যবহার করে Google Data APIs অ্যাক্সেস করতে আগ্রহী ডেভেলপারদের উদ্দেশ্যে, বিশেষ করে Ruby on Rails। এটি অনুমান করে যে রুবি প্রোগ্রামিং ভাষা এবং রেল ওয়েব-ডেভেলপমেন্ট ফ্রেমওয়ার্কের সাথে পাঠকের কিছু পরিচিতি রয়েছে। আমি বেশিরভাগ নমুনার জন্য ডকুমেন্টস লিস্ট API- এ ফোকাস করি, কিন্তু একই ধারণাগুলি যেকোনও ডেটা API- তে প্রয়োগ করা যেতে পারে।

শুরু হচ্ছে

প্রয়োজনীয়তা

গুগল ডেটা রুবি ইউটিলিটি লাইব্রেরি ইনস্টল করা হচ্ছে

লাইব্রেরি পাওয়ার জন্য, আপনি হয় সরাসরি প্রোজেক্ট হোস্টিং থেকে লাইব্রেরি সোর্স ডাউনলোড করতে পারেন অথবা রত্নটি ইনস্টল করতে পারেন:

sudo gem install gdata

টিপ : ভাল পরিমাপের জন্য, রত্নটি সঠিকভাবে ইনস্টল করা হয়েছে তা যাচাই করতে gem list --local চালান।

প্রমাণীকরণ

ক্লায়েন্টলগইন

ClientLogin ব্যবহারকারীদের তাদের Google বা G Suite অ্যাকাউন্টে প্রোগ্রাম্যাটিকভাবে লগ ইন করার জন্য আপনার অ্যাপ্লিকেশনকে অনুমতি দেয়। ব্যবহারকারীর শংসাপত্র যাচাই করার পরে, Google পরবর্তী API অনুরোধগুলিতে উল্লেখ করার জন্য একটি প্রমাণীকরণ টোকেন ইস্যু করে। টোকেনটি নির্দিষ্ট সময়ের জন্য বৈধ থাকে, আপনি যেকোন Google পরিষেবার সাথে কাজ করছেন তার দ্বারা সংজ্ঞায়িত করা হয়। নিরাপত্তার কারণে এবং আপনার ব্যবহারকারীদের সর্বোত্তম অভিজ্ঞতা প্রদানের জন্য, ইনস্টল করা, ডেস্কটপ অ্যাপ্লিকেশন তৈরি করার সময় আপনার কেবলমাত্র ClientLogin ব্যবহার করা উচিত। ওয়েব অ্যাপ্লিকেশনের জন্য, AuthSub বা OAuth ব্যবহার করা পছন্দনীয়৷

রুবি লাইব্রেরিতে প্রতিটি API-এর জন্য একটি ক্লায়েন্ট ক্লাস রয়েছে। উদাহরণ স্বরূপ, user@gmail.com ডকুমেন্ট লিস্ট ডেটা API-তে লগ ইন করতে নিম্নলিখিত কোড স্নিপেটটি ব্যবহার করুন:

client = GData::Client::DocList.new
client
.clientlogin('user@gmail.com', 'pa$$word')

The YouTube Data API would be:

client = GData::Client::YouTube.new
client
.clientlogin('user@gmail.com', 'pa$$word')

বাস্তবায়িত পরিষেবা ক্লাসের সম্পূর্ণ তালিকা দেখুন। যদি একটি পরিষেবার একটি ক্লায়েন্ট ক্লাস না থাকে, GData::Client::Base ক্লাস ব্যবহার করুন। উদাহরণ হিসাবে, নিম্নলিখিত কোড ব্যবহারকারীদের একটি G Suite অ্যাকাউন্ট দিয়ে লগ ইন করতে বাধ্য করে।

client_login_handler = GData::Auth::ClientLogin.new('writely', :account_type => 'HOSTED')
token
= client_login_handler.get_token('user@example.com', 'pa$$word', 'google-RailsArticleSample-v1')
client
= GData::Client::Base.new(:auth_handler => client_login_handler)

দ্রষ্টব্য : ডিফল্টরূপে, লাইব্রেরি accountType জন্য HOSTED_OR_GOOGLE ব্যবহার করে। সম্ভাব্য মানগুলি হল HOSTED_OR_GOOGLE , HOSTED , বা GOOGLE

ClientLogin ব্যবহার করার একটি খারাপ দিক হল যে আপনার অ্যাপ্লিকেশনটি ব্যর্থ লগইন প্রচেষ্টায় ক্যাপচা চ্যালেঞ্জ পাঠানো যেতে পারে। যদি তা হয়, তাহলে আপনি clientlogin() পদ্ধতিতে কল করে এর অতিরিক্ত প্যারামিটার সহ ত্রুটিটি পরিচালনা করতে পারেন: client.clientlogin(username, password, captcha_token, captcha_answer) । ক্যাপচাগুলির সাথে ডিল করার বিষয়ে আরও তথ্যের জন্য ইনস্টল করা অ্যাপ্লিকেশন ডকুমেন্টেশনের জন্য সম্পূর্ণ প্রমাণীকরণ পড়ুন।

AuthSub

AuthSubRequest URL তৈরি করা হচ্ছে

scope = 'http://www.google.com/calendar/feeds/'
next_url
= 'http://example.com/change/to/your/app'
secure
= false  # set secure = true for signed AuthSub requests
sess
= true
authsub_link
= GData::Auth::AuthSub.get_url(next_url, scope, secure, sess)

কোডের পূর্ববর্তী ব্লক authsub_link এ নিম্নলিখিত URL তৈরি করে:

https://www.google.com/accounts/AuthSubRequest?next=http%3A%2F%2Fexample.com%2Fchange%2Fto%2Fyour%2Fapp&scope=http%3A%2F%2Fwww.google.com%2Fcalendar%2Ffeeds%2F&session=1&secure=0

আপনি ক্লায়েন্ট অবজেক্টের authsub_url পদ্ধতিও ব্যবহার করতে পারেন। প্রতিটি পরিষেবা ক্লাস একটি ডিফল্ট authsub_scope বৈশিষ্ট্য সেট করেছে তাই আপনার নিজের নির্দিষ্ট করার কোন প্রয়োজন নেই।

client = GData::Client::DocList.new
next_url
= 'http://example.com/change/to/your/app'
secure
= false  # set secure = true for signed AuthSub requests
sess
= true
domain
= 'example.com'  # force users to login to a G Suite hosted domain
authsub_link
= client.authsub_url(next_url, secure, sess, domain)

কোডের পূর্ববর্তী ব্লক নিম্নলিখিত URL তৈরি করে:

https://www.google.com/accounts/AuthSubRequest?next=http%3A%2F%2Fexample.com%2Fchange%2Fto%2Fyour%2Fapp&scope=http%3A%2F%2Fdocs.google.com%2Ffeeds%2F&session=1&secure=0&hd=example.com

একটি একক-ব্যবহারের টোকেন একটি সেশন টোকেনে আপগ্রেড করা

AuthSub ব্যবহারকারীকে তাদের ডেটাতে অ্যাক্সেস দেওয়ার পরে http://example.com/change/to/your/app?token=SINGLE_USE_TOKEN এ পুনঃনির্দেশ করবে৷ লক্ষ্য করুন যে URLটি আমাদের next_url মাত্র একটি ক্যোয়ারী প্যারামিটার হিসাবে একক-ব্যবহারের টোকেন যুক্ত।

এরপরে, দীর্ঘস্থায়ী সেশন টোকেনের জন্য একক-ব্যবহারের টোকেন বিনিময় করুন:

client.authsub_token = params[:token] # extract the single-use token from the URL query params
session
[:token] = client.auth_handler.upgrade()
client
.authsub_token = session[:token] if session[:token]

নিরাপদ AuthSub খুব অনুরূপ. একমাত্র সংযোজন হল টোকেন আপগ্রেড করার আগে আপনার ব্যক্তিগত কী সেট করা:

PRIVATE_KEY = '/path/to/private_key.pem'

client
.authsub_token = params[:token]
client
.authsub_private_key = PRIVATE_KEY
session
[:token] = client.auth_handler.upgrade()
client
.authsub_token = session[:token] if session[:token]

দ্রষ্টব্য : সুরক্ষিত টোকেন ব্যবহার করতে, একটি একক-ব্যবহারের টোকেন অনুরোধ করার সময় secure=true সেট করতে ভুলবেন না। উপরে AuthSubRequest URL তৈরি করা দেখুন।

টোকেন ব্যবস্থাপনা

AuthSub টোকেন পরিচালনার জন্য দুটি অতিরিক্ত হ্যান্ডলার, AuthSubTokenInfo এবং AuthSubRevokeToken প্রদান করে। AuthSubTokenInfo একটি টোকেনের বৈধতা পরীক্ষা করার জন্য দরকারী। AuthSubRevokeToken ব্যবহারকারীদের তাদের ডেটা অ্যাক্সেস বন্ধ করার বিকল্প দেয়। আপনার অ্যাপকে AuthSubRevokeToken ব্যবহার করা উচিত একটি সেরা অনুশীলন হিসাবে। উভয় পদ্ধতিই রুবি লাইব্রেরিতে সমর্থিত।

একটি টোকেনের মেটাডেটা জিজ্ঞাসা করতে:

client.auth_handler.info

একটি সেশন টোকেন প্রত্যাহার করতে:

client.auth_handler.revoke

AuthSub-এ সম্পূর্ণ স্কুপের জন্য ওয়েব অ্যাপ্লিকেশন ডকুমেন্টেশনের জন্য সম্পূর্ণ AuthSub প্রমাণীকরণ দেখুন।

OAuth

এই নিবন্ধটি লেখার সময়, GData::Auth মডিউলে OAuth যোগ করা হয়নি।

Rails oauth-plugin বা Ruby oauth gem ব্যবহার করার সময় ইউটিলিটি লাইব্রেরিতে OAuth ব্যবহার করা তুলনামূলকভাবে সহজ হওয়া উচিত। উভয় ক্ষেত্রেই, আপনি একটি GData::HTTP::Request অবজেক্ট তৈরি করতে চাইবেন এবং প্রতিটি লাইব্রেরি দ্বারা উত্পন্ন Authorization শিরোনামটি পাস করতে হবে।

ফিড অ্যাক্সেস করা হচ্ছে

GET (ডেটা আনা)

একবার আপনি একটি ক্লায়েন্ট অবজেক্ট সেটআপ করার পরে, একটি Google ডেটা ফিড জিজ্ঞাসা করতে এটির get() পদ্ধতি ব্যবহার করুন। XPath নির্দিষ্ট পরমাণু উপাদান পুনরুদ্ধার করতে ব্যবহার করা যেতে পারে। এখানে একজন ব্যবহারকারীর Google নথি পুনরুদ্ধার করার একটি উদাহরণ রয়েছে:

feed = client.get('http://docs.google.com/feeds/documents/private/full').to_xml

feed
.elements.each('entry') do |entry|
  puts
'title: ' + entry.elements['title'].text
  puts
'type: ' + entry.elements['category'].attribute('label').value
  puts
'updated: ' + entry.elements['updated'].text
  puts
'id: ' + entry.elements['id'].text
 
 
# Extract the href value from each <atom:link>
  links
= {}
  entry
.elements.each('link') do |link|
    links
[link.attribute('rel').value] = link.attribute('href').value
 
end
  puts links
.to_s
end

পোস্ট (নতুন ডেটা তৈরি করা)

সার্ভারে নতুন ডেটা তৈরি করতে একটি ক্লায়েন্টের post() পদ্ধতি ব্যবহার করুন। নিম্নলিখিত উদাহরণটি new_writer@example.com id সহ নথিতে সহযোগী হিসেবে যোগ করবে: doc_id

# Return documents the authenticated user owns
feed
= client.get('http://docs.google.com/feeds/documents/private/full/-/mine').to_xml
entry
= feed.elements['entry']  # first <atom:entry>

acl_entry
= <<-EOF
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gAcl='http://schemas.google.com/acl/2007'>
 
<category scheme='http://schemas.google.com/g/2005#kind'
    term
='http://schemas.google.com/acl/2007#accessRule'/>
 
<gAcl:role value='writer'/>
 
<gAcl:scope type='user' value='new_writer@example.com'/>
</entry>
EOF

# Regex the document id out from the full <atom:id>.
# http:/
/docs.google.com/feeds/documents/private/full/document%3Adfrk14g25fdsdwf -> document%3Adfrk14g25fdsdwf
doc_id
= entry.elements['id'].text[/full\/(.*%3[aA].*)$/, 1]
response
= client.post("http://docs.google.com/feeds/acl/private/full/#{doc_id}", acl_entry)

PUT (ডেটা আপডেট করা)

সার্ভারে ডেটা আপডেট করতে, একটি ক্লায়েন্টের put() পদ্ধতি ব্যবহার করুন। নিম্নলিখিত উদাহরণটি একটি নথির শিরোনাম আপডেট করবে। এটি অনুমান করে যে আপনার একটি পূর্ববর্তী ক্যোয়ারী থেকে একটি ফিড আছে।

entry = feed.elements['entry'] # first <atom:entry>

# Update the document's title
entry
.elements['title'].text = 'Updated title'
entry
.add_namespace('http://www.w3.org/2005/Atom')
entry
.add_namespace('gd','http://schemas.google.com/g/2005')

edit_uri
= entry.elements["link[@rel='edit']"].attributes['href']
response
= client.put(edit_uri, entry.to_s)

মুছে ফেলা

সার্ভার থেকে একটি <atom:entry> বা অন্যান্য ডেটা মুছে ফেলতে, delete() পদ্ধতি ব্যবহার করুন। নিম্নলিখিত উদাহরণটি একটি নথি মুছে ফেলবে। কোডটি অনুমান করে যে আপনার একটি পূর্ববর্তী ক্যোয়ারী থেকে একটি নথি এন্ট্রি আছে।

entry = feed.elements['entry'] # first <atom:entry>
edit_uri
= entry.elements["link[@rel='edit']"].attributes['href']
client
.headers['If-Match'] = entry.attribute('etag').value  # make sure we don't nuke another client's updates
client
.delete(edit_uri)

একটি নতুন রেল অ্যাপ্লিকেশন তৈরি করা হচ্ছে

সাধারণত একটি নতুন Rails অ্যাপ তৈরির প্রথম অনুশীলনে আপনার MVC ফাইলগুলি তৈরি করতে স্ক্যাফোল্ড জেনারেটর চালানো জড়িত। এর পরে, এটি আপনার ডাটাবেস টেবিল সেট আপ করতে rake db:migrate চলছে। যাইহোক, যেহেতু আমাদের অ্যাপ্লিকেশনটি ডেটার জন্য Google ডকুমেন্ট লিস্ট API-কে জিজ্ঞাসা করবে, তাই আমাদের জেনেরিক ভারা বা ডাটাবেসের খুব কম প্রয়োজন নেই। পরিবর্তে, একটি নতুন অ্যাপ্লিকেশন এবং সাধারণ নিয়ামক তৈরি করুন:

rails doclist
cd doclist
ruby script
/generate controller doclist

এবং config/environment.rb এ নিম্নলিখিত পরিবর্তনগুলি করুন:

config.frameworks -= [ :active_record, :active_resource, :action_mailer ]
config
.gem 'gdata', :lib => 'gdata'

প্রথম লাইনটি অ্যাপ্লিকেশান থেকে ActiveRecord আনহুক করে। দ্বিতীয় লাইন স্টার্টআপে gdata রত্ন লোড করে।

অবশেষে, আমি DoclistControllerdocuments অ্যাকশনে ডিফল্ট রুট (' / ') সংযোগ করতে বেছে নিয়েছি। config/routes.rb এ এই লাইনটি যোগ করুন:

map.root :controller => 'doclist', :action => 'all'

একটি নিয়ামক শুরু করুন

যেহেতু আমরা স্ক্যাফোল্ডিং তৈরি করিনি, তাই app/controllers/doclist_controller.rbDoclistController এ ম্যানুয়ালি ' all ' নামে একটি অ্যাকশন যোগ করুন।

class DoclistController < ApplicationController
 
def all
   
@foo = 'I pity the foo!'
 
end
end

এবং app/views/doclist/ এর অধীনে all.html.erb তৈরি করুন :

<%= @foo %>

ওয়েব সার্ভার ফায়ার করুন এবং বিকাশ শুরু করুন

আপনি এখন ruby script/server ব্যবহার করে ডিফল্ট ওয়েব সার্ভার শুরু করতে সক্ষম হবেন। সব ঠিক থাকলে, আপনার ব্রাউজারকে http://localhost:3000/ নির্দেশ করা উচিত ' I pity the foo! '

টিপ : public/index.html সরাতে বা পুনঃনামকরণ করতে ভুলবেন না।

একবার আপনার কাজ হয়ে গেলে, ডকলিস্ট ম্যানেজার প্রকল্পের মাংসের জন্য আমার চূড়ান্ত DoclistController এবং ApplicationController একবার দেখুন। আপনি ContactsController এও দেখতে চাইবেন, যা Google Contacts API-তে কলগুলি পরিচালনা করে।

উপসংহার

একটি Google ডেটা রেল অ্যাপ তৈরির সবচেয়ে কঠিন অংশ হল রেল কনফিগার করা! যাইহোক, একটি বন্ধ সেকেন্ড আপনার অ্যাপ্লিকেশন স্থাপন করা হয়. এর জন্য, আমি অ্যাপাচির জন্য mod_rails সুপারিশ করছি। এটি সেটআপ করা, ইনস্টল করা এবং চালানো খুব সহজ। আপনি কিছু সময়ের মধ্যে আপ এবং চলমান হবে!

সম্পদ

পরিশিষ্ট

উদাহরণ

ডকলিস্ট ম্যানেজার হল একটি সম্পূর্ণ রুবি অন রেল নমুনা যা এই নিবন্ধে আলোচিত বিষয়গুলি প্রদর্শন করে৷ সম্পূর্ণ সোর্স কোড প্রজেক্ট হোস্টিং থেকে পাওয়া যায়।

ClientLogin ব্যবহার করে ব্যবহারকারীর Google ডকুমেন্টের তালিকা পুনরুদ্ধার করুন।

#!/usr/bin/ruby

require 'rubygems'
require 'gdata'
require 'highline/import'

def user_input(prompt='> ', echo=true)
  ask
(prompt) {|q| q.echo = echo}
end

email
= user_input('email: ')
pass = user_input('password: ', false)

client
= GData::Client::DocList.new({:source => 'google-RailsArticleSample-v1'})
client
.clientlogin(email, pass)

feed
= client.get(client.authsub_scope + 'documents/private/full').to_xml

puts
'Listing all documents: --------------------'
feed
.elements.each('entry') do |entry|
  puts
'title: ' + entry.elements['title'].text
  puts
'type: ' + entry.elements['category'].attribute('label').value
  puts
'updated: ' + entry.elements['updated'].text
  puts
'id: ' + entry.elements['id'].text[/%3[aA](.*)$/, 1]
  puts
end

ডকুমেন্ট লিস্ট, পরিচিতি এবং স্প্রেডশীট API ব্যবহার করে ম্যাশআপ করুন। এই উদাহরণটি RoR-এ নিরাপদ AuthSub ব্যবহার করে দেখায়।

require 'gdata'

class YourController < ApplicationController
  before_filter
:authenticate_client

  PRIVATE_KEY
= '/path/to/private_key.pem'
  DOCLIST_SCOPE
= 'http://docs.google.com/feeds/'
  CONTACTS_SCOPE
= 'http://www.google.com/m8/feeds/'
  SPREADSHEETS_SCOPE
= 'http://spreadsheets.google.com/feeds/'

 
def authenticate_client
    scopes
= [DOCLIST_SCOPE, SPREADSHEETS_SCOPE, CONTACTS_SCOPE]
   
@client = GData::Client::Base.new({:authsub_scope => scopes.join(' '),
                                       
:source => 'google-RailsArticleSample-v1'})

   
if params[:token].nil? and session[:token].nil?
      next_url
= url_for :controller => self.controller_name, :action => self.action_name
      secure
= true
     
@authsub_link = @client.authsub_url(next_url, secure, true)
      render
:controller => 'your_controller', :action => 'your_action'
   
elsif params[:token] and session[:token].nil?
     
@client.authsub_token = params[:token]
     
@client.authsub_private_key = PRIVATE_KEY
      session
[:token] = @client.auth_handler.upgrade()
   
end

   
if session[:token]
     
@client.authsub_token = session[:token]
     
@client.authsub_private_key = PRIVATE_KEY  # Make sure to set your private key for subsequent requests
   
end
 
end

 
def get_docs
   
@feed = @client.get(@client.authsub_scope + 'documents/private/full').to_xml
 
end
end

একটি AuthSub টোকেন ব্যবহার করে YouTube-এ একটি প্লেলিস্ট তৈরি করা, সম্পাদনা করা এবং মুছে ফেলা।

#!/usr/bin/ruby

require 'rubygems'
require 'gdata'

yt = GData::Client::YouTube.new({:source => 'google-RailsArticleSample-v1'})
yt.authsub_token = 'SESSION_TOKEN'
yt.client_id = 'CLIENT_ID'
yt.developer_key = 'DEVELOPER_KEY'

# 1.) Creating a new playlist
entry = <<-EOF
<entry xmlns="http://www.w3.org/2005/Atom"
    xmlns:yt="http://gdata.youtube.com/schemas/2007">
  <title type="text">Ruby Utility Unit Test</title>
  <summary>This is a test playlist.</summary>
</entry>
EOF

response = yt.post('http://gdata.youtube.com/feeds/api/users/default/playlists', entry).to_xml

# 2.) Updating the received playlist
edit_uri = response.elements["link[@rel='edit']"].attributes['href']
response.elements['summary'].text = 'Updated description'

response = yt.put(edit_uri, response.to_s).to_xml

# 3.) Deleting the playlist
yt.delete(edit_uri)

আপনি যদি আমার মতো হন এবং কিছুক্ষণের মধ্যে রেল ব্যবহার না করে থাকেন তবে এখানে মনে রাখার মতো কমান্ডগুলির একটি তালিকা রয়েছে৷

আপনার RubyGem ইনস্টলেশন আপডেট করুন
sudo gem update --system
ইনস্টল করা রত্ন আপডেট করুন
sudo gem update
db হিসাবে MySQL দিয়ে একটি নতুন রেল তৈরি করুন
rails -d mysql APP_NAME
অন্য পোর্টে উৎপাদনে সার্ভার শুরু করুন
ruby script/server -p PORT -e production
আপনার লগ ফাইল সাফ করুন
rake log:clear