针对高风险的流失用户,您可以通过短信的方式进行召回。本文介绍如何创建短信发送计划。

前提条件

  • 已获取阿里云账号的鉴权AccessKey ID和AccessKey Secret,详情请参见获取AccessKey
  • 已完成签名的注册及短信模板的创建,详情请参见准备工作:开通短信模板
  • 已通过新用户流失召回解决方案获取了高风险流失用户,详情请参见新用户流失召回
  • 如果您通过API创建短信发送计划,则需要完成用户增长插件SDK的安装。用户增长插件提供了Python、Golang及Java SDK,您可以根据实际情况选择,安装方法分别参考如下链接:

操作流程

用户增长插件支持通过控制台或API两种方式进行操作,您可以结合使用习惯进行选择。此外,创建短信发送计划时,系统支持将MaxCompute表或CSV文件作为数据源。不同种方式创建短信发送计划的操作流程如下:
  • 通过控制台操作
  • 通过API操作
    • 从MaxCompute表创建短信发送计划
      1. MaxCompute授权

        需要为MaxCompute的成员ALIYUN$fpga_at_ali授权读取表数据权限。

      2. 通过API创建短信发送计划

        用户增长插件提供了Python、Java、Golang三种语言的API,您可以根据实际情况选择。

    • 从CSV文件创建短信发送计划
      1. OSS授权

        需要为阿里云账号283230116493255736进行OSS授权。

      2. 通过API创建短信发送计划

        用户增长插件提供了Python、Java、Golang三种语言的API,您可以根据实际情况选择。

MaxCompute授权

如果您通过MaxCompute表添加目标号码相关信息,则在创建短信发送计划之前需要为MaxCompute的成员ALIYUN$fpga_at_ali授权。

您可以通过MaxCompute客户端或DataWorks数据开发中的ODPS SQL节点为MaxCompute授权,本文仅以MaxCompute客户端为例,介绍如何为MaxCompute授权。

  1. 安装并配置MaxCompute客户端
    说明 需要使用具有项目管理员权限的账号登录。
  2. 运行MaxCompute客户端
  3. 在MaxCompute客户端环境中,添加ALIYUN$fpga_at_ali成员,并为其授权。
    1. 添加阿里云账号fpga_at_ali。
      add user `ALIYUN$fpga_at_ali`;
    2. 确认成员是否添加成功。
      list users;
    3. 为成员授予读取MaxCompute表数据的权限。
      grant Select ON TABLE <table> to user `ALIYUN$fpga_at_ali`;
      其中<table>需要替换为存储目标号码相关信息的MaxCompute表名。

OSS授权

如果您通过API创建短信发送计划,且使用CSV文件添加目标号码相关信息,则在创建短信发送计划之前需要为阿里云账号283230116493255736进行OSS授权。授权的具体方法如下。

  1. 进入OSS Bucket详情页面。
    1. 使用管理员账号登录OSS管理控制台
    2. 在左侧导航栏,单击Bucket列表
    3. Bucket列表页面,单击待授权的OSS Bucket名称。
  2. 单击权限管理 > Bucket授权策略 > 设置
  3. 图形设置页签,单击新增授权
  4. 新增授权面板,配置如下参数(此处仅介绍核心参数的配置方法,关于参数的详细说明请参见方式一:图形化配置Bucket Policy)。
    参数 描述
    授权资源 授权整个Bucket或Bucket内的部分资源供其他用户访问:
    • 整个Bucket:授权策略针对整个Bucket生效。
    • 指定资源:授权策略只针对指定的资源生效。您可以配置多条针对指定资源的授权策略。
      • 针对目录级别授权

        授权访问目录下的所有子目录和文件时,需在目录结尾处加上星号(*)。例如授权访问abc目录下的所有子目录和文件,则填写为abc/*

      • 针对指定文件授权

        授权访问目录下的指定文件时,需填写不包含Bucket名称在内的文件的完整路径,例如授权访问abc目录下的myphoto.png文件,则填写为abc/myphoto.png

    授权用户 选中其他账号复选框,在下方文本框中输入283230116493255736,表示将资源授权给该用户。
    授权操作 选中简单设置,再选中读/写,表示对相关资源有读和写权限。
    条件(可选) 无需配置。
  5. 单击确定

通过控制台创建短信发送计划

  1. 进入用户增长插件页面。
    1. 登录PAI控制台
    2. 在左侧导航栏,选择AI行业插件 > 用户增长插件
  2. 进入添加发布计划页面。
    1. 用户增长插件页面,单击用户触达配置页签。
    2. 用户触达配置页签下,单击发布计划页签。
    3. 单击添加发布计划添加发布计划
  3. 添加发布计划页面,配置参数。
    添加发布计划
    参数 描述
    发布计划名称 长度2~30个字符。
    签名选择 选择已经注册的签名。
    模板选择 选择已经创建的模板。
    人群圈选 支持以下数据源:
    • 使用MaxCompute分区

      采用项目名.表名的格式指定MaxCompute表。如果您的表是分区表,则需要使用MaxCompute的分区表达式。例如dt='20200101' AND name = 'test'

      说明 通过MaxCompute表创建短信发送计划时,需要先为MaxCompute授权,详情请参见MaxCompute授权
    • 导入CSV文件的方式增加本地号码
      您需要注意CSV文件的内容格式:
      • 如果仅配置发送号码,则需要上传不带header的CSV文件。文件将按行解析为号码,目前仅支持国内号码段。示例如下。
        183xxxxxxxx
        138xxxxxxxx
      • 如果发送带参数的模板,则需要添加header行以区分号码字段和自定义模板变量字段,默认以第一列为号码字段。示例如下。
        phone,api,sex
        183xxxxxxxx,aG1xn,先生
        138xxxxxxxx,b43Op,女士
      说明
      • 请保持导入文件的变量顺序和模板的变量顺序一致,并严格遵守示例的样式。
      • CSV文件大小不能超过3 MB ,建议单次导入号码50万个以内。
    日期选择 短信的发送时间需要配置在当前时间一小时后到一年的区间内。
  4. 单击提交

通过API创建短信发送计划

用户增长插件提供了Python、Java、Go三种语言的API,您可以根据实际情况选择。通过三种语言API创建短信发送计划的示例如下所示:
  • Python
    安装用户增长插件(paiplugin)的Python SDK,详情请参见alibabacloud-python-sdk。通过API创建短信发送计划的示例如下:
    • 从MaxCompute创建发送计划
      from alibabacloud_paiplugin20210325 import client 
      from alibabacloud_paiplugin20210325 import models
      from alibabacloud_tea_openapi import models as open_api_models
      
      c = client.Client(
          open_api_models.Config(
              access_key_id="<yourAccessKeyId>",
              access_key_secret="<yourAccessKeySecret>",
              endpoint="paiplugin.cn-hangzhou.aliyuncs.com"
          )
      )
      
      # 从MaxCompute创建发送计划。
      req = models.CreateScheduleRequest(
          data_address="odps-project/odps-table",
          partition="dt='20200101' AND name='test'",
          data_source=0,
          name="流程测试",
          send_time="2021-01-01 18:00:00",
        phone_number_column="phone_number",
          signature_id="<yourSignatureId>",
          template_id="<yourTemplateId>",
      )
      rsp = c.create_schedule(req)
      print(rsp.body.data)
      参数详情请参见下文表 1,您需要将参数值替换为实际值。
    • 从CSV文件创建发送计划
      from alibabacloud_paiplugin20210325 import client 
      from alibabacloud_paiplugin20210325 import models
      from alibabacloud_tea_openapi import models as open_api_models
      c = client.Client(
          open_api_models.Config(
              access_key_id="<yourAccessKeyId>",
              access_key_secret="<yourAccessKeySecret>",
              endpoint="paiplugin.cn-hangzhou.aliyuncs.com"
          )
      )
      
      # 从CSV文件创建发送计划。
      req = models.CreateScheduleRequest(
          data_address="https://bucket.endpoint/path/to/file",
          data_source=1,
          name="流程测试",
          send_time="2021-01-01 18:00:00",
          signature_id="<signature_id>",
          template_id="<template_id>",
      )
      rsp = c.create_schedule(req)
      print(rsp.body.data)
      参数详情请参见下文表 1,您需要将参数值替换为实际值。
  • Golang
    安装用户增长插件(paiplugin)的Golang SDK,详情请参见Golang SDK。通过API创建短信发送计划的示例如下:
    • 从MaxCompute创建发送计划
      package main
      
      import (
          "fmt"
      
          openapi "github.com/alibabacloud-go/darabonba-openapi/client"
          "github.com/alibabacloud-go/paiplugin-20210325/client"
      )
      
      func main() {
          accessKeyId := "<yourAccessKeyId>"
          accessKeySecret := "<yourAccessKeySecret>"
          endpoint := "paiplugin.cn-hangzhou.aliyuncs.com"
          config := openapi.Config{
              AccessKeyId:     &accessKeyId,
              AccessKeySecret: &accessKeySecret,
              Endpoint:        &endpoint,
          }
          c, err := client.NewClient(&config)
          if err != nil {
              panic(fmt.Errorf("Failed to create client %w", err))
          }
        
      
        // 从MaxCompute创建发送计划。
        req6 := client.CreateSchedule{
          DataAddress="project/table",
          Partition="dt='20200101' AND name = 'test'",
          DataSource=0,
          Name="流程测试",
          SendTime="2021-01-01 18:00:00",
          PhoneNumberColumn="phone_number",
          SignatureId="<yourSignatureId>",
          TemplateId="<yourTemplateId>",
        }
          rsp6, err := c.CrateSchedule(&req6)
          if err != nil {
              fmt.Printf("Failed to create schedule %w", err)
          }
          fmt.Println(rsp6.Body.Data)
        
      }
      参数详情请参见下文表 1,您需要将参数值替换为实际值。
    • 从CSV文件创建发送计划
      package main
      
      import (
          "fmt"
      
          openapi "github.com/alibabacloud-go/darabonba-openapi/client"
          "github.com/alibabacloud-go/paiplugin-20210325/client"
      )
      
      func main() {
          accessKeyId := "<yourAccessKeyId>"
          accessKeySecret := "<yourAccessKeySecret>"
          endpoint := "paiplugin.cn-hangzhou.aliyuncs.com"
          config := openapi.Config{
              AccessKeyId:     &accessKeyId,
              AccessKeySecret: &accessKeySecret,
              Endpoint:        &endpoint,
          }
          c, err := client.NewClient(&config)
          if err != nil {
              panic(fmt.Errorf("Failed to create client %w", err))
          }
        
        
        // 从CSV文件创建发送计划。
        req5 := client.CreateSchedule{
          DataAddress="https://bucket.endpoint/path/to/file",
          DataSource=1,
          Name="流程测试",
          SendTime="2021-01-01 18:00:00",
          SignatureId="<yourSignatureId>",
          TemplateId="<yourTemplateId>",
        }
          rsp5, err := c.CrateSchedule(&req5)
          if err != nil {
              fmt.Printf("Failed to create schedule %w", err)
          }
          fmt.Println(rsp5.Body.Data)    
      }
      参数详情请参见下文表 1,您需要将参数值替换为实际值。
  • Java
    使用Java API时,需要使用Maven管理项目。因此,您必须在pom.xml文件中添加所需的依赖包,详情请参见alibabacloud-java-sdk。添加依赖包的示例如下所示。
        <dependency>
          <groupId>com.aliyun</groupId>
          <artifactId>paiplugin20210325</artifactId>
          <version>0.0.1</version>
        </dependency>
        <dependency>
          <groupId>com.aliyun</groupId>
          <artifactId>tea-openapi</artifactId>
          <version>0.1.0</version>
        </dependency>
    通过API创建短信发送计划的示例如下:
    • 从MaxCompute创建发送计划
      package com.api.pai;
      
      import com.aliyun.paiplugin20210325.Client;
      import com.aliyun.paiplugin20210325.models.*;
      import com.aliyun.teaopenapi.models.Config;
      
      public class App 
      {
          public static void main( String[] args )
          {
              try {
                  Config config = new Config();
                  config.accessKeyId = "<yourAccessKeyId>";
                  config.accessKeySecret = "<yourAccessKeySecret>";
                  config.endpoint = "paiplugin.cn-hangzhou.aliyuncs.com";
                  Client c = new Client(config);
      
                  // 从MaxCompute创建发送计划。
                  CreateScheduleRequest req6 = new CreateScheduleRequest();
                  req6.dataAddress="odps-project/odps-table";
                  req6.partition="dt='20200101' AND name = 'test'";
                  req6.dataSource=0;
                  req6.name="ODPS流程测试";
                  req6.sendTime="2021-01-01 18:00:00";
                  req6.phoneNumberColumn="phone_number";
                  req6.signatureID="<yourSignatureId>";
                  req6.templateID="<yourTemplateId>";
      
                  var rsp6 = c.createSchedule(req6);
                  var schedule = rsp6.body.data;
                  System.out.println(schedule.ID);
      
              } catch (Exception e) {
                  System.out.println(e);
              }
          }
      }
      参数详情请参见下文表 1,您需要将参数值替换为实际值。
    • 从CSV文件创建发送计划
      package com.api.pai;
      
      import com.aliyun.paiplugin20210325.Client;
      import com.aliyun.paiplugin20210325.models.*;
      import com.aliyun.teaopenapi.models.Config;
      
      public class App 
      {
          public static void main( String[] args )
          {
              try {
                  Config config = new Config();
                  config.accessKeyId = "<yourAccessKeyId>";
                  config.accessKeySecret = "<yourAccessKeySecret>";
                  config.endpoint = "paiplugin.cn-hangzhou.aliyuncs.com";
                  Client c = new Client(config);       
                        
                  // 从CSV文件创建发送计划。
                  CreateScheduleRequest req5 = new CreateScheduleRequest();
                  req5.dataAddress="https://bucket.endpoint/path/to/file";
                  req5.dataSource=1;
                  req5.name="流程测试";
                  req5.sendTime="2021-01-01 18:00:00";
                  req5.signatureID="<yourSignatureId>";
                  req5.templateID="<yourTemplateId>";
      
                  var rsp5 = c.createSchedule(req5);
                  var schedule = rsp5.body.data;
                  System.out.println(schedule.ID);          
                
      
              } catch (Exception e) {
                  System.out.println(e);
              }
          }
      }
      参数详情请参见下文表 1,您需要将参数值替换为实际值。
表 1. 参数说明
参数 描述
<yourAccessKeyId> 阿里云账号的AccessKey ID。
<yourAccessKeySecret> 阿里云账号的AccessKey Secret。
<yourSignatureId> 已注册的签名ID。您可以通过API查看所有签名,示例代码如下:
  • Python
    from alibabacloud_paiplugin20210325 import client 
    from alibabacloud_paiplugin20210325 import models
    from alibabacloud_tea_openapi import models as open_api_models
    
    c = client.Client(
        open_api_models.Config(
            access_key_id="<access-key-id>",
            access_key_secret="<access-key-secret>",
            endpoint="paiplugin.cn-hangzhou.aliyuncs.com"
        )
    )
    
    # 列出所有签名。
    req = models.ListSignaturesRequest()
    rsp = c.list_signatures(req)
    print(rsp.body.data)
  • Golang
    package main
    
    import (
        "fmt"
    
        openapi "github.com/alibabacloud-go/darabonba-openapi/client"
        "github.com/alibabacloud-go/paiplugin-20210325/client"
    )
    
    func main() {
        accessKeyId := "<access-key-id>"
        accessKeySecret := "<access-key-secret>"
        endpoint := "paiplugin.cn-hangzhou.aliyuncs.com"
        config := openapi.Config{
            AccessKeyId:     &accessKeyId,
            AccessKeySecret: &accessKeySecret,
            Endpoint:        &endpoint,
        }
        c, err := client.NewClient(&config)
        if err != nil {
            panic(fmt.Errorf("Failed to create client %w", err))
        }   
    
      // 列出所有签名。
        req2 := client.ListSignaturesRequest{}
        rsp2, err := c.ListSignatures(&req2)
        if err != nil {
            fmt.Printf("Failed to list signatures %w", err)
        }
        fmt.Println(rsp2.Body.Data.Signatures)   
     
    }
  • Java
    package com.api.pai;
    
    import com.aliyun.paiplugin20210325.Client;
    import com.aliyun.paiplugin20210325.models.*;
    import com.aliyun.teaopenapi.models.Config;
    
    public class App 
    {
        public static void main( String[] args )
        {
            try {
                Config config = new Config();
                config.accessKeyId = "<access-key-id>";
                config.accessKeySecret = "<access-key-secret>";
                config.endpoint = "paiplugin.cn-hangzhou.aliyuncs.com";
                Client c = new Client(config);
    
                // 列出所有签名。
                ListSignaturesRequest req1 = new ListSignaturesRequest();
                ListSignaturesResponse rsp1 = c.listSignatures(req1);
    
                var signatures = rsp1.body.data.signatures;
                if (signatures.size() > 0) {
                    System.out.println(signatures.get(0).ID);
                }                        
    
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }
<yourTemplateId> 已创建的短信模板ID。您可以通过API查看所有短信模板,示例代码如下:
  • Python
    from alibabacloud_paiplugin20210325 import client 
    from alibabacloud_paiplugin20210325 import models
    from alibabacloud_tea_openapi import models as open_api_models
    
    c = client.Client(
        open_api_models.Config(
            access_key_id="<access-key-id>",
            access_key_secret="<access-key-secret>",
            endpoint="paiplugin.cn-hangzhou.aliyuncs.com"
        )
    )
    # 列出所有模板。
    req = models.ListTemplatesRequest()
    rsp = c.list_templates(req)
    print(rsp.body.data)
  • Golang
    package main
    
    import (
        "fmt"
    
        openapi "github.com/alibabacloud-go/darabonba-openapi/client"
        "github.com/alibabacloud-go/paiplugin-20210325/client"
    )
    
    func main() {
        accessKeyId := "<access-key-id>"
        accessKeySecret := "<access-key-secret>"
        endpoint := "paiplugin.cn-hangzhou.aliyuncs.com"
        config := openapi.Config{
            AccessKeyId:     &accessKeyId,
            AccessKeySecret: &accessKeySecret,
            Endpoint:        &endpoint,
        }
        c, err := client.NewClient(&config)
        if err != nil {
            panic(fmt.Errorf("Failed to create client %w", err))
        }   
    
        // 列出所有模板。
      req1 := client.ListTemplatesRequest{}
      rsp1, err := c.ListTemplates(&req1)
      if err != nil {
        fmt.Printf("Failed to list templates %w", err)
      }
      fmt.Println(rsp1.Body.Data.Templates)
    }
  • Java
    package com.api.pai;
    
    import com.aliyun.paiplugin20210325.Client;
    import com.aliyun.paiplugin20210325.models.*;
    import com.aliyun.teaopenapi.models.Config;
    
    public class App 
    {
        public static void main( String[] args )
        {
            try {
                Config config = new Config();
                config.accessKeyId = "<access-key-id>";
                config.accessKeySecret = "<access-key-secret>";
                config.endpoint = "paiplugin.cn-hangzhou.aliyuncs.com";
                Client c = new Client(config);
                                        
                // 列出所有模板。
                ListTemplatesRequest req2 = new ListTemplatesRequest();
                ListTemplatesResponse rsp2 = c.listTemplates(req2);
    
                var templates = rsp2.body.data.templates;
                if (templates.size() > 0) {
                    System.out.println(templates.get(0).ID);
                }
            } catch (Exception e) {
                System.out.println(e);
            }
        }
    }