Perl で Salesforce

藤原 俊一郎 <fujiwara@cpan.org>

自己紹介

トピックメーカー 勤務

CPAN, github, twitter: fujiwara

はてな: sfujiwara

Salesforce とは

CRM をクラウドで提供する

昔 ASP

今 SAAS == Software as a Service

こんな画面

PAAS?

Platform as a Service

クラウド上に独自のアプリケーションを構築

Custom Object
RDB のようなテーブル
APEX code
Java のような言語

Force.com Sites

エンドユーザ向けの公開サイトが作れる

2009年6月リリース

https://eco-points.secure.force.com/WebFormInput2

↑共用 SSL のみ (今のところ)

独自 SSL でやりたい

普通にサイトを立てる

SOAP API で Salesforce と接続

Perl で API を叩く

旺文社 えいごであそぼ http://eigodeasobo.com/
購入申し込みフォーム https://eigodeasobo.com/form...
       User
         |
         | HTTPS
         |
[ eigodeasobo.com ]
         |
         | SOAP over HTTPS
         |
 (( Salesforce ))

Perl から API を使う

WWW::Salesforce 以外は 2006 年以降更新なし

login()

use WWW::Salesforce;
$sf = WWW::Salesforce->login(
    username => $user,
    password => $password . $token,
);

create()

$response = $sf->create(
    type         => "Person__c",
    firstName__c => "Shunichiro",
    lastName__c  => "Fujiwara",
);
$result = $response->valueof("//createResponse/result");
{
  success => 'true',
  id      => 'a0270000005C01VAAS',
}

retrieve()

$response = $sf->retrieve(
    type   => "Person__c",
    fields => "Id, firstName__c, lastName__c",
    ids    => [ "a0270000005C01VAAS" ],
);
$result = $response->valueof("//retrieveResponse/result");
bless( {
  Id => [ 'a0270000005C01VAAS', 'a0270000005C01VAAS' ],
  type         => 'Person__c',
  firstName__c => 'Shunichiro',
  lastName__c  => 'Fujiwara',
}, 'sObject' );

update(), delete()

Key Value Store?

No!

SOQL

SQL に似た問い合わせ言語

query()

$soql = "SELECT
           firstName__c, lastName__c
           Company__r.Name
         FROM Person__c
         WHERE lastName__c='Fujiwara'";
$response = $sf->query( query => $soql );
@records  = $response->valueof(
    "//queryResponse/result/records"
);

bless( {
  type         => 'Person__c',
  firstName__c => 'Shunichiro',
  lastName__c  => 'Fujiwara',
  Company__r'  => bless( {
    Name => 'Topicmaker',
    type => 'Company__c'
  }, 'sObject' ),
}, 'sObject' );

参照項目で JOIN

ハマりどころ

ユーザ定義オブジェクトは型を明示

WWW::Salesforce::Constants->register_type(
    "Person__c", "firstName__c", "xsd:string",
);

API 回数制限と速度

接続を使いまわす

login() 結果にセッションID

シリアライズ可能

cache して使いまわす

接続確認しない

$sf->getServerTimestamp()

成功しても次は??

無駄なのでやらない

一度に複数レコードを扱う

retrieve( ids => \@id )

upsert()

  • 存在すれば update
  • 存在しなければ create

cache する

すべてのオブジェクトに unique id

query() で取得できる上限

  • 2000件
  • queryMore() で「さっきの続き」
$response = $sf->query( query => $soql );
$locator  = $response->valueof("//queryLocator");
$sf->queryMore( queryLocator => $locator );

安定性

  • サーバはアメリカ
  • 時々繋がらない

更新は job queue で

TheSchwartz, Q4M, Q4Pg::Lite etc...

計画メンテナンスへの対処

24時間 365日無停止 ではない

月1回程度、数時間停止

まとめ

  • Salesforce は API で Perl から使える
  • RDB 風に扱える
  • 運用で頑張る><

ご清聴ありがとうございました