f17: twist api で 新規スレッド投稿

.
---
ビジネス向けコミュニケーションツール
「typetalk」 を利用して

メール受信をトリガーに api 経由で、
「typetalk」 の トピック (チャンネル) へメッセージ送信

ということを行っていたのですが、
2025年12月1日 に サービスを終了する
ということになったそうで、
代替策として 「twist」 の api を試してみました

その設定メモです

こちらの方が、
twist api を用いた記事を書いております
(golang + outgoing ですね)

TwistのchatbotをGoで作ってみた
https://qiita.com/usk81/items/bfd15ec3c5ecc23d0b8f

今回は、python + incoming による
「twist」 のスレッドへの新規投稿 を試してみました

---
### **[ 00. メニュー ]**

**01.キッチン**
**02.仕込み (api token の発行)**
**03.味見 (python で実行)**
**04.デザート**

---
### **[ 01. キッチン ]**

　**・ インターネットがつながっている python 実行環境**
　　**-> windows 10 + Python 3.8.1**

　**・ Twist の ID 登録**
　　**https://twist.com/login?lang=ja**

---
### **[ 02. 仕込み (api token の発行) ]**

twist に web でログイン後、
Integration Management
https://twist.com/app_console
へ遷移します

![twist05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298080/626a1504-25d8-d366-0dd4-76580f35958f.jpeg)

![twist07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298080/ee486469-1f52-1a7f-1ad6-141c661c72be.jpeg)

「create a new app」 ボタン押下し、
「Create Integration」 ページにて
・Integration type: General integration
・Integration name: (例: test-hook)
を設定し 「Create integration」 ボタン押下にて、
api token が発行されます

![twist08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298080/db3fcd76-8eb2-a50d-239e-595f051d95e3.jpeg)

![twist09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298080/1c218def-1867-889f-2246-ba9ad35ba6fe.jpeg)

※ 使用する token は 「OAuth 2 test token」 です

※ 最初何も考えず 「verification token」 を使用して
invalid token が返ってきて、ハマってしまいました

「OAuth 2 test token」 の下の
説明にもありますが、この token は
お手軽に様々なスコープにアクセスできますのでお試しに便利です

しっかりと運用する場合は、Client ID / Client secret などを
使用して OAuth2 したほうがよさそうです

api token 発行後、上部の Home のリンクで戻ると、
作成された integration [ 例: test-hook ] が表示されます

![twist11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298080/1b050e6e-f44f-de7d-cbb6-9a1c8ac78d43.jpeg)

---
### **[ 03. 味見 (python で実行) ]**

twist のリファレンスにある curl サンプルを基に
python requests に書き換えます

Add thread
https://developer.twist.com/v3/#add-thread

```bash:
curl -X POST https://api.twist.com/api/v3/threads/add \
  -H "Authorization: Bearer 0123456789abcdef0123456789abcdef01234567" \
  -d channel_id=6984 \
  -d recipients=[10000, 10001] \
  -d title=Thread1
```

　・チャンネル ID (channel_id) は、チャンネルページの URL にあります
　https://twist.com/a/987654/ch/123456/
　-> ID:123456

　・受信者 (recipients) は、色々設定できますが、EVERYONE にすると
　チャンネルのすべてのメンバーに通知されます


```python:add_thread.py

# -*- coding: utf-8 -*-

import requests

# =============================

def new_thread(url2, token2, channel2, recipient2, title2, comment2):

	heads = {
	    'Authorization': 'Bearer ' + token2,
	    'Content-Type': 'application/x-www-form-urlencoded',
	}

	datas = {
	    'channel_id': channel2,
	    'recipients': recipient2,
	    'title': title2,
	    'content': comment2,
	}

	req = requests.post(url2, headers=heads, data=datas)

	# raise_for_status や try/except キャッチなどはお好みで
	if req.status_code == 200:
		print('to post is ok !')
	else:
		print(f'to post is NG')
		print(f'status code: {req.status_code}, responses: {req.text}')

# =============================

if __name__ == '__main__':

	url1 = 'https://api.twist.com/api/v3/threads/add'
	token1 = 'oauth2:abcdefghijklmnopqrstuvwxyz'
	channel1 = '123456'
	recipient1 = 'EVERYONE'
	title1 = 'テスト壱'

	comment1 = 'twist の スレッドへ' + '\n' \
	+ '新規投稿を行います‎'

	new_thread(url1, token1, channel1, recipient1, title1, comment1)

# ==============================

```

これで、twist の スレッド へ新規投稿され、
twist web, twist アプリ などで確認ができます

![twist12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/298080/64620de2-648a-cd48-1f10-0fb56a368924.jpeg)

---
### **[ 04. デザート ]**


ちなみに、新規スレッド投稿 ではなく、
すでに存在しているスレッド内へのコメント投稿 のサンプルはこちらです

Add comment
https://developer.twist.com/v3/#add-comment

```bash:
curl -X POST https://api.twist.com/api/v3/comments/add \
  -H "Authorization: Bearer 0123456789abcdef0123456789abcdef01234567" \
  -d thread_id=32038 \
  -d recipients=[10000, 10001] \
  -d content="OK!"
```

スレッド ID (thread_id) も URL から
https://twist.com/a/987654/ch/123456/t/223322/
-> ID:223322
となり、新規投稿 と同じような感じで 
python でも スレッド内投稿できます

twist のスレッドは、シンプルで分かりやすくていいですね

---
.