受験・進路の相談を承ります(クリックorタップ)

グループ内の送信取り消しを復元できるLINE Botを作った

趣味・Tips

諸々の事情で公開はしてません。

機能としては、あるグループ内で送信取り消しイベントが起きた場合にそのメッセージを復元するといったものです。

友だち追加の必要はなく、グループ内にそのアカウントを置いておくだけで機能します。

 

プログラミングよく分からんので、おかしなこと書いてたら是非指摘お願いします。

動作はこんな感じ

あるグループ内にこのアカウントを置いておくだけで、そのグループ内の送信取り消しを復元してくれます。

中身

const CHANNEL_ACCESS_TOKEN = "ここにアクセストークンを入れる";
const cache=CacheService.getUserCache();

function doPost(e) {
  let contents = e.postData.contents;
  let obj = JSON.parse(contents);
  let events = obj["events"];
  let userType=events[0].type
  if (userType == "unsend") {
    reply_message(events[0]);
  } else if (userType == "message") {
    cache.put(events[0].message.id,events[0].message.text)//メッセージidをkey、メッセージ内容をvalueで保存
  }
}

function reply_message(e) {
  let m=cache.get(e.unsend.messageId) //events[0]のunsend.messageIdから元のメッセージを呼び出す
  //(events[0].unsend.messageIdとevents[0].message.idはメッセージ内容が同じなら同じ)
  if (m==null){
    ;
  }else{   
  let postData = {
    "to": e.source.groupId, //トークルームのルームid
    "messages":[
        {"type":"text",
         "text":getUserName(e.source.groupId,e.source.userId)+"さんの取り消したメッセージ→"+"「"+m+"」",
        }
    ]
  }
  fetch_data_push(postData);
  }
}

//グループメンバーのプロフィール情報を取得する(友だち追加の必要なし)
function getUserName(groupId,userId) {
  let url = `https://api.line.me/v2/bot/group/`+groupId+`/member/`+userId;
  let response = UrlFetchApp.fetch(url, {
    headers: {
      "Content-Type": "application/json; charset=UTF-8",
      Authorization: "Bearer " + CHANNEL_ACCESS_TOKEN,
    },
  });
  return JSON.parse(response.getContentText()).displayName;
}

//pushなのでurlはmessage/replyではなくmessage/push
function fetch_data_push(postData) {
  let options = {
    "method": "post",
    "headers": {
      "Content-Type": "application/json",
      "Authorization": "Bearer " + CHANNEL_ACCESS_TOKEN
    },
    "payload": JSON.stringify(postData)
  };
  UrlFetchApp.fetch("https://api.line.me/v2/bot/message/push", options);
}

LINEの送信取り消しイベントを触ってみたかっただけということもあり、大変簡易的な作りです。

その点も含め、いくつかの注意点を以下に書きます。

注意点

GASのCacheService

中身の2行目にCacheService.getUserCache()というのがあります。

別にこれを使う必要性はないです。ただGAS内だけで完結させたかったのでこれを使っただけです。

 

これは一時的に値を保持(今回はユーザーのメッセージ)しておくためのものなのですが、これは値の保持時間がMAX6時間です。

LINEの送信取り消しはメッセージ送信後24時間まで可能なので、例えば7時間後に送信取り消しされたら復元してくれません\(^o^)/

 

ですので、ちゃんとやるなら外部のサービスを使わなきゃダメです、という一応の補足。

メッセージはreplyではなくpushで送る

ここが一番の問題です。

中身を見ていただくと、一番最後の行がmessage/pushになっていますね。

 

LINEは相手のメッセージに対してreplyTokenが発行され、それを使ってBotで自動的にreplyで反応することができます。

 

しかし、送信取り消しイベントではreplyTokenが発行されないので、replyを使えません(間違ってたら誰か教えて)。

仕方なくpushを用いるわけですが、無課金ユーザーの場合月1000件までしかpush送信できません(2023年5月現在)。

 

送信取り消しイベントを用いて何かを作るにしても、ここがネックになるかと思います。

 

終わり

groupIdを用いることで、友だち追加無しでグループ内の任意の人の送信取り消しを復元することができました。

色々やってみたのですが、groupIdの値をいじれば、例えばAというグループで取り消したメッセージをBというグループに送れたりもします。

 

まぁ使い道は謎。でもできることの幅は大きそう。

コメント

タイトルとURLをコピーしました