文章目录
参考官网: https://ding-doc.dingtalk.com/doc#/serverapi2/gh60vz
钉钉开放了丰富的服务端接口能力,开发者可以借助这些接口能力,实现企业系统与钉钉的集成打通。
调用钉钉接口时,需使用HTTPS协议、JSON数据格式、UTF8编码,访问域名为https://oapi.dingtalk.com。POST请求请在HTTP Header中设置 Content-Type:application/json。
返回结果/参数说明,标明返回参数示例及说明。所有接口的返回结果里都有errcode、errmsg。开发者需根据errcode是否为0判断是否调用成功(errcode意义请见全局错误码)。而errmsg仅作参考,后续可能会有变动,因此不可作为是否调用成功的判据。
总结: 统一请求为json,返回码中 errcode为0位正常调用。
第三方个人应用
频率限制
用户在使用第三方个人应用时,进行了提交表单操作,且提交该表单后需要向用户发送消息时,有以下限制:
(1)每个第三方个人应用,可以向用户在7天内推送有限条数的消息;
(2)提交1次表单可发送1条,多次提交发送多条;
如上,根据官方描述,可以总结和理解,个人应用 在发送消息这一块有很大限制。根据官方描述 :提交1次表单可发送1条,多次提交发送多条;
小程序个人应用,小程序客户端通过e.detail.formId获取推送消息临时授权码,服务器端必须获取该授权码,才可以发消息,而且是一次性的。而且这个临时授权码应该还有时间限制。
总结:所以个人应用不太适合那种,那种需要服务器端完全掌控发消息的场景。第三方个人小程序需要提交表单才可以发送消息,企业内部应用,可以使用服务端接口主动发送消息。
根据官网进入到相应文档,发现 个人小程序文档连服务器API 菜单都没有,目测 个人小程序能调钉钉开放接口非常有限。
经过测试,你调企业内部接口 https://oapi.dingtalk.com/gettoken 会报 错误的appKey和appSecrect。 就是说你个人应用的 appKey和appSecrect 是调不了一些 企业内部应用接口的。
第三方企业应用
第三方企业应用开发,是指开发者以钉钉、企业之外的第三方身份,基于钉钉的开放能力开发应用,并提供给钉钉上的其他组织使用。

企业内部应用
官方参考 https://ding-doc.dingtalk.com/doc#/bgb96b/ok9au2
企业内部应用 发送消息需要先调 https://oapi.dingtalk.com/gettoken接口获取access_token。
所有的发送消息接口都需要access_token。
总结: 三个应用场景各有不同。
接下来,我们主要以 **企业内部应用** 为主进行分析学习。
参考官网https://ding-doc.dingtalk.com/doc#/ln6dmh/wbhq0x/ker7fv
第三方企业应用,若需在钉钉应用市场上架,必须使用钉钉云。同时还需要购买钉钉云解决方案并将应用部署在钉钉云上。原因主要包含以下:首先企业的数据应该在可控的环境下使用,不能造成企业信息泄漏的严重事故;另外保障应用的稳定性及可用性非常重要,钉钉云会在架构、监控及报警等方面有相应的要求。
个人小程序如果需要上架到钉钉应用市场,也需要使用钉钉云,通过钉钉云解决方案进行部署。这是因为钉钉的个人小程序更多的是和工作相关的场景,安全及稳定性的要求会更高一些。
总结: 个人小程序、第三方企业应用 这两者你要上传到应用市场,就都必须使用钉钉云。
根部门ID为1
接口
https://oapi.dingtalk.com/department/list
参数

其中 fetch_child参数比较重要,默认是false, 是否递归部门的全部子部门,ISV微应用固定传递false。
比如设置为true,返回如下:
{
"errcode":0,
"errmsg":"ok",
"department":[
{
"createDeptGroup":true,
"name":"金融部",
"id":285358123,
"autoAddUser":true,
"parentid":1
},
{
"createDeptGroup":false,
"name":"财务部",
"id":286635451,
"autoAddUser":false,
"parentid":1
}
]
}
开放平台应用后台,如下 需要开通 通讯录只读权限。

它返回部门列表信息含有,部门id信息。
相关接口如下:
接口:
https://oapi.dingtalk.com/user/getDeptMember
返回
{
"errcode":0,
"userIds":[
"manager36299"
],
"errmsg":"ok"
}
总结:这个接口直接获取某个部门下 userid列表。
接口:
https://oapi.dingtalk.com/user/simplelist
返回信息如下:
{
"errcode":0,
"userlist":[
{
"name":"郭xx",
"userid":"022222223211111111"
}
],
"hasMore":false,
"errmsg":"ok"
}
总结: 正如接口命名simple list ,这个接口返回的部门下人员信息比较简单,只有name和userid。
接口:
https://oapi.dingtalk.com/user/listbypage
返回信息如下:
{
"errcode": 0,
"errmsg": "ok",
"hasMore": false,
"userlist":[
{
"userid": "zhangsan",
"unionid": "PiiiPyQqBNBii0HnCJ3zljcuAiEiE",
"mobile": "1xxxxxxxxxx",
"tel" : "xxxx-xxxxxxxx",
"workPlace" :"",
"remark" : "",
"order" : 1,
"isAdmin": true,
"isBoss": false,
"isHide": true,
"isLeader": true,
"name": "张三",
"active": true,
"department": [1, 2],
"position": "工程师",
"email": "test@xxx.com",
"avatar": "xxx",
"jobnumber": "xxx",
"extattr": {
"爱好":"旅游",
"年龄":"24"
}
}
]
}
总结:它这个接口和上一个接口一样,获取部门下人员,不过比上一个接口获取的人员信息详细。
钉钉消息通知
参考官网: https://ding-doc.dingtalk.com/doc#/serverapi2/pgoxpy/DgMTZ
相关接口;
工作通知消息是以企业工作通知会话中某个微应用的名义推送到员工的通知消息,例如生日祝福、入职提醒等等。下图是工作通知的会话和消息示例:
发送工作通知消息需要注意以下事项:
总结: 工作通知消息 是以应用的名义发送消息,它也可以发送各种消息类型,取决你传参。
接口:
https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2
传参
{
"agent_id":"你的微应用id",
"msg":{
"msgtype":"text",
"text":{
"content":"2020不平凡的一年"
}
},
"to_all_user":"true"
}
群消息相关接口:
群会话消息是指可以调用接口创建企业群聊会话,然后可以以系统名义向群里推送群聊消息。
发送群消息,需要群会话的id。
群会话的id,可以在调用创建群会话接口的返回结果里面获取,也可以通过dd.chooseChat获取
请求方式:POST(HTTPS)
请求地址:https://oapi.dingtalk.com/chat/create?access_token=ACCESS_TOKEN
请求包结构体:
{
"name": "groupName",
"owner": "zhangsan",
"useridlist": ["zhangsan","lisi"]
}
参数如下:

总结:默认情况下,我们一般只需设置如下3个参数,组名、群主的userid、群成员userid列表
{
“name”: “groupName”,
“owner”: “zhangsan”,
“useridlist”: [“zhangsan”,“lisi”]
}
注意:该接口也需要开放平台后台,专门开接口权限,否则,报如下返回:
{
"errcode":60011,
"errmsg":"没有调用该接口的权限"
}
注意:这个需要打开的权限是
高级权限-微应用开发应用所需要的应用相关权限,根据应用功能合理开通。
下的 企业会话 权限。
开发者后台找到该应用,进入应用详情,有个接口权限,最下方有个企业会话权限检查一下有没有开通。

另外,目前群会话id(chatid)的获取只有前端api。
创建会话创建失败,常见错误还有: 不合法的UserID列表,注意请求参数中useridlist的值必须是一个数组。
{
"name":"gggg",
"owner":"aaa9876",
"useridlist":"['aaa9876','081234232936594740']"
}
请求地址:https://oapi.dingtalk.com/chat/send?access_token=ACCESS_TOKEN

群会话的id,可以在调用创建群会话接口的返回结果里面获取,也可以通过dd.chooseChat获取
请求参数示例:
{
"chatid":"chat6aca4f0991afc7f3f635ee902ads31d2f",
"msg":{
"msgtype":"text",
"text":{
"content":" 成功测试通过"
}
}
}
正确响应结果:
{
"errcode":0,
"errmsg":"ok",
"messageId":"msg6XMrDnA/DSAsdfaafsdfQ=="
}
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm
我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI