書き捨てのスクリプトなどでSFDXからjsforceのコネクションを持ってくる方法。
調査
sfdx plugins:generate
が吐くクラスが @salesforce/command
の SfdxCommand クラスを継承し、
this.org.getConnection()
でコネクションを取得してるのでそこから追った。
- @salesforce/command
this.org = await Org.create({
aliasOrUsername: this.flags.targetusername,
aggregator: this.configAggregator
});
if (this.flags.apiversion) {
this.org.getConnection().setApiVersion(this.flags.apiversion);
}
となっているのでこれがOrgオブジェクトの生成して、その直後にコネクションは取得可能っぽい。
ファイルの先頭で
import { ConfigAggregator, Global, Logger, Messages, Mode, Org, SfdxError, SfdxProject } from '@salesforce/core';
してるので@salesforce/core
をインポートして Org.create().getConnection()で取得できる。
- @salesforce/core
取得
$npm i -D jsforce @types/jsforce @salesforce/core @salesforce/ts-types
import { Connection } from "jsforce";
import { Org } from "@salesforce/core";
(async () => {
const org = await Org.create({
aliasOrUsername: null,
aggregator: null
});
const conn = org.getConnection() as any as Connection;
})();
取得したアクセストークンでPuppeteerからログイン
import * as puppeteer from "puppeteer";
import { Org } from "@salesforce/core";
(async () => {
const org = await Org.create({});
const conn = org.getConnection();
// const browser = await puppeteer.launch();
const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
const retURL = encodeURIComponent(`/lightning/o/Account/new`);
const url = `${conn.instanceUrl}/secur/frontdoor.jsp?sid=${conn.accessToken}&retURL=${retURL}`;
await page.goto(url);
await page.waitFor(5e3);
await page.screenshot({ path: "screenshot.png" });
await browser.close();
})();