Bot

ライブラリを使用しないおうむ返しbotの作成について

goodwork_25c804

2024.09.25既読 216

先日@kunihiros様の記事( 

https://qiita.com/kunihiros/items/4cdec5784f21598cfee0
 )を参考にさせていただき、LINE WORKSのbotを作成いたしました。
そして、この度、上記記事のアレンジとして、上記記事で提供していただいているライブラリを使用せずに、botを作成しようと試みました。
しかしながら、ライブラリを使用してのbotはうまく機能したものの、ライブラリをなくし、自前でコードを作成した時、botの返信がなくなってしまいました。
以下のようなコードを書きましたが、機能しなかったので、修正点などがあれば、ご教授願えると、非常に助かります。
各情報はスクリプト プロパティーから取得するようにしてあります。

// 1. JWTを生成する関数
function getJwt(config) {
const time = Date.now();
const header = Utilities.base64Encode(JSON.stringify({ 'alg': 'RS256', 'typ': 'JWT' }));
const claimSet = Utilities.base64Encode(JSON.stringify({
'iss': config.CLIENT_ID,
'sub': config.SERVICE_ACCOUNT,
'iat': Math.floor(time / 1000),
'exp': Math.floor(time / 1000 + 3600)
}));
const signature = Utilities.base64Encode(Utilities.computeRsaSha256Signature(`${header}.${claimSet}`, config.PRIVATE_KEY));
return `${header}.${claimSet}.${signature}`;
}

// 2. Access Tokenを取得する関数
function getAccessToken(config) {
const jwt = getJwt(config);
const endpoint = 'https://auth.worksmobile.com/oauth2/v2.0/token';
const options = {
method: 'post',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
payload: {
'assertion': jwt,
'grant_type': 'urn:ietf:params:oauth:grant-type:jwt-bearer',
'client_id': config.CLIENT_ID,
'client_secret': config.CLIENT_SECRET,
'scope': config.SCOPE
}
};
return JSON.parse(UrlFetchApp.fetch(endpoint, options));
}

// 3. メッセージを送信する関数
function sendMessage(config, channelId, message) {
const accessToken = getAccessToken(config).access_token;
const url = `https://www.worksapis.com/v1.0/bots/id/channels/${channelId}/messages`;

const options = {
method: 'post',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
payload: JSON.stringify({
'content': {
'type': 'text',
'text': message
}
})
};

// メッセージをLINE WORKSに送信
const response = UrlFetchApp.fetch(url, options);
Logger.log("Message Send Response: " + response.getContentText());
return response.getContentText();
}

// 4. メッセージ受信時に処理を行うdoPost関数
function doPost(e) {
if (e == null || e.postData == null || e.postData.contents == null) return;

// リクエストデータを取得
let requestJSON = e.postData.contents;
let requestObj = JSON.parse(requestJSON);

//おうむ返し
let text = requestObj.content.text;

// 環境変数を取得
let config = getEnv_();
// ユーザーのチャンネルIDを取得
let channelId = requestObj.source.userId; // これはユーザーIDとして扱っています

// LINE WORKSにメッセージを送信
sendMessage(config, channelId, text);
}

// 5. 環境変数を取得する関数
function getEnv_() {
let scriptProperties = PropertiesService.getScriptProperties();
return {
CLIENT_ID: scriptProperties.getProperty('client_id'),
CLIENT_SECRET: scriptProperties.getProperty('client_secret'),
SERVICE_ACCOUNT: scriptProperties.getProperty('service_account'),
PRIVATE_KEY: scriptProperties.getProperty('private_key'),
SCOPE: 'bot' , // bot操作用のスコープ
DOMAIN_ID: scriptProperties.getProperty('domain_id'), // domain_idをスクリプトプロパティから取得
ADMIN_ID: scriptProperties.getProperty('admin_id'), // admin_idをスクリプトプロパティから取得
BOT_ID: scriptProperties.getProperty('bot_id') // bot_idをスクリプトプロパティから取得
};
}


コメント1

  • 업데이트 된 답글입니다.

    repoMK

    GASのdoPost()はログ出力が出来ないので
    どこでエラーしているのか確認するために
    tryでエラー発生時に、スプレッドシート等にログを吐き出すようなコードを入れるか

    もしくは
    doPost()自体をエディタでテスト出来るように
    イベントオブジェクト自体を手動で作成してテストしてみるといいかと思います。


    massageのイベントオブジェクトの例
    https://developers.worksmobile.com/jp/docs/bot-callback

    function doPost_test() {
         const e = {
              postData: {
                   contents: {
                                "type": "message",
                                "source": { "userId": userID, "domainId": domainId},
                                "issuedTime": new Date().toISOString(),
                                "content": {"type": "text","text": text, "postback": postback}
                           },
              },
         };
         doPost(e);
    }



    ちなみに、chatGPTに聞いてみたところ

     //おうむ返し
     let text = requestObj.content.text​​;

    の部分(文末のt → ; の間に)に
    Zero Width Spaceが含まれていて、エラーの原因になっているかも知れないので
    一度消して、手打ちしてみたほうがいいかもです。

    2024.11.03

    0
前の投稿Botからメッセージ送信したFlexible Templateにおいて、太字としたspan要素がモバイル版で正しく表示されない
次の投稿HRMOS勤怠でLINEWORKSと連携させたいが、LINEWORKS V2の連携ができていないと表示
リスト

まだ、解決できませんか?
今すぐ実際に使用しているLINE WORKSユーザーに質問してみましょう。