Documentation
¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
View Source
var ContactGetUser = common.Shortcut{ Service: "contact", Command: "+get-user", Description: "Get user info (omit user_id for self; provide user_id for specific user)", Risk: "read", UserScopes: []string{"contact:user.basic_profile:readonly"}, BotScopes: []string{"contact:user.base:readonly", "contact:contact.base:readonly"}, AuthTypes: []string{"user", "bot"}, HasFormat: true, Flags: []common.Flag{ {Name: "user-id", Desc: "user ID (omit to get current user)"}, {Name: "user-id-type", Default: "open_id", Desc: "user ID type: open_id | union_id | user_id"}, }, Validate: func(ctx context.Context, runtime *common.RuntimeContext) error { if runtime.Str("user-id") == "" && runtime.IsBot() { return common.FlagErrorf("bot identity cannot get current user info, specify --user-id") } return nil }, DryRun: func(ctx context.Context, runtime *common.RuntimeContext) *common.DryRunAPI { userId := runtime.Str("user-id") if userId == "" { return common.NewDryRunAPI(). GET("/open-apis/authen/v1/user_info"). Desc("(when --user-id omitted) Get current authenticated user info"). Set("mode", "current_user") } userIdType := runtime.Str("user-id-type") if userIdType == "" { userIdType = "open_id" } if runtime.IsBot() { return common.NewDryRunAPI(). GET("/open-apis/contact/v3/users/:user_id"). Desc("(bot) Get user info by user ID"). Params(map[string]interface{}{"user_id_type": userIdType}). Set("user_id", userId).Set("user_id_type", userIdType) } return common.NewDryRunAPI(). POST("/open-apis/contact/v3/users/basic_batch"). Desc("(user) Get user basic info by user ID"). Params(map[string]interface{}{"user_id_type": userIdType}). Body(map[string]interface{}{"user_ids": []string{userId}}) }, Execute: func(ctx context.Context, runtime *common.RuntimeContext) error { userId := runtime.Str("user-id") userIdType := runtime.Str("user-id-type") if userId == "" { data, err := runtime.CallAPI("GET", "/open-apis/authen/v1/user_info", nil, nil) if err != nil { return err } user := data if user == nil { user = make(map[string]interface{}) } userData := map[string]interface{}{"user": user} runtime.OutFormat(userData, nil, func(w io.Writer) { output.PrintTable(w, []map[string]interface{}{{ "name": pickUserName(user), "open_id": user["open_id"], "union_id": user["union_id"], "email": firstNonEmpty(user, "email", "mail"), "mobile": firstNonEmpty(user, "mobile", "phone"), "enterprise_email": firstNonEmpty(user, "enterprise_email"), }}) }) return nil } if runtime.IsBot() { data, err := runtime.CallAPI("GET", "/open-apis/contact/v3/users/"+url.PathEscape(userId), map[string]interface{}{"user_id_type": userIdType}, nil) if err != nil { return err } user, _ := data["user"].(map[string]interface{}) if user == nil { user = data } userData := map[string]interface{}{"user": user} runtime.OutFormat(userData, nil, func(w io.Writer) { output.PrintTable(w, []map[string]interface{}{{ "name": pickUserName(user), "open_id": firstNonEmpty(user, "open_id", "user_id"), "email": firstNonEmpty(user, "email", "enterprise_email"), "mobile": firstNonEmpty(user, "mobile", "mobile_phone"), "department": firstNonEmpty(user, "department_name"), }}) }) return nil } data, err := runtime.CallAPI("POST", "/open-apis/contact/v3/users/basic_batch", map[string]interface{}{"user_id_type": userIdType}, map[string]interface{}{"user_ids": []string{userId}}) if err != nil { return err } users, _ := data["users"].([]interface{}) var user map[string]interface{} if len(users) > 0 { user, _ = users[0].(map[string]interface{}) } if user == nil { user = make(map[string]interface{}) } userData := map[string]interface{}{"user": user} runtime.OutFormat(userData, nil, func(w io.Writer) { output.PrintTable(w, []map[string]interface{}{{ "name": pickUserName(user), "user_id": user["user_id"], }}) }) return nil }, }
View Source
var ContactSearchUser = common.Shortcut{ Service: "contact", Command: "+search-user", Description: "Search users (results sorted by relevance)", Risk: "read", Scopes: []string{"contact:user:search"}, AuthTypes: []string{"user"}, HasFormat: true, Flags: []common.Flag{ {Name: "query", Desc: "search keyword", Required: true}, {Name: "page-size", Default: "20", Desc: "page size"}, {Name: "page-token", Desc: "page token"}, }, Validate: func(ctx context.Context, runtime *common.RuntimeContext) error { if len(runtime.Str("query")) == 0 { return common.FlagErrorf("search keyword empty") } return nil }, DryRun: func(ctx context.Context, runtime *common.RuntimeContext) *common.DryRunAPI { pageSizeStr := runtime.Str("page-size") pageToken := runtime.Str("page-token") pageSize := 20 if n, err := strconv.Atoi(pageSizeStr); err == nil { pageSize = int(math.Min(math.Max(float64(n), 1), 200)) } params := map[string]interface{}{ "query": runtime.Str("query"), "page_size": pageSize, } if pageToken != "" { params["page_token"] = pageToken } return common.NewDryRunAPI(). GET("/open-apis/search/v1/user"). Params(params) }, Execute: func(ctx context.Context, runtime *common.RuntimeContext) error { query := runtime.Str("query") pageSizeStr := runtime.Str("page-size") pageToken := runtime.Str("page-token") pageSize := 20 if n, err := strconv.Atoi(pageSizeStr); err == nil { pageSize = int(math.Min(math.Max(float64(n), 1), 200)) } params := map[string]interface{}{ "query": query, "page_size": pageSize, } if pageToken != "" { params["page_token"] = pageToken } data, err := runtime.CallAPI("GET", "/open-apis/search/v1/user", params, nil) if err != nil { return err } users, _ := data["users"].([]interface{}) for _, u := range users { if m, _ := u.(map[string]interface{}); m != nil { if av, _ := m["avatar"].(map[string]interface{}); av != nil { m["avatar"] = map[string]interface{}{"avatar_origin": av["avatar_origin"]} } } } searchData := map[string]interface{}{ "users": users, "has_more": data["has_more"], "page_token": data["page_token"], } runtime.OutFormat(searchData, nil, func(w io.Writer) { if len(users) == 0 { fmt.Fprintln(w, "No matching users found.") return } var rows []map[string]interface{} for _, u := range users { m, _ := u.(map[string]interface{}) rows = append(rows, map[string]interface{}{ "name": pickUserName(m), "open_id": m["open_id"], "email": firstNonEmpty(m, "email", "mail"), "mobile": firstNonEmpty(m, "mobile", "phone"), "department": firstNonEmpty(m, "department_name", "department"), "enterprise_email": firstNonEmpty(m, "enterprise_email"), }) } output.PrintTable(w, rows) hasMore, _ := data["has_more"].(bool) moreHint := "" if hasMore { pt, _ := data["page_token"].(string) moreHint = fmt.Sprintf(" (more available, page_token: %s)", pt) } fmt.Fprintf(w, "\n%d user(s)%s\n", len(users), moreHint) }) return nil }, }
Functions ¶
Types ¶
This section is empty.
Click to show internal directories.
Click to hide internal directories.