TwexAPI で X エンゲージメントワークフローを作る方法
エンゲージメント自動化を「成長スイッチ」として扱うと、すぐに制御不能になります。本番で使えるフローは、承認済みコンテンツ、固定された予算、サービスごとの数量制限、追跡できる注文記録から始まります。
TwexAPI の POST /twitter/action はキャンペーンキューの後ろに置くのに向いています。service、link、quantity を送信し、返された order_id を保存し、GET /twitter/action/order-status で配送状態を確認します。これにより、エンゲージメント操作をスクリプトログではなく、予算、承認、リトライ、レポートのシステムに入れられます。
ワークフローの境界
ワークフローの境界 とは、所有、許可、または承認済みのプロモーション対象だけに注文型のエンゲージメント処理を使うことです。これは編集判断、キャンペーン承認、プラットフォームルール、内部予算制限を置き換えるものではありません。
開始前に次のルールを固定します。
- 所有または承認済みコンテンツ:許可されたアカウントとコンテンツだけを対象にする。
- 公開対象:対象ツイートまたはアカウントは公開状態を保つ。
- 予算上限:キャンペーン、サービス、対象 URL ごとに上限を設定し、無制限送信を防ぐ。
- 監査ログ:対象 URL、サービス、数量、担当者、キャンペーン、レスポンス、
order_idを保存する。 - 停止条件:コンテンツ削除、アカウント状態変化、注文失敗、キャンペーン状況変化があれば後続注文を止める。
API フロー
API フロー とは、先にエンゲージメント注文を送信し、その後で注文状態を確認することです。送信エンドポイントは order_id を返し、状態エンドポイントは進捗、費用、開始時カウント、現在状態を返します。
| ステップ | エンドポイント | 用途 |
|---|---|---|
| 1 | POST /twitter/action | likes、retweets、views、bookmarks、followers の注文を送信 |
| 2 | GET /twitter/action/order-status?order_id=... | pending、in_progress、completed、partial、failed を確認 |
リクエストは Bearer Token を使います。
Authorization: Bearer <your_token>
Content-Type: application/json送信前にサービスと数量を検証します。
| サービス | 数量範囲 | 対象 |
|---|---|---|
likes | 10 から 5000 | ツイート URL |
retweets | 10 から 500 | ツイート URL |
views | 100 から 9999999 | ツイート URL |
bookmarks | 10 から 5000 | ツイート URL |
followers | 10 から 30000 | アカウントまたは Profile URL |
Python の例:注文送信と追跡
Python の例 とは、サーバー側のキャンペーンキューです。計画を検証し、注文を送信し、order_id を保存し、最後に注文状態を確認します。本番では、運用画面から無制限に API を呼ばせるのではなく、承認済みキューから送信するべきです。
1import requests
2import time
3from datetime import datetime, timezone
4
5API_BASE = "https://api.twexapi.io"
6TOKEN = "YOUR_TWEXAPI_BEARER_TOKEN"
7
8SERVICE_LIMITS = {
9 "likes": (10, 5000),
10 "retweets": (10, 500),
11 "views": (100, 9999999),
12 "bookmarks": (10, 5000),
13 "followers": (10, 30000),
14}
15
16def headers():
17 return {
18 "Authorization": f"Bearer {TOKEN}",
19 "Accept": "application/json",
20 "Content-Type": "application/json"
21 }
22
23def validate_order(order):
24 service = order["service"]
25 quantity = int(order["quantity"])
26
27 if service not in SERVICE_LIMITS:
28 raise ValueError(f"Unsupported service: {service}")
29
30 min_qty, max_qty = SERVICE_LIMITS[service]
31 if quantity < min_qty or quantity > max_qty:
32 raise ValueError(f"{service} quantity must be between {min_qty} and {max_qty}")
33
34 if not order["link"].startswith(("https://x.com/", "https://twitter.com/")):
35 raise ValueError("link must be a full X/Twitter URL")
36
37def submit_order(order, campaign_id, requested_by):
38 validate_order(order)
39
40 response = requests.post(
41 API_BASE + "/twitter/action",
42 headers=headers(),
43 json={
44 "service": order["service"],
45 "link": order["link"],
46 "quantity": int(order["quantity"]),
47 },
48 timeout=30,
49 )
50 response.raise_for_status()
51 payload = response.json()
52
53 if payload.get("code", 200) >= 400:
54 raise RuntimeError(payload.get("msg", "TwexAPI returned an error"))
55
56 return {
57 "campaign_id": campaign_id,
58 "requested_by": requested_by,
59 "service": order["service"],
60 "link": order["link"],
61 "quantity": int(order["quantity"]),
62 "order_id": payload["data"]["order_id"],
63 "submitted_at": datetime.now(timezone.utc).isoformat(),
64 "raw_response": payload,
65 }
66
67def get_order_status(order_id):
68 response = requests.get(
69 API_BASE + "/twitter/action/order-status",
70 headers=headers(),
71 params={"order_id": order_id},
72 timeout=30,
73 )
74 response.raise_for_status()
75 payload = response.json()
76
77 if payload.get("code", 200) >= 400:
78 raise RuntimeError(payload.get("msg", "TwexAPI returned an error"))
79
80 return payload["data"]
81
82campaign_orders = [
83 {"service": "views", "link": "https://x.com/yourbrand/status/123456789", "quantity": 5000},
84 {"service": "likes", "link": "https://x.com/yourbrand/status/123456789", "quantity": 100},
85]
86
87submitted = []
88for order in campaign_orders:
89 submitted_order = submit_order(order, campaign_id="launch-2026-04", requested_by="growth_ops")
90 submitted.append(submitted_order)
91 print("submitted", submitted_order["order_id"], submitted_order["service"])
92 time.sleep(2)
93
94for item in submitted:
95 status = get_order_status(item["order_id"])
96 print(item["order_id"], status.get("status"), status)状態値がタスクシステムに入ったら、pending と in_progress は監視を継続し、completed はキャンペーンレビューへ、partial は人間の判断へ、failed は同じ対象の後続注文を止める証拠として扱います。
検索シグナルと組み合わせる
検索シグナルと組み合わせる とは、注文前に検索、リプライ、トレンドデータを見て、対象コンテンツが配信に値するか判断することです。エンゲージメント操作は明確なキャンペーン目的に従うべきで、すべてのトレンドを対象にしてはいけません。
- 発見:Advanced Search で領域内の活発な会話を見つける。
- 作成:話題に合った有用な投稿または返信を公開する。
- 承認:対象 URL、サービス、数量、予算、責任者、停止条件を確認する。
- 送信:
POST /twitter/actionを呼び、order_idと原始レスポンスを保存する。 - 追跡:注文状態を同期し、完了、部分完了、失敗をレビューする。
これにより、自動化が編集判断に従い、すべてのトレンドを自動でプロモーション対象にする状態を避けられます。
予算と監査フィールド
予算と監査フィールド とは、各注文について「なぜ送信したか、誰が承認したか、どれだけ注文したか、今どの状態か」を説明できるようにすることです。
| 管理フィールド | 重要な理由 |
|---|---|
| キャンペーン ID | 各アクションをローンチや実験に紐づける |
| 対象 URL | 誤った投稿への注文を防ぐ |
| サービスと数量 | 予算とペースを確認できる |
| 担当者またはジョブ ID | 誰が、またはどの処理が開始したかを残す |
order_id | 状態確認、照合、レビューの主キー |
| 状態履歴 | pending、in_progress、completed、partial、failed を分ける |
| 原始レスポンス | リトライ、サポート、監査の証拠を残す |
エラー処理と停止条件
エラー処理と停止条件 とは、API エラー、注文失敗、業務リスクを分けて扱うことです。1 つの注文が失敗したからといって無限にリトライせず、ローカルリクエストがタイムアウトしただけで注文が作成されていないと決めつけないでください。
- 送信前の失敗:API を呼ぶ前にサービス、数量、URL を検証する。
- 送信後のタイムアウト:まずローカルに
order_idがあるか確認し、作成証拠がない場合だけ再試行を検討する。 - 注文失敗:失敗状態と原始レスポンスを保存し、同じ対象の後続注文を停止する。
- 部分完了:自動補充せず、キャンペーン目標と予算がまだ有効かを確認する。
- コンテンツ状態変化:対象が削除、非公開、キャンセルされた場合は後続送信を止める。
まとめ
まとめ とは、X エンゲージメント自動化を単発スクリプトではなくキャンペーン注文システムとして扱うことです。承認済みコンテンツを選び、サービスと数量を検証し、/twitter/action で注文を送信し、order_id を保存し、/twitter/action/order-status で配送状態を追跡します。TwexAPI は API 層を提供し、承認、予算、ログ、停止ルールがワークフローを安定させます。