Получаване на „недефинирана партида от методи“ за API на Google Directory със сервизен акаунт

Затова пиша скрипт за групово изтриване на потребители от домейн на Google Apps for Education. Кодът изглежда така:

#! /usr/bin/env ruby
require 'google/api_client'
require 'csv'

service_account_email = '[email protected]'
key_file = 'key.p12'
key_secret = 'notasecret'
admin_email = 'XXX@xxx'

# Build the API Client object
client = Google::APIClient.new(
  :application_name => 'XXX',
  :application_version => '0.1'
)
key = Google::APIClient::KeyUtils.load_from_pkcs12(key_file, key_secret)
client.authorization = Signet::OAuth2::Client.new(
  :token_credential_uri => 'https://accounts.google.com/o/oauth2/token',
  :audience => 'https://accounts.google.com/o/oauth2/token',
  :scope => 'https://www.googleapis.com/auth/admin.directory.user',
  :issuer => service_account_email,
  :signing_key => key,
  :person => admin_email,
)
client.authorization.fetch_access_token!
directory = client.discovered_api('admin', 'directory_v1')

# Reads and parses CSV input into a hash
# Takes file path as an argument
def import_csv(file)
  csv = CSV.new(
    File.open(file).read,
    :headers => true,
    :header_converters => :symbol
  )

  return csv.to_a.map {|row| row.to_hash}
end

users_to_delete = import_csv('accounts.csv')

puts 'Preparing to delete users...'

users_to_delete.each_slice(1000) do |chunk|  
  directory.batch do |directory|
    chunk.each do |user|
      client.execute!(
        :api_method => directory.users.delete,
        :parameters => { :userKey => user[:emailaddress].downcase }
      )
    end
  end
end

puts 'Users successfully deleted!'

Когато стартирам скрипта без двата външни пакетни блока, скриптът работи перфектно (макар и невероятно бавно).

Това, което искам да знам, е какво трябва да променя, за да спра да ми дава грешката на недефинирания метод в метода „партида“ за API на директорията. В примери в документацията на Google забелязах, че те извикват API по различен начин (zoo = Google::Apis::ZooV1::ZooService.new вместо zoo = client.discovered_api('zoo', 'v1')). Не виждам обаче как това ще промени нещата.


person Community    schedule 24.07.2015    source източник


Отговори (1)


Можете да го постигнете по следния начин:

client = Google::APIClient.new(
 :application_name => 'XXX',
 :application_version => '0.1'

)

directory = client.discovered_api('admin', 'directory_v1')
batch = Google::APIClient::BatchRequest.new do |result|
 puts result.data
end
batch.add(:api_method => directory.users.delete,:parameters => { :userKey =>       user[:emailaddress].downcase })
client.execute(batch)
person Aravind Raju    schedule 15.12.2015