在語音應用開發中,技能內購買(In-skill Purchasing,ISP)功能日益重要,它讓開發者能提供更豐富的內容和服務,同時創造收益。本文將深入探討 Alexa ISP 的實作細節,包含如何使用 Python 和 Monetization Service API 取得產品資訊、過濾已購買產品、將產品資訊轉換為語音輸出等關鍵步驟,並以一個笑話技能為例,說明如何整合 ISP 功能,提升使用者經驗和商業價值。同時,我們也將探討如何處理購買請求、管理使用者庫存,以及在技能開發過程中需要注意的測試和認證流程,確保技能的穩定性和安全性。
ExecuteCommandsDirective
ExecuteCommandsDirective 用於執行一系列指令。它需要一個 token 和 commands 作為引數。
token: 一個唯一的識別符號,用於識別指令。commands: 一個指令列表,每個指令都是一個字典。
在這個例子中,指令列表包含了一個 SpeakItem 指令,它會語音播放 oddFactText 元素的內容。
10.1 簡介
在這個章節中,我們將探討如何擴充套件您的技能以新增內建購買(In-skill Purchasing, ISP)功能,從而可能為您帶來收入。您可以提供具有不同付款模式的內建產品,包括一次性購買、消耗品和訂閱。
10.2 建立內建購買技能
我們將建立一個技能,允許使用者購買更多笑話。首先,建立一個自定義的Alexa主機技能(Custom > Alexa-hosted > From scratch)。然後,新增內建購買支援到您的技能中。點選“Build”>“Models”>“Monetize your skill”,然後選擇“Add in-skill products”。您將看到三種內建購買選項:一次性購買、消耗品和訂閱。
10.3 存取內建購買程式碼
要存取內建購買程式碼,您需要建立一個新的檔案,例如joke.py,並插入笑話程式碼。您可以在軟體的第10章中找到完整的程式碼。以下是joke.py檔案的簡短版本:
import random
內容解密:
這段程式碼匯入了random模組,該模組將用於生成隨機笑話。
10.4 內建購買流程
要實作內建購買,您需要更新您的互動模型以包含自定義意圖,以支援使用者對購買或退款的請求。然後,您需要新增程式碼來處理購買請求並使用您的產品。您需要取得使用者有資格購買的產品清單,然後將購買請求傳遞給Amazon的購買流程。
圖表翻譯:
flowchart TD
A[使用者請求購買] --> B[取得產品清單]
B --> C[傳遞購買請求給Amazon]
C --> D[更新使用者庫存]
D --> E[保持追蹤已購買專案]
圖表解說:
這個流程圖顯示了內建購買的流程。首先,使用者請求購買某個產品。然後,系統取得使用者有資格購買的產品清單。接下來,系統將購買請求傳遞給Amazon的購買流程。然後,系統更新使用者的庫存並保持追蹤已購買的專案。
10.5 測試和認證
在您的技能上線之前,您需要測試您的技能並獲得認證。您可以檢視您的技能的購買記錄以及收益和付款情況。
程式碼範例:
import boto3
# 初始化Amazon的購買流程
purchase_flow = boto3.client('purchase_flow')
# 取得使用者有資格購買的產品清單
products = purchase_flow.get_products()
# 將購買請求傳遞給Amazon的購買流程
purchase_flow.purchase_product(products[0])
內容解密:
這段程式碼初始化了Amazon的購買流程,取得了使用者有資格購買的產品清單,並將購買請求傳遞給Amazon的購買流程。
使用 Alexa 和 Raspberry Pi 開發語音控制 IoT 應用程式
在這個範例中,我們將使用 Alexa 和 Raspberry Pi 來開發一個語音控制的 IoT 應用程式。這個應用程式將可以提供免費和付費的笑話給使用者。
笑話函式
首先,我們需要定義兩個函式,分別用於提供免費和付費的笑話。以下是這兩個函式的程式碼:
import random
def free_jokes():
jokes = [
"I was awake all night wondering where the sun went, but then it dawned on me",
"What's brown and sticky? A stick."
]
rand_no = random.randint(0, len(jokes) - 1)
return jokes[rand_no]
def paid_jokes():
jokes = [
"I'm reading a book about anti-gravity. I can't put it down.",
"What do you call it when one cow spies on another? A steak out!"
]
rand_no = random.randint(0, len(jokes) - 1)
return jokes[rand_no]
Lambda 函式
接下來,我們需要修改 lambda_function.py 檔案,以便使用這兩個函式。以下是修改後的程式碼:
import joke
#...
def lambda_handler(event, context):
#...
speak_output = joke.free_jokes()
#...
佈署和測試
佈署和測試這個應用程式之前,我們需要修改 HelloWorldIntentHandler 類別,以便使用 session 屬性來檢查是否有付費笑話的存取權。以下是修改後的程式碼:
class HelloWorldIntentHandler(AbstractRequestHandler):
"""Handler for Hello World Intent."""
def can_handle(self, handler_input):
# type: (HandlerInput) -> bool
return ask_utils.is_intent_name("HelloWorldIntent")(handler_input)
def handle(self, handler_input):
# type: (HandlerInput) -> Response
speak_output = "Here's a free joke: " + joke.free_jokes()
session_attr = handler_input.attributes_manager.session_attributes
if "paid_jokes" in session_attr:
if session_attr["paid_jokes"] == True:
speak_output = "Here's your paid joke: " + joke.paid_jokes()
return (
handler_input.response_builder
.speak(speak_output)
.ask("What can I buy?")
.response
)
圖表翻譯:
flowchart TD
A[使用者請求] --> B[檢查 session 屬性]
B --> C{是否有付費笑話存取權}
C -->|True| D[提供付費笑話]
C -->|False| E[提供免費笑話]
D --> F[回應使用者]
E --> F
內容解密:
在這個範例中,我們使用了兩個函式,分別用於提供免費和付費的笑話。這兩個函式使用 random 模組來選擇一個隨機的笑話。然後,我們修改了 lambda_function.py 檔案,以便使用這兩個函式。最後,我們修改了 HelloWorldIntentHandler 類別,以便使用 session 屬性來檢查是否有付費笑話的存取權。
第10章:Alexa In-skill Purchasing (ISP)
在本章中,我們將探討如何使用Alexa In-skill Purchasing (ISP)實作技能內購買。這是一個強大的功能,允許使用者在技能內購買商品或服務。
10.4 取得技能內產品、取得其資訊和購買
要實作技能內購買,我們需要新增一個API客戶端。首先,讓我們修改requirements.txt檔案,新增以下行:
boto3==1.9.216
ask-sdk-core==1.11.0
接下來,讓我們修改程式碼,將sb = SkillBuilder()改為sb = StandardSkillBuilder()。然後,新增以下匯入陳述式:
from ask_sdk.standard import StandardSkillBuilder
from ask_sdk_model.services.monetization import (
EntitledState, PurchasableState, InSkillProductsResponse, Error,
InSkillProduct)
from ask_sdk_model.interfaces.monetization.v1 import PurchaseResult
from ask_sdk_model import Response, IntentRequest
現在,讓我們在程式碼頂部新增以下函式,這些函式將在稍後使用:
def get_in_skill_products(handler_input):
# 取得技能內產品
pass
def get_in_skill_product_info(handler_input, product_id):
# 取得技能內產品資訊
pass
def purchase_in_skill_product(handler_input, product_id):
# 購買技能內產品
pass
這些函式將用於取得技能內產品、取得其資訊和購買。接下來,我們將實作這些函式。
內容解密:
上述程式碼修改了requirements.txt檔案,增加了必要的函式庫。然後,修改了程式碼,將SkillBuilder改為StandardSkillBuilder。接下來,增加了匯入陳述式和函式宣告。這些函式將用於實作技能內購買的功能。
圖表翻譯:
flowchart TD
A[開始] --> B[修改requirements.txt]
B --> C[修改程式碼]
C --> D[新增匯入陳述式]
D --> E[新增函式宣告]
E --> F[實作技能內購買]
這個流程圖展示了實作技能內購買的步驟。首先,修改requirements.txt檔案,新增必要的函式庫。然後,修改程式碼,將SkillBuilder改為StandardSkillBuilder。接下來,新增匯入陳述式和函式宣告。最後,實作技能內購買的功能。
圖表解釋:
這個流程圖展示了實作技能內購買的步驟。首先,修改requirements.txt檔案,新增必要的函式庫。然後,修改程式碼,將SkillBuilder改為StandardSkillBuilder。接下來,新增匯入陳述式和函式宣告。這些函式將用於實作技能內購買的功能。最後,實作技能內購買的功能。
程式碼解釋:
上述程式碼修改了requirements.txt檔案,增加了必要的函式庫。然後,修改了程式碼,將SkillBuilder改為StandardSkillBuilder。接下來,增加了匯入陳述式和函式宣告。這些函式將用於實作技能內購買的功能。
在未來的發展中,我們可以進一步擴充套件技能內購買的功能。例如,可以新增更多的支付方式、最佳化購買流程等。同時,也可以考慮新增更多的安全措施,以保護使用者的隱私和支付資訊。
Alexa 技術深入分析:In-skill Purchasing (ISP) 的實踐與應用
什麼是 In-skill Purchasing (ISP)?
In-skill Purchasing (ISP) 是 Amazon Alexa 提供的一種功能,允許使用者在技能(Skill)內購買商品或服務。這項功能使得技能開發者可以提供更多樣化的內容和服務給使用者,並且可以透過購買獲得收入。
如何實作 In-skill Purchasing (ISP)?
要實作 In-skill Purchasing (ISP),需要使用 Amazon 的 Monetization Service API。以下是一個簡單的範例,展示如何使用 Python 取得 In-skill 產品列表:
def get_in_skill_product_response(handler_input):
"""
取得 In-skill 產品列表。
"""
locale = handler_input.request_envelope.request.locale
ms = handler_input.service_client_factory.get_monetization_service()
return ms.get_in_skill_products(locale)
這個函式使用 handler_input 物件來取得使用者的語言和地區設定,然後使用 MonetizationService 來取得 In-skill 產品列表。
如何過濾 Entitled 產品?
Entitled 產品是指使用者已經購買或具有許可權的產品。要過濾 Entitled 產品,可以使用以下函式:
def get_all_entitled_products(in_skill_product_list):
"""
取得 Entitled 產品列表。
"""
entitled_product_list = [l for l in in_skill_product_list if l.entitled == EntitledState.ENTITLED]
return entitled_product_list
這個函式使用 list comprehension 來過濾 Entitled 產品,並傳回一個新的列表。
如何將產品列表轉換為可語音的形式?
要將產品列表轉換為可語音的形式,可以使用以下函式:
def get_speakable_list_of_products(entitled_products_list):
"""
將產品列表轉換為可語音的形式。
"""
product_names = [item.name for item in entitled_products_list]
if len(product_names) > 1:
speech = " 和 ".join([", ".join(product_names[:-1]), product_names[-1]])
else:
speech = ", ".join(product_names)
return speech
這個函式使用 list comprehension 來取得產品名稱,並使用 join 函式來將名稱串接成一個可語音的字串。
實踐與應用
In-skill Purchasing (ISP) 可以應用於各種技能中,例如遊戲、教育、娛樂等。透過提供更多樣化的內容和服務,技能開發者可以增加使用者的參與度和滿意度,並且可以透過購買獲得收入。
例如,一個叫做「Johns joke skill」的技能,可以提供一系列的笑話和遊戲,使用者可以透過 In-skill Purchasing (ISP) 來購買更多的笑話或遊戲內容。技能開發者可以使用以上的函式來實作 In-skill Purchasing (ISP) 功能,並提供一個更好的使用者經驗。
圖表翻譯:
graph LR
A[使用者] -->|購買|> B[In-skill 產品]
B -->| Entitled |> C[Entitled 產品列表]
C -->|過濾|> D[可語音的產品列表]
D -->|語音輸出|> E[使用者]
這個圖表展示了 In-skill Purchasing (ISP) 的流程,從使用者購買 In-skill 產品到語音輸出。
從商業價值視角來看,整合In-skill Purchasing (ISP) 功能為Alexa技能開啟了全新的營利模式。深入剖析ISP的技術架構,可以發現它涵蓋了產品管理、購買流程、權益驗證等關鍵環節。透過多維度效能指標的實測分析,ISP展現了良好的交易效率和使用者經驗。然而,技術限制深析也顯示,開發者需要妥善處理跨平臺相容性、安全性以及在地化支付等挑戰。對於重視長期營利的技能開發者,匯入ISP並非僅是技術整合,更需考量產品策略、價格定位以及使用者生命週期價值等商業要素。從技術演進角度,ISP將持續最佳化支付體驗和產品管理功能,並與更多Alexa服務深度整合。玄貓認為,ISP代表了語音應用商業化的重要方向,值得開發者投入資源並深入探索其商業潛力。