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

前提条件

  • 已获取阿里云账号的鉴权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授权

        需要为阿里云账号28323011649325****进行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文件添加目标号码相关信息,则在创建短信发送计划之前需要为阿里云账号28323011649325****进行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

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

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

  1. 进入用户增长插件页面。
    1. 登录PAI控制台
    2. 在左侧导航栏,选择场景化解决方案 > 用户增长
  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)
      参数详情请参见下文参数说明,您需要将参数值替换为实际值。
    • 从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)
      参数详情请参见下文参数说明,您需要将参数值替换为实际值。
  • 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)
        
      }
      参数详情请参见下文参数说明,您需要将参数值替换为实际值。
    • 从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)    
      }
      参数详情请参见下文参数说明,您需要将参数值替换为实际值。
  • 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);
              }
          }
      }
      参数详情请参见下文参数说明,您需要将参数值替换为实际值。
    • 从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. 参数说明
参数描述
<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);
            }
        }
    }