钉钉怎么拉取日程列表?

需求:系统需要拉取钉钉中的会议列表,钉钉中我看叫日程

尝试解决:我看了日程文档https://open.dingtalk.com/document/personalapp/query-an-event-list-1

疑问:发现其中calendarId,userId,acs-dingtalk-access-token是必填的,我是第三方的系统我怎么拿到这些ID呢

如果有对接过的巨佬能给个demo更好拉,谢谢各位

阅读 406
avatarAI BotBETA

钉钉日程对接解决方案

一、关键参数获取方式

  1. calendarId获取
  2. 调用/v1.0/calendar/primary接口获取主日历ID
  3. 请求示例:

    GET https://api.dingtalk.com/v1.0/calendar/primary
    Headers: 
     x-acs-dingtalk-access-token: {access_token}
  4. userId获取
  5. 通过OAuth2.0授权流程获取:

    前端跳转地址:
    https://login.dingtalk.com/oauth2/auth?response_type=code&client_id={APP_KEY}&redirect_uri={REDIRECT_URI}
  6. access_token生成
  7. 使用AppKey和AppSecret换取:

    # Python示例
    import requests
    
    def get_access_token():
     url = "https://api.dingtalk.com/v1.0/oauth2/accessToken"
     data = {
         "appKey": "your_app_key",
         "appSecret": "your_app_secret"
     }
     response = requests.post(url, json=data)
     return response.json()['accessToken']

二、完整调用示例

def get_schedule_list():
    # 1.获取access_token
    token = get_access_token()
    
    # 2.获取主日历ID
    calendar_url = "https://api.dingtalk.com/v1.0/calendar/primary"
    calendar_res = requests.get(
        calendar_url,
        headers={"x-acs-dingtalk-access-token": token}
    )
    calendar_id = calendar_res.json()['id']

    # 3.查询日程列表
    schedule_url = f"https://api.dingtalk.com/v1.0/calendar/users/{userId}/calendars/{calendar_id}/events"
    params = {
        "timeMin": "2023-01-01T00:00:00Z",
        "timeMax": "2023-12-31T23:59:59Z"
    }
    schedule_res = requests.get(
        schedule_url,
        headers={"x-acs-dingtalk-access-token": token},
        params=params
    )
    return schedule_res.json()

三、注意事项

  1. 应用需要申请以下权限:

    • 权限类型:企业权限
    • 权限范围:日程读取(ScheduleRead)
  2. 授权流程需要:

    • 在开放平台配置回调地址
    • 用户扫码授权获取临时授权码
    • 使用授权码换取用户ID
  3. 接口频率限制:

    • 默认QPS限制为50次/秒
    • 重要操作建议添加重试机制

建议先完成「开发者身份认证」和「应用创建」,可在钉钉开放平台控制台完成这些前置操作。

1 个回答

1、新建一个应用,获取APP_KEY,APP_SECRET
image.png

private readonly APP_KEY = 'ding7rpwnpiki52mivsq';
private readonly APP_SECRET =
'E_h0JX8UhnyPMA9szvYdNr5UVp0DqKUJLiBTWiHWTLJGV5E1fxYPrtRV2Drp0fR_';
private readonly GET_TOKEN_URL = 'https://oapi.dingtalk.com/gettoken';
private readonly GET_SCHEDULE_URL =
'https://oapi.dingtalk.com/topapi/calendar/v2/event/list';

2、获取token

async getAccessToken(): Promise<string> {
    const params = {
      appkey: this.APP_KEY,
      appsecret: this.APP_SECRET,
    };
    const response = await axios.get(this.GET_TOKEN_URL, { params });

    if (response.data.errcode === 0) {
      return response.data.access_token;
    } else {
      throw new Error(`Failed to get access_token: ${response.data.errmsg}`);
    }
  }

2、果你的应用需要用户在钉钉客户端内登录,可以通过 免登授权码 获取用户的 userid,如果你知道用户的手机号,可以通过手机号获取 userid

手机号获取

async function getUserIdByMobile(mobile: string, accessToken: string): Promise<string> {
  const url = 'https://oapi.dingtalk.com/topapi/v2/user/getbymobile';
  const response = await axios.post(url, {
    mobile,
  }, {
    params: {
      access_token: accessToken,
    },
  });

  if (response.data.errcode === 0) {
    return response.data.result.userid;
  } else {
    throw new Error(`Failed to get userid: ${response.data.errmsg}`);
  }
}

3、获取日程

async getHotSearchTime() {
    const accessToken = await this.getAccessToken();
    const data = {
      userid: '',
      timeMin: '',
      timeMax: '',
    };
    const params = {
      access_token: accessToken,
    };

    const response = await axios.post(this.GET_SCHEDULE_URL, data, { params });

    if (response.data.errcode === 0) {
      console.log(response.data.result.events);
      return response.data.result.events || [];
    } else {
      throw new Error(`Failed to get schedule list: ${response.data.errmsg}`);
    }
  }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏