Teambition提供了API接口,我们可以注册成为开发者,然后通过接口获取Teambition的数据,按照需求的格式保存和分析.
1.登录Teambition企业账号,要有管理员的权限,点击左上角的菜单按钮,然后点击进入企业的“全部应用”.最后点击“应用商店”
2.点击“开放平台”,此页面有后期需用的API文档,可以先收藏。点击“立即创建”
3.创建企业内部应用:填写名称和描述
4.打开应用凭证和基本信息,获取ID和Secret(F12在代码中可以直接复制)
5.打开左侧栏中的“应用开发”--“应用权限”,根据需要勾选
6.打开“应用发布”,填写信息,发布。
1.找到对应的jwt包,https://jwt.io/libraries,下载安装(推荐PyJWT:至少我用没有问题)
2.appAccessToken的获取(最重要的一步)
因为文档中没有Python实现的任何描述,这里只提供个人写法
from datetime import datetime, timedelta
import jwt
import requests
import time
from Config import getConfig
class GetTeamBitionEvents(object):
def init(self):
self.app_id = getConfig('config', 'Get_TB_Data', 'app_id')
self.app_secret = getConfig('config', 'Get_TB_Data', 'app_secret')
def get_aptoken(self):
now_time = int(time.time())
expire_time = now_time + 36000 # 1 小时后超时
token_dict = {'iat': now_time,
'_appId': '%s' % self.app_id,
'exp': expire_time,
}
headers = {
'typ': 'jwt',
'alg': 'HS256'
# 声明所使用的算法
}
encoded = jwt.encode(payload=token_dict, key=self.app_secret, headers=headers,
algorithm='HS256') # .decode('ascii')
return encoded
个人习惯将固定的重要数据存放在config文件中,你也可以直接写入字符串
3.获取Token后就可以开始调用API了,我这里将“创建项目任务类型”作为示例
主要看六点
https://open.teambition.com/api/v3/sfc/create
有了这些信息,就可以直接上代码了
from future import absolute_import, unicode_literals
import requests, time, jwt
class GetTeamBitionEvents(object):
def __init__(self):
self.app_id = '' # 必填
self.app_secret = '' # 必填
self.company_url = 'https://www.teambition.com/organization/' # 固定
self.company_id = '' # 一些API会用到公司ID
self.callback_url = self.company_url + self.company_id # 固定
self.user_id='' # 一些API会用到个人ID
self.auth_url = 'https://account.teambition.com/oauth2/authorize?client_id=' + self.app_id + '&redirect_uri=' + self.callback_url # 固定
def get_aptoken(self):
now_time = int(time.time())
expire_time = now_time + 36000 # 1 小时后超时
token_dict = {'iat': now_time,
'_appId': '%s' % self.app_id,
'exp': expire_time,
}
headers = {
'typ': 'jwt',
'alg': 'HS256'
# 声明所使用的算法
}
encoded = jwt.encode(payload=token_dict, key=self.app_secret, headers=headers,
algorithm='HS256') # .decode('ascii')
return encoded
def post_proj_type(self,params,object):
url = f'https://open.teambition.com/api/v3/sfc/create'
app_token = (self.get_aptoken()).replace("\n", "").replace('\r', '')
headers = {
'Authorization': 'Bearer %s' % app_token,
'X-Tenant-Id': '%s' % self.company_id,
'X-Tenant-Type': 'organization',
'X-Operator-Id': self.user_id
}return requests.post(url,json=object,params=params, headers=headers)</code></pre>
if name == 'main':
tb = GetTeamBitionEvents()
projectId=tb.company_id #测试企业-项目管理副本
roleId=tb.user_id # 测试角色
object={
'name':'测试类型'
}
params={
'projectId':projectId
}
result = tb.post_proj_type(params,object)
print(result.json()["result"])
其中params
为查询参数,json
为请求体。根据具体API要求
,
分隔get/post/del/put
根据需要使用记得打开相应权限
import configparser
import os
# 读取配置文件
def getConfig(filename, section, option):
"""
:param filename 文件名称
:param section: 服务
:param option: 配置参数
:return:返回配置信息
"""# 获取当前目录路径
proDir = os.path.split(os.path.realpath(__file__))[0]
# print(proDir)
# 拼接路径获取完整路径
configPath = os.path.join(proDir, filename)
# print(configPath)
# 创建ConfigParser对象
conf = configparser.ConfigParser()
# 读取文件内容
conf.read(configPath)
config = conf.get(section, option)
return config
[Get_TB_Data]
app_id=XXXXXXXX
app_secret=XXXXXXXX
这方面可以自己拓展
我个人是写了专门的:数据筛选脚本(根据条件),数据处理脚本(生成json,txt,csv,将国际时间转为北京时间),邮件发送脚本
主要是我自己懒得把代码搬上来了,因为逻辑全是连在一起的,不太好动。如果有需求,可以发送评论,如果方便,我会找机会放上来。
如果追求搜索任务时的自由度的话,可以尝试在历史版本中的TQL查询:https://open.teambition.com/docs/apis/6321c6d4912d20d3b5a4b0b0
Teambition的维护并不好,文档和API中有许多错漏,我已经在10月13向阿里的相关开发者提交了一下报告,不知道何时能修好。这报告也不全面,是后面才想起来写的。仅供参考。
from __future__ import absolute_import, unicode_literals
import requests, time, jwt
class GetTeamBitionEvents(object):
def __init__(self):
self.app_id = 'XXXXXXXXXXXXXXXXXXX'
self.app_secret = 'XXXXXXXXXXXXXXXXXXX'
self.company_url = 'https://www.teambition.com/organization/'
self.company_id = 'XXXXXXXXXXXXXXXXXXX'
self.callback_url = self.company_url + self.company_id
self.user_code = ''
self.auth_url = 'https://account.teambition.com/oauth2/authorize?client_id=' + self.app_id + '&redirect_uri=' + self.callback_url
def get_aptoken(self):
now_time = int(time.time())
expire_time = now_time + 36000 # 1 小时后超时
token_dict = {'iat': now_time,
'_appId': '%s' % self.app_id,
'exp': expire_time,
}
headers = {
'typ': 'jwt',
'alg': 'HS256'
# 声明所使用的算法
}
encoded = jwt.encode(payload=token_dict, key=self.app_secret, headers=headers,
algorithm='HS256') # .decode('ascii')
return encoded
def post_userapp_visible(self):
url = 'https://open.teambition.com/api/org/info'
app_token = (self.get_aptoken()).replace("\n", "").replace('\r', '')
headers = {
"Authorization": 'Bearer %s' % app_token,
}
params = {
"orgId": '%s' % self.company_id
}
return requests.get(url, params=params, headers=headers)
if __name__ == '__main__':
tb = GetTeamBitionEvents()
result = tb.post_userapp_visible()
print(result.json())
print(result.json()["result"])
有问题
{'code': 403, 'errorMessage': 'Forbidden: authbase.Verify failed: Forbidden: no permission to access resource, appID(6332aa802cd25c2c2880e56b) serviceID(5d4ce50b900cea004806c15a) tenant() resource(organization) action(1)', 'result': None}
None
from __future__ import absolute_import, unicode_literals
import requests, time, jwt
class GetTeamBitionEvents(object):
def __init__(self):
self.app_id = 'XXXXXXXXXXXXXXXXXXX'
self.app_secret = 'XXXXXXXXXXXXXXXXXXX'
self.company_url = 'https://www.teambition.com/organization/'
self.company_id = 'XXXXXXXXXXXXXXXXXXX' # 测试用公司
self.callback_url = self.company_url + self.company_id
self.user_id='XXXXXXXXXXXXXXXXXXX'
self.user_code = ''
self.auth_url = 'https://account.teambition.com/oauth2/authorize?client_id=' + self.app_id + '&redirect_uri=' + self.callback_url
def get_aptoken(self):
now_time = int(time.time())
expire_time = now_time + 36000 # 1 小时后超时
token_dict = {'iat': now_time,
'_appId': '%s' % self.app_id,
'exp': expire_time,
}
headers = {
'typ': 'jwt',
'alg': 'HS256'
# 声明所使用的算法
}
encoded = jwt.encode(payload=token_dict, key=self.app_secret, headers=headers,
algorithm='HS256') # .decode('ascii')
return encoded
def post_create_freetask(self,xoperatorid,content):
url = f'https://open.teambition.com/api/organization-task/create'
app_token = (self.get_aptoken()).replace("\n", "").replace('\r', '')
headers = {
'x-operator-id': xoperatorid,
'Authorization': 'Bearer %s' % app_token,
'X-Tenant-Id': '%s' % self.company_id,
'X-Tenant-Type': 'organization',
}
params={
'content':content
}
return requests.post(url,json=params, headers=headers)
if __name__ == '__main__':
tb = GetTeamBitionEvents()
xoperatorid='63310bc0b2b7b2cf2ca8a3b2'
content='all right'
result = tb.post_create_freetask(xoperatorid,content)
print(result.json())
print(result.json()["result"])
有问题
{'code': 403, 'errorMessage': '系统错误', 'result': None}
同上报错
同上
同上
这几个都没测了,感觉会是一样的结果
{'code': 403, 'errorMessage': '应用的接口访问权限受限', 'result': None}
这几个也都没测了
{'code': 404, 'errorMessage': '访问的资源不存在', 'result': None}
我估计这是被弃用的,因为后面有一条简介一模一样的接口
而且object中的参数缺失
{'code': 403, 'errorMessage': '系统错误', 'result': None}
{'code': 500, 'errorMessage': 'internal server error', 'result': None}
{'updated': '2022-10-13T06:56:39.469Z'}
运行完毕后,并未让已归档项目回复
项目中有一个搜索项目分组
,不会报错
{'code': 403, 'errorMessage': '系统错误', 'result': None}
文档部分,只记录了在项目
条目下的错误
查询参数organizationId
是必填字段
请求体object
缺少参数说明,或者说可能不需要
文档请求头描述中缺少X-Operator-Id
请求体object中name
是必填项
请求体object中name、templateId
是必填项
请求体object中name
是必填项
{'code': 400, 'errorMessage': '参数有误: 应当有必需属性 projectRoleIds', 'result': None}
在文档里找不到projectRoleIds
文档缺少:X-Operator-Id
必填
userIds、roleIds
为必填参数
x-operator-id必填
{'code': 400, 'errorMessage': '参数有误: required: $add or $del', 'result': None}
文档内没有$add or $del
相关解释
x-operator-id必填
x-operator-id必填
x-operator-id必填
其实应该放在任务一栏下面
x-operator-id必填,projectId 也是必须的
x-operator-id必填,projectId 是必须的,文档里写了object但没有任何参数,我觉得也用不上
没有路径参数,文档中却给了两个
手机扫一扫
移动阅读更方便
你可能感兴趣的文章