/slack-unfurler

SlackのUnfurlをやってみる。

Primary LanguageGo

slack-unfurler

SlackのURL展開をgoでやってみた。

対応

  • 秋月電子
  • Twitter
    • APIから取得を試み、失敗すると埋め込みTweetから引用を試みます。

起動方法

  1. SlackのAppを作成
  2. Socket-modeを有効にする(まだWebhookは作ってないので)
  3. Event Subscriptionsで「App unfurl domains」を選んでよしなにドメインを追加
    1. Twitter videoを展開する場合は、twitter.com/x.comだけでなくvideo.twimg.comも追加する。
    2. その上で、環境変数UNFURL_TWITTER_VIDEOに何かしらの値を設定。
  4. OAuth & PermissionsでBot Tokenに links:write を追加
    1. links:readは「App unfurl domains」した際に追加されるっぽい。
    2. Twitter Videoを展開する場合はlinks.embed:writeも必要。忘れると展開時にcannot_parse_attachmentと出る。
  5. 環境変数 SLACK_BOT_TOKENSLACK_APP_TOKEN によしなにトークンを設定する。
  6. Twitter APIで展開する場合は以下の設定を追加
    1. ブラウザでログインした際にCookieへセットされたauth_tokenをいくつか取得してTWITTER_AUTH_TOKENS_FROM_BROWSERにカンマ区切りで設定する。
      1. この値は1年間有効の模様。
      2. 念のために日頃使ってるアカウントの値は使わないほうがいいでしょう。
    2. TWITTER_GUEST_API_IDTWITTER_LOGIN_API_IDを設定
      1. 非ログイン状態でTweetを表示する際TweetResultByRestIdを呼び出すURIのうちID部分をTWITTER_GUEST_API_IDに設定
        1. https://twitter.com/i/api/graphql/0hWvDhmW8YQ-S_ib3azIrw/TweetResultByRestId?variables(以下略)のとき0hWvDhmW8YQ-S_ib3azIrwの部分
      2. ログイン状態でユーザプロファイルを表示する際にUserByScreenNameを呼び出すURIのうちID部分をTWITTER_LOGIN_API_IDに設定
        1. https://twitter.com/i/api/graphql/G3KGOASz96M-Qu0nwmGXNg/UserByScreenName(以下略)のとき、G3KGOASz96M-Qu0nwmGXNgの部分
      3. どうやら時々変わる様子。
    3. API呼び出しでの展開に失敗する場合 or 設定がない場合は埋め込みTweet展開を試します。このときNSFW Tweetは展開できません。
  7. 起動

展開情報のキャッシュについて

参照元の負荷を下げるため、LRUで128件キャッシュします。

Tweet展開について

Twitterの展開は、埋め込みTweetを取得する方法とAPI経由する方法の2つを使っています。それぞれpros/consがあるので、お好みに応じて設定してください。

埋め込みTweetを取得

  • pros
    • token不要
    • 複数の動画が添付されたTweetに対応
  • cons
    • NSFW Tweet非対応
      • 全く存在しないものとする扱いをする
      • NSFW TweetをQTしたTweetを展開する場合も、QTしたNSFW Tweetが全く存在しないとみなすので存在すらわからない。

API経由

  • pros
    • NSFW Tweet対応
    • RT数も取れる
      • 現状は展開していません
  • cons
    • auth_tokenが必要
    • rate limitがある

参考文献

Unfurling links in messages

言語

go 1.20

todo

  • webhook

License

MIT

Author

walkure at 3pf.jp