行为数据推送Demo

配置环境变量

配置环境变量ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET

重要
  • 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维,具体操作,请参见创建RAM用户

  • 创建AccessKey ID和AccessKey Secret,请参考创建AccessKey

  • 如果您使用的是RAM用户的AccessKey,请确保主账号已授权AliyunServiceRoleForOpenSearch服务关联角色,请参考OpenSearch-行业算法版服务关联角色,相关文档参考访问鉴权规则

  • 请不要将AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。

  • LinuxmacOS系统配置方法:

    执行以下命令,其中, <access_key_id>需替换为您RAM用户的AccessKey ID,<access_key_secret>替换为您RAM用户的AccessKey Secret。

    export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id> 
    export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
  • Windows系统配置方法

    1. 新建环境变量文件,添加环境变量ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET,并写入已准备好的AccessKey ID和AccessKey Secret。

    2. 重启Windows系统生效。

代码示例

// This file is auto-generated, don't edit it. Thanks.
package main

import (
  "fmt"
  util "github.com/alibabacloud-go/tea-utils/service"
  "github.com/alibabacloud-go/tea/tea"
  opensearch "main/client"
)

func main() {
  // 创建请求用客户端实例
  // Endpoint 为 要访问服务的区域域名.
  // AccessKeyId 及AccessKeySecret 用于构造鉴权信息.
  config := &opensearch.Config{
      Endpoint:        tea.String("<Endpoint>"),
    
      // 用户识别信息
      // 从环境变量读取配置的AccessKey ID和AccessKey Secret,
      // 运行代码示例前必须先配置环境变量,参考文档上面“配置环境变量”步骤
      // 替换对应的access key id
      AccessKeyId:     tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")),
      AccessKeySecret: tea.String(os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")),
  }

  // New  一个client, 用以发送请求.
    client, _clientErr := opensearch.NewClient(config)

  // 如果 NewClient 过程中出现异常. 则 返回 _client_err 且输出 错误信息.
  if _clientErr != nil {
      fmt.Println(_clientErr)
      return
  }


  // item_id  信息 为 搜索结果返回的主键信息. 特定 为主键 id.
  itemId := "<item_id>"

  // ops_request_misc 为搜索请求返回的 ops_request_misc 信息.
  opsRequestMisc :="<ops_request_misc>"


  // bhv_type 为 行为事件的特征信息, 备选信息如下为类别:
  //      cart(加购物车)
  //      collect(收藏)
  //      like(点赞)
  //      comment(评论)
  //      buy(购买)
  //      click(点击/查看)
  bhvType := "<bhv_type>"

  // requestId 为搜索请求返回的 request_id 信息.
  requestId :="<request_id>"

  // 该数据到达服务端的时间,格式:时间戳,单位:秒
  reachTime :="<reach_time>"


  // 用于唯一标识终端应用上的用户的ID。
  //*一般为登录用户ID。
  //*对于PC端,如果是未登录用户,也可以设置为cookieid
  user_id:="<user_id>"
  behavior_fields :=map[string]interface{}{
      "item_id": itemId,
      "sdk_type": "opensearch_sdk",
      "sdk_version": "<sdk_version>",  // 当前使用的 opensearch sdk 的版本号.
      "trace_id": "ALIBABA",  // 用于区分调用了哪个服务商的服务
      "trace_info": opsRequestMisc,
      "bhv_type": bhvType,
      "item_type": "item",
      "rn": requestId,
      "biz_id":"<biz_id>",  // 手机或终端应用用于区分业务的一个数值ID,该字段可用来和OpenSearch上的应用或和AIRec上的实例做关联
      "reach_time": reachTime,
      "user_id": user_id,

  }

  bhv_actions := []string{"like", "comment", "buy"}
  if IsContain(bhv_actions,bhvType){  // 当定位类型包含在 bhv_actions 范围内. 则需要提供更多行为信息.

      // 该行为的一些描述信息。格式:key=value{,key=value}
      behavior_fields["bhv_detail"] ="<bhv_detail>"

      // 行为数量,例如停留时长,购买件数等
      behavior_fields["bhv_value"] ="<bhv_value>"
  }
  behavior_document := map[string]interface{}{
      "cmd": "ADD",
      "fields": behavior_fields,
  }

  // 组装推送文档 数组结构. 其中包含单条文档动作.
  requestBody := []interface{}{behavior_document}

  // 请求发送的配置参数. 用以请求配置及连接池配置.
  runtime := &util.RuntimeOptions{
      ConnectTimeout: tea.Int(5000),
      ReadTimeout:    tea.Int(10000),
      Autoretry:      tea.Bool(false),
      IgnoreSSL:      tea.Bool(false),
      MaxIdleConns:   tea.Int(50),
  }

    // 推送接口需要提供 推送 app 和数据采集名称,
    // appName 是 app 名称. 不可使用版本推送数据
    appName := "<appName>"
    dataCollectionName := "<dataCollectionName>"

    // dataCollectionType 为 'BEHAVIOR', 此为默认值.
    dataCollectionType := "BEHAVIOR"

    // 发送请求的方法调用.
  _reponse, _request_err := client.Request(
      tea.String("POST"),
      tea.String("/v3/openapi/app-groups/"+appName+"/data-collections/"+dataCollectionName+"/data-collection-type/"+dataCollectionType+"/actions/bulk"),
      nil,
      nil,
      requestBody,
      runtime)

  // 如果 发送请求 过程中出现异常. 则 返回 _request_err 且输出 错误信息.
  if _request_err != nil {
      fmt.Println(_request_err)
      return
  }

  // 输出正常返回的 _reponse 内容.
  fmt.Println(_reponse)
}

func IsContain(items []string, item string) bool {
   for _, eachItem := range items {
       if eachItem == item {
           return true
       }
   }
   return false
}