Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 76 additions & 1 deletion work/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,79 @@

[官方文档](https://work.weixin.qq.com/api/doc)

## 快速入门
## 快速入门

## 会议-预约会议高级管理

[官方文档](https://developer.work.weixin.qq.com/document/path/98148)

### 使用示例

```go
//初始化
wc := work.NewWork(&config.Config{
CorpID: "corp_id",
CorpSecret: "corp_secret",
})

//获取会议接口实例
meetingClient := wc.GetMeeting()

//创建预约会议
resp, err := meetingClient.MeetingCreate(&meeting.CreateRequest{
AdminUserID: "zhangsan",
Title: "新建会议",
MeetingStart: 1600000000,
MeetingDuration: 3600,
Description: "新建会议描述",
Location: "广州媒体港",
Invitees: &meeting.Invitees{
UserID: []string{"lisi", "wangwu"},
},
Settings: &meeting.Settings{
Password: "1234",
EnableWaitingRoom: &[]bool{false}[0],
AllowEnterBeforeHost: &[]bool{true}[0],
EnableEnterMute: 1,
},
})

//获取会议详情
info, err := meetingClient.MeetingGetInfo(&meeting.GetInfoRequest{
MeetingID: "XXXXXXXXX",
})

//取消预约会议
err = meetingClient.MeetingCancel(&meeting.CancelRequest{
MeetingID: "XXXXXXXXX",
})
```

### 接口列表

| 接口 | 方法 | 文档 |
| --- | --- | --- |
| 创建预约会议 | `MeetingCreate` | [98148](https://developer.work.weixin.qq.com/document/path/98148) |
| 修改预约会议 | `MeetingUpdate` | [98154](https://developer.work.weixin.qq.com/document/path/98154) |
| 取消预约会议 | `MeetingCancel` | [98153](https://developer.work.weixin.qq.com/document/path/98153) |
| 获取会议详情 | `MeetingGetInfo` | [98149](https://developer.work.weixin.qq.com/document/path/98149) |
| 获取会议受邀成员列表 | `GetInvitees` | [98160](https://developer.work.weixin.qq.com/document/path/98160) |
| 更新会议受邀成员列表 | `SetInvitees` | [98162](https://developer.work.weixin.qq.com/document/path/98162) |
| 获取成员会议ID列表 | `GetUserMeetingID` | [98714](https://developer.work.weixin.qq.com/document/path/98714) |
| 创建用户专属参会链接 | `CreateCustomerShortURL` | [98818](https://developer.work.weixin.qq.com/document/path/98818) |
| 获取用户专属参会链接 | `GetCustomerShortURL` | [98819](https://developer.work.weixin.qq.com/document/path/98819) |
| 获取实时会中成员列表 | `GetRealtimeAttendeeList` | [98157](https://developer.work.weixin.qq.com/document/path/98157) |
| 获取已参会成员列表 | `GetAttendeeList` | [98156](https://developer.work.weixin.qq.com/document/path/98156) |
| 获取实时等候室成员列表 | `WaitingRoomGetCurrentUserList` | [98163](https://developer.work.weixin.qq.com/document/path/98163) |
| 获取等候室成员记录 | `WaitingRoomGetUserList` | [98164](https://developer.work.weixin.qq.com/document/path/98164) |
| 获取成员设备是否入会 | `CheckDeviceInMeeting` | [98165](https://developer.work.weixin.qq.com/document/path/98165) |
| 获取会议嘉宾列表 | `GetGuests` | [99039](https://developer.work.weixin.qq.com/document/path/99039) |
| 更新会议嘉宾列表 | `SetGuests` | [99040](https://developer.work.weixin.qq.com/document/path/99040) |
| 获取会议健康度 | `GetQuality` | [98821](https://developer.work.weixin.qq.com/document/path/98821) |
| 修改会议报名配置 | `EnrollSetConfig` | [98797](https://developer.work.weixin.qq.com/document/path/98797) |
| 获取会议报名配置 | `EnrollGetConfig` | [98800](https://developer.work.weixin.qq.com/document/path/98800) |
| 获取会议成员报名ID | `EnrollQueryByTmpOpenID` | [98794](https://developer.work.weixin.qq.com/document/path/98794) |
| 获取会议报名信息 | `EnrollList` | [98810](https://developer.work.weixin.qq.com/document/path/98810) |
| 审批会议报名信息 | `EnrollApprove` | [98807](https://developer.work.weixin.qq.com/document/path/98807) |
| 导入会议报名信息 | `EnrollImport` | [98816](https://developer.work.weixin.qq.com/document/path/98816) |
| 删除会议报名信息 | `EnrollDelete` | [98817](https://developer.work.weixin.qq.com/document/path/98817) |
216 changes: 216 additions & 0 deletions work/meeting/attendee.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
package meeting

import (
"fmt"

"github.com/silenceper/wechat/v2/util"
)

const (
// meetingGetRealtimeAttendeeListURL 获取实时会中成员列表
meetingGetRealtimeAttendeeListURL = "https://qyapi.weixin.qq.com/cgi-bin/meeting/get_realtime_attendee_list?access_token=%s"
// meetingGetAttendeeListURL 获取已参会成员列表
meetingGetAttendeeListURL = "https://qyapi.weixin.qq.com/cgi-bin/meeting/get_attendee_list?access_token=%s"
// meetingCheckDeviceInMeetingURL 获取成员设备是否入会
meetingCheckDeviceInMeetingURL = "https://qyapi.weixin.qq.com/cgi-bin/meeting/check_device_in_meeting?access_token=%s"
// meetingGetQualityURL 获取会议健康度
meetingGetQualityURL = "https://qyapi.weixin.qq.com/cgi-bin/meeting/get_quality?access_token=%s"
)

type (
// GetRealtimeAttendeeListRequest 获取实时会中成员列表请求
GetRealtimeAttendeeListRequest struct {
MeetingID string `json:"meetingid"`
SubMeetingID string `json:"sub_meetingid,omitempty"`
Cursor string `json:"cursor,omitempty"`
Limit uint32 `json:"limit,omitempty"`
}

// GetRealtimeAttendeeListResponse 获取实时会中成员列表响应
GetRealtimeAttendeeListResponse struct {
util.CommonError
Status string `json:"status"`
HasMore bool `json:"has_more"`
NextCursor string `json:"next_cursor"`
Attendees []*RealtimeAttendee `json:"attendees"`
}

// RealtimeAttendee 实时会中成员
RealtimeAttendee struct {
UserID string `json:"userid"`
TmpOpenID string `json:"tmp_openid"`
JoinTime string `json:"join_time"`
InstanceID uint32 `json:"instance_id"`
Role uint32 `json:"role"`
JoinType uint32 `json:"join_type"`
AudioState bool `json:"audio_state"`
VideoState bool `json:"video_state"`
ScreenSharedState bool `json:"screen_shared_state"`
}

// GetAttendeeListRequest 获取已参会成员列表请求
GetAttendeeListRequest struct {
MeetingID string `json:"meetingid"`
SubMeetingID string `json:"sub_meetingid,omitempty"`
StartTime uint32 `json:"start_time,omitempty"`
EndTime uint32 `json:"end_time,omitempty"`
Cursor string `json:"cursor,omitempty"`
Limit uint32 `json:"limit,omitempty"`
}

// GetAttendeeListResponse 获取已参会成员列表响应
GetAttendeeListResponse struct {
util.CommonError
HasMore bool `json:"has_more"`
NextCursor string `json:"next_cursor"`
Attendees []*AttendedMember `json:"attendees"`
}

// AttendedMember 已参会成员
AttendedMember struct {
UserID string `json:"userid"`
TmpOpenID string `json:"tmp_openid"`
JoinTime string `json:"join_time"`
QuitTime string `json:"quit_time"`
InstanceID uint32 `json:"instance_id"`
Role uint32 `json:"role"`
WebinarRole uint32 `json:"webinar_role"`
JoinType uint32 `json:"join_type"`
Net string `json:"net"`
AudioState bool `json:"audio_state"`
VideoState bool `json:"video_state"`
ScreenSharedState bool `json:"screen_shared_state"`
CustomerData string `json:"customer_data"`
}

// CheckDeviceInMeetingRequest 获取成员设备是否入会请求
CheckDeviceInMeetingRequest struct {
UserID string `json:"userid"`
InstanceIDList []uint32 `json:"instance_id_list,omitempty"`
MeetingIDList []string `json:"meetingid_list"`
}

// CheckDeviceInMeetingResponse 获取成员设备是否入会响应
CheckDeviceInMeetingResponse struct {
util.CommonError
ResultList []*DeviceMeetingResult `json:"result_list"`
}

// DeviceMeetingResult 设备会议结果
DeviceMeetingResult struct {
MeetingID string `json:"meetingid"`
InstanceID uint32 `json:"instance_id"`
}

// GetQualityRequest 获取会议健康度请求
GetQualityRequest struct {
MeetingID string `json:"meetingid"`
SubMeetingID string `json:"sub_meetingid,omitempty"`
StartTime uint32 `json:"start_time,omitempty"`
Cursor string `json:"cursor,omitempty"`
Limit uint32 `json:"limit,omitempty"`
}

// GetQualityResponse 获取会议健康度响应
GetQualityResponse struct {
util.CommonError
Quality int32 `json:"quality"`
AudioQuality int32 `json:"audio_quality"`
VideoQuality int32 `json:"video_quality"`
ScreenShareQuality int32 `json:"screen_share_quality"`
NetworkQuality int32 `json:"network_quality"`
Problems []string `json:"problems"`
Attendees []*QualityAttendee `json:"attendees"`
NextCursor string `json:"next_cursor"`
HasMore bool `json:"has_more"`
}

// QualityAttendee 参会人员健康度
QualityAttendee struct {
UserID string `json:"userid"`
TmpOpenID string `json:"tmp_openid"`
InstanceID uint32 `json:"instance_id"`
Quality int32 `json:"quality"`
AudioQuality int32 `json:"audio_quality"`
VideoQuality int32 `json:"video_quality"`
ScreenShareQuality int32 `json:"screen_share_quality"`
NetworkQuality int32 `json:"network_quality"`
Problems []string `json:"problems"`
}
)

// GetRealtimeAttendeeList 获取实时会中成员列表
// see https://developer.work.weixin.qq.com/document/path/98157
func (r *Client) GetRealtimeAttendeeList(req *GetRealtimeAttendeeListRequest) (*GetRealtimeAttendeeListResponse, error) {
var (
accessToken string
err error
)
if accessToken, err = r.GetAccessToken(); err != nil {
return nil, err
}
var response []byte
if response, err = util.PostJSON(fmt.Sprintf(meetingGetRealtimeAttendeeListURL, accessToken), req); err != nil {
return nil, err
}
result := &GetRealtimeAttendeeListResponse{}
err = util.DecodeWithError(response, result, "GetRealtimeAttendeeList")
return result, err
}

// GetAttendeeList 获取已参会成员列表
// see https://developer.work.weixin.qq.com/document/path/98156
func (r *Client) GetAttendeeList(req *GetAttendeeListRequest) (*GetAttendeeListResponse, error) {
var (
accessToken string
err error
)
if accessToken, err = r.GetAccessToken(); err != nil {
return nil, err
}
var response []byte
if response, err = util.PostJSON(fmt.Sprintf(meetingGetAttendeeListURL, accessToken), req); err != nil {
return nil, err
}
result := &GetAttendeeListResponse{}
err = util.DecodeWithError(response, result, "GetAttendeeList")
return result, err
}

// CheckDeviceInMeeting 获取成员设备是否入会
// see https://developer.work.weixin.qq.com/document/path/98165
func (r *Client) CheckDeviceInMeeting(req *CheckDeviceInMeetingRequest) (*CheckDeviceInMeetingResponse, error) {
var (
accessToken string
err error
)
if accessToken, err = r.GetAccessToken(); err != nil {
return nil, err
}
var response []byte
if response, err = util.PostJSON(fmt.Sprintf(meetingCheckDeviceInMeetingURL, accessToken), req); err != nil {
return nil, err
}
result := &CheckDeviceInMeetingResponse{}
err = util.DecodeWithError(response, result, "CheckDeviceInMeeting")
return result, err
}

// GetQuality 获取会议健康度
// see https://developer.work.weixin.qq.com/document/path/98821
func (r *Client) GetQuality(req *GetQualityRequest) (*GetQualityResponse, error) {
var (
accessToken string
err error
)
if accessToken, err = r.GetAccessToken(); err != nil {
return nil, err
}
var response []byte
if response, err = util.PostJSON(fmt.Sprintf(meetingGetQualityURL, accessToken), req); err != nil {
return nil, err
}
result := &GetQualityResponse{}
err = util.DecodeWithError(response, result, "GetQuality")
return result, err
}
17 changes: 17 additions & 0 deletions work/meeting/client.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package meeting

import (
"github.com/silenceper/wechat/v2/work/context"
)

// Client 会议接口实例
type Client struct {
*context.Context
}

// NewClient 初始化实例
func NewClient(ctx *context.Context) *Client {
return &Client{
ctx,
}
}
Loading
Loading