dagster-dingtalk 0.1.11__tar.gz → 0.1.13__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,210 @@
1
+ Metadata-Version: 2.1
2
+ Name: dagster-dingtalk
3
+ Version: 0.1.13
4
+ Summary: A dagster plugin for the DingTalk
5
+ Author: YiZixuan
6
+ Author-email: sqkkyzx@qq.com
7
+ Requires-Python: >=3.10,<3.13
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.10
10
+ Classifier: Programming Language :: Python :: 3.11
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Requires-Dist: dagster (>=1.8.10)
13
+ Requires-Dist: httpx (>=0.27.2,<0.28.0)
14
+ Requires-Dist: pydantic (>=2.9.2,<3.0.0)
15
+ Description-Content-Type: text/markdown
16
+
17
+ # 钉钉与 Dagster 集成
18
+
19
+ ---
20
+
21
+ ## 介绍
22
+
23
+ 该 Dagster 集成是为了更便捷的调用钉钉(DingTalk)的API,集成提供了两个 Dagster Resource。
24
+
25
+
26
+ ## DingTalkWebhookResource
27
+
28
+ 该资源允许定义单个钉钉自定义机器人的 Webhook 端点,以便于发送文本、Markdown、Link、 ActionCard、FeedCard 消息,消息具体样式可参考
29
+ [钉钉开放平台 | 自定义机器人发送消息的消息类型](https://open.dingtalk.com/document/orgapp/custom-bot-send-message-type)。
30
+
31
+ ### 配置项:
32
+
33
+ - **access_token** (str):
34
+ 机器人 Webhook 地址中的 access_token 值。
35
+ - **secret** (str, optional):
36
+ 如使用加签安全配置,则需传签名密钥。默认值为 None。
37
+ - **alias** (str, optional):
38
+ 如提供别名,可以在使用 `MultiDingTalkWebhookResource` 中使用别名进行 webhook 选择。默认值为 None。
39
+ - **base_url** (str, optional):
40
+ 通用地址,一般无需更改。默认值为 “https://oapi.dingtalk.com/robot/send”。
41
+
42
+ ### 用例:
43
+
44
+ ##### 1. 使用单个资源:
45
+ ```python
46
+ from dagster_dingtalk import DingTalkWebhookResource
47
+ from dagster import op, In, OpExecutionContext, job, Definitions
48
+
49
+ @op(required_resource_keys={"dingtalk_webhook"}, ins={"text": In(str)})
50
+ def op_send_text(context:OpExecutionContext, text:str):
51
+ dingtalk_webhook:DingTalkWebhookResource = context.resources.dingtalk_webhook
52
+ dingtalk_webhook.send_text(text)
53
+
54
+ @job
55
+ def job_send_text():
56
+ op_send_text()
57
+
58
+ defs = Definitions(
59
+ jobs=[job_send_text],
60
+ resources={"dingtalk_webhook": DingTalkWebhookResource(access_token = "<access_token>", secret = "<secret>")}
61
+ )
62
+ ```
63
+
64
+ ##### 2. 启动时动态构建企业内部应用资源, 可参考 [Dagster文档 | 在启动时配置资源](https://docs.dagster.io/concepts/resources#configuring-resources-at-launch-time)
65
+
66
+ ```python
67
+ from dagster_dingtalk import DingTalkWebhookResource
68
+ from dagster import op, In, OpExecutionContext, job, Definitions, schedule, RunRequest, RunConfig
69
+
70
+ @op(required_resource_keys={"dingtalk_webhook"}, ins={"text": In(str)})
71
+ def op_send_text(context:OpExecutionContext, text:str):
72
+ dingtalk_webhook:DingTalkWebhookResource = context.resources.dingtalk_webhook
73
+ dingtalk_webhook.send_text(text)
74
+
75
+ @job
76
+ def job_send_text():
77
+ op_send_text()
78
+
79
+ dingtalk_webhooks = {
80
+ "Group1" : DingTalkWebhookResource(access_token="<access_token>", secret="<secret>", alias="Group1"),
81
+ "Group2" : DingTalkWebhookResource(access_token="<access_token>", secret="<secret>", alias="Group2")
82
+ }
83
+
84
+ defs = Definitions(
85
+ jobs=[job_send_text],
86
+ resources={"dingtalk_webhook": DingTalkWebhookResource.configure_at_launch()}
87
+ )
88
+
89
+ @schedule(cron_schedule="20 9 * * *", job=job_send_text)
90
+ def schedule_user_info():
91
+ return RunRequest(run_config=RunConfig(
92
+ ops={"op_send_text": {"inputs": {"text": "This a test text."}}},
93
+ resources={"dingtalk": dingtalk_webhooks["Group1"]},
94
+ ))
95
+ ```
96
+
97
+ ### 注意:
98
+
99
+ 应该永远避免直接将密钥字符串直接配置给资源,这会导致在 dagster 前端用户界面暴露密钥。
100
+ 应当从环境变量中读取密钥。你可以在代码中注册临时的环境变量,或从系统中引入环境变量。
101
+
102
+ ```python
103
+ import os
104
+ from dagster import EnvVar
105
+ from dagster_dingtalk import DingTalkWebhookResource
106
+
107
+ # 直接在代码中注册临时的环境变量
108
+ os.environ.update({'access_token_name': "<your-access_token>"})
109
+ os.environ.update({'secret_name': "<your-secret>"})
110
+
111
+ webhook = DingTalkWebhookResource(access_token=EnvVar("access_token_name"), secret=EnvVar("secret_name"))
112
+ ```
113
+
114
+ ## DingTalkAppResource
115
+
116
+ 该 Dagster 资源允许定义一个钉钉的 API Client,更加便捷地调用钉钉服务端企业内部应用 API
117
+
118
+ [钉钉服务端 API](https://open.dingtalk.com/document/orgapp/api-overview) 企业内部应用部分的第三方封装。
119
+
120
+ 通过此资源,可以调用部分钉钉服务端 API。具体封装的 API 可以在 IDE 中通过引入 `DingTalkAppClient` 类来查看 IDE 提示:
121
+
122
+ ```python
123
+ from dagster_dingtalk import DingTalkAppClient
124
+
125
+ dingtalk: DingTalkAppClient
126
+ ```
127
+
128
+ ### 配置项:
129
+
130
+ - **AppID** (str):
131
+ 应用应用唯一标识 AppID,作为缓存标识符使用。不传入则不缓存鉴权。
132
+ - **AgentID** (int, optional):
133
+ 原企业内部应用 AgentId ,部分 API 会使用到。默认值为 None
134
+ - **AppName** (str, optional):
135
+ 应用名。
136
+ - **ClientId** (str):
137
+ 应用的 Client ID ,原 AppKey 和 SuiteKey
138
+ - **ClientSecret** (str):
139
+ 应用的 Client Secret ,原 AppSecret 和 SuiteSecret
140
+
141
+ ### 用例
142
+
143
+ ##### 1. 使用单一的企业内部应用资源。
144
+
145
+ ```python
146
+ from dagster_dingtalk import DingTalkAppResource, DingTalkAppClient
147
+ from dagster import op, In, OpExecutionContext, job, Definitions, EnvVar
148
+
149
+ @op(required_resource_keys={"dingtalk"}, ins={"user_id": In(str)})
150
+ def op_user_info(context:OpExecutionContext, user_id:str):
151
+ dingtalk:DingTalkAppClient = context.resources.dingtalk
152
+ result = dingtalk.通讯录管理.用户管理.查询用户详情(user_id).get('result')
153
+ context.log.info(result)
154
+
155
+ @job
156
+ def job_user_info():
157
+ op_user_info()
158
+
159
+ defs = Definitions(
160
+ jobs=[job_user_info],
161
+ resources={"dingtalk": DingTalkAppResource(
162
+ AppID = "<the-app-id>",
163
+ ClientId = "<the-client-id>",
164
+ ClientSecret = EnvVar("<the-client-secret-env-name>"),
165
+ )})
166
+ ```
167
+
168
+ ##### 2. 启动时动态构建企业内部应用资源, 可参考 [Dagster文档 | 在启动时配置资源](https://docs.dagster.io/concepts/resources#configuring-resources-at-launch-time)
169
+
170
+ ```python
171
+ from dagster_dingtalk import DingTalkAppResource, DingTalkAppClient
172
+ from dagster import op, In, OpExecutionContext, job, Definitions, schedule, RunRequest, RunConfig, EnvVar
173
+
174
+ @op(required_resource_keys={"dingtalk"}, ins={"user_id": In(str)})
175
+ def op_user_info(context:OpExecutionContext, user_id:str):
176
+ dingtalk:DingTalkAppClient = context.resources.dingtalk
177
+ result = dingtalk.通讯录管理.用户管理.查询用户详情(user_id).get('result')
178
+ context.log.info(result)
179
+
180
+ @job
181
+ def job_user_info():
182
+ op_user_info()
183
+
184
+ dingtalk_apps = {
185
+ "App1" : DingTalkAppResource(
186
+ AppID = "<app-1-app-id>",
187
+ ClientId = "<app-1-client-id>",
188
+ ClientSecret = EnvVar("<app-1-client-secret-env-name>"),
189
+ ),
190
+ "App2" : DingTalkAppResource(
191
+ AppID = "<app-2-app-id>",
192
+ ClientId = "<app-2-client-id>",
193
+ ClientSecret = EnvVar("<app-2-client-secret-env-name>"),
194
+ )
195
+ }
196
+
197
+ defs = Definitions(jobs=[job_user_info], resources={"dingtalk": DingTalkAppResource.configure_at_launch()})
198
+
199
+ @schedule(cron_schedule="20 9 * * *", job=job_user_info)
200
+ def schedule_user_info():
201
+ return RunRequest(run_config=RunConfig(
202
+ ops={"op_user_info": {"inputs": {"user_id": "<the-user-id>"}}},
203
+ resources={"dingtalk": dingtalk_apps["App1"]},
204
+ ))
205
+ ```
206
+
207
+ ### 注意:
208
+
209
+ 应该永远避免直接将密钥字符串直接配置给资源,这会导致在 dagster 前端用户界面暴露密钥。你可以在代码中注册临时的环境变量,或从系统中引入环境变量。
210
+
@@ -0,0 +1,193 @@
1
+ # 钉钉与 Dagster 集成
2
+
3
+ ---
4
+
5
+ ## 介绍
6
+
7
+ 该 Dagster 集成是为了更便捷的调用钉钉(DingTalk)的API,集成提供了两个 Dagster Resource。
8
+
9
+
10
+ ## DingTalkWebhookResource
11
+
12
+ 该资源允许定义单个钉钉自定义机器人的 Webhook 端点,以便于发送文本、Markdown、Link、 ActionCard、FeedCard 消息,消息具体样式可参考
13
+ [钉钉开放平台 | 自定义机器人发送消息的消息类型](https://open.dingtalk.com/document/orgapp/custom-bot-send-message-type)。
14
+
15
+ ### 配置项:
16
+
17
+ - **access_token** (str):
18
+ 机器人 Webhook 地址中的 access_token 值。
19
+ - **secret** (str, optional):
20
+ 如使用加签安全配置,则需传签名密钥。默认值为 None。
21
+ - **alias** (str, optional):
22
+ 如提供别名,可以在使用 `MultiDingTalkWebhookResource` 中使用别名进行 webhook 选择。默认值为 None。
23
+ - **base_url** (str, optional):
24
+ 通用地址,一般无需更改。默认值为 “https://oapi.dingtalk.com/robot/send”。
25
+
26
+ ### 用例:
27
+
28
+ ##### 1. 使用单个资源:
29
+ ```python
30
+ from dagster_dingtalk import DingTalkWebhookResource
31
+ from dagster import op, In, OpExecutionContext, job, Definitions
32
+
33
+ @op(required_resource_keys={"dingtalk_webhook"}, ins={"text": In(str)})
34
+ def op_send_text(context:OpExecutionContext, text:str):
35
+ dingtalk_webhook:DingTalkWebhookResource = context.resources.dingtalk_webhook
36
+ dingtalk_webhook.send_text(text)
37
+
38
+ @job
39
+ def job_send_text():
40
+ op_send_text()
41
+
42
+ defs = Definitions(
43
+ jobs=[job_send_text],
44
+ resources={"dingtalk_webhook": DingTalkWebhookResource(access_token = "<access_token>", secret = "<secret>")}
45
+ )
46
+ ```
47
+
48
+ ##### 2. 启动时动态构建企业内部应用资源, 可参考 [Dagster文档 | 在启动时配置资源](https://docs.dagster.io/concepts/resources#configuring-resources-at-launch-time)
49
+
50
+ ```python
51
+ from dagster_dingtalk import DingTalkWebhookResource
52
+ from dagster import op, In, OpExecutionContext, job, Definitions, schedule, RunRequest, RunConfig
53
+
54
+ @op(required_resource_keys={"dingtalk_webhook"}, ins={"text": In(str)})
55
+ def op_send_text(context:OpExecutionContext, text:str):
56
+ dingtalk_webhook:DingTalkWebhookResource = context.resources.dingtalk_webhook
57
+ dingtalk_webhook.send_text(text)
58
+
59
+ @job
60
+ def job_send_text():
61
+ op_send_text()
62
+
63
+ dingtalk_webhooks = {
64
+ "Group1" : DingTalkWebhookResource(access_token="<access_token>", secret="<secret>", alias="Group1"),
65
+ "Group2" : DingTalkWebhookResource(access_token="<access_token>", secret="<secret>", alias="Group2")
66
+ }
67
+
68
+ defs = Definitions(
69
+ jobs=[job_send_text],
70
+ resources={"dingtalk_webhook": DingTalkWebhookResource.configure_at_launch()}
71
+ )
72
+
73
+ @schedule(cron_schedule="20 9 * * *", job=job_send_text)
74
+ def schedule_user_info():
75
+ return RunRequest(run_config=RunConfig(
76
+ ops={"op_send_text": {"inputs": {"text": "This a test text."}}},
77
+ resources={"dingtalk": dingtalk_webhooks["Group1"]},
78
+ ))
79
+ ```
80
+
81
+ ### 注意:
82
+
83
+ 应该永远避免直接将密钥字符串直接配置给资源,这会导致在 dagster 前端用户界面暴露密钥。
84
+ 应当从环境变量中读取密钥。你可以在代码中注册临时的环境变量,或从系统中引入环境变量。
85
+
86
+ ```python
87
+ import os
88
+ from dagster import EnvVar
89
+ from dagster_dingtalk import DingTalkWebhookResource
90
+
91
+ # 直接在代码中注册临时的环境变量
92
+ os.environ.update({'access_token_name': "<your-access_token>"})
93
+ os.environ.update({'secret_name': "<your-secret>"})
94
+
95
+ webhook = DingTalkWebhookResource(access_token=EnvVar("access_token_name"), secret=EnvVar("secret_name"))
96
+ ```
97
+
98
+ ## DingTalkAppResource
99
+
100
+ 该 Dagster 资源允许定义一个钉钉的 API Client,更加便捷地调用钉钉服务端企业内部应用 API
101
+
102
+ [钉钉服务端 API](https://open.dingtalk.com/document/orgapp/api-overview) 企业内部应用部分的第三方封装。
103
+
104
+ 通过此资源,可以调用部分钉钉服务端 API。具体封装的 API 可以在 IDE 中通过引入 `DingTalkAppClient` 类来查看 IDE 提示:
105
+
106
+ ```python
107
+ from dagster_dingtalk import DingTalkAppClient
108
+
109
+ dingtalk: DingTalkAppClient
110
+ ```
111
+
112
+ ### 配置项:
113
+
114
+ - **AppID** (str):
115
+ 应用应用唯一标识 AppID,作为缓存标识符使用。不传入则不缓存鉴权。
116
+ - **AgentID** (int, optional):
117
+ 原企业内部应用 AgentId ,部分 API 会使用到。默认值为 None
118
+ - **AppName** (str, optional):
119
+ 应用名。
120
+ - **ClientId** (str):
121
+ 应用的 Client ID ,原 AppKey 和 SuiteKey
122
+ - **ClientSecret** (str):
123
+ 应用的 Client Secret ,原 AppSecret 和 SuiteSecret
124
+
125
+ ### 用例
126
+
127
+ ##### 1. 使用单一的企业内部应用资源。
128
+
129
+ ```python
130
+ from dagster_dingtalk import DingTalkAppResource, DingTalkAppClient
131
+ from dagster import op, In, OpExecutionContext, job, Definitions, EnvVar
132
+
133
+ @op(required_resource_keys={"dingtalk"}, ins={"user_id": In(str)})
134
+ def op_user_info(context:OpExecutionContext, user_id:str):
135
+ dingtalk:DingTalkAppClient = context.resources.dingtalk
136
+ result = dingtalk.通讯录管理.用户管理.查询用户详情(user_id).get('result')
137
+ context.log.info(result)
138
+
139
+ @job
140
+ def job_user_info():
141
+ op_user_info()
142
+
143
+ defs = Definitions(
144
+ jobs=[job_user_info],
145
+ resources={"dingtalk": DingTalkAppResource(
146
+ AppID = "<the-app-id>",
147
+ ClientId = "<the-client-id>",
148
+ ClientSecret = EnvVar("<the-client-secret-env-name>"),
149
+ )})
150
+ ```
151
+
152
+ ##### 2. 启动时动态构建企业内部应用资源, 可参考 [Dagster文档 | 在启动时配置资源](https://docs.dagster.io/concepts/resources#configuring-resources-at-launch-time)
153
+
154
+ ```python
155
+ from dagster_dingtalk import DingTalkAppResource, DingTalkAppClient
156
+ from dagster import op, In, OpExecutionContext, job, Definitions, schedule, RunRequest, RunConfig, EnvVar
157
+
158
+ @op(required_resource_keys={"dingtalk"}, ins={"user_id": In(str)})
159
+ def op_user_info(context:OpExecutionContext, user_id:str):
160
+ dingtalk:DingTalkAppClient = context.resources.dingtalk
161
+ result = dingtalk.通讯录管理.用户管理.查询用户详情(user_id).get('result')
162
+ context.log.info(result)
163
+
164
+ @job
165
+ def job_user_info():
166
+ op_user_info()
167
+
168
+ dingtalk_apps = {
169
+ "App1" : DingTalkAppResource(
170
+ AppID = "<app-1-app-id>",
171
+ ClientId = "<app-1-client-id>",
172
+ ClientSecret = EnvVar("<app-1-client-secret-env-name>"),
173
+ ),
174
+ "App2" : DingTalkAppResource(
175
+ AppID = "<app-2-app-id>",
176
+ ClientId = "<app-2-client-id>",
177
+ ClientSecret = EnvVar("<app-2-client-secret-env-name>"),
178
+ )
179
+ }
180
+
181
+ defs = Definitions(jobs=[job_user_info], resources={"dingtalk": DingTalkAppResource.configure_at_launch()})
182
+
183
+ @schedule(cron_schedule="20 9 * * *", job=job_user_info)
184
+ def schedule_user_info():
185
+ return RunRequest(run_config=RunConfig(
186
+ ops={"op_user_info": {"inputs": {"user_id": "<the-user-id>"}}},
187
+ resources={"dingtalk": dingtalk_apps["App1"]},
188
+ ))
189
+ ```
190
+
191
+ ### 注意:
192
+
193
+ 应该永远避免直接将密钥字符串直接配置给资源,这会导致在 dagster 前端用户界面暴露密钥。你可以在代码中注册临时的环境变量,或从系统中引入环境变量。
@@ -40,17 +40,10 @@ class DingTalkClient:
40
40
  else:
41
41
  try:
42
42
  with open(access_token_cache, 'rb') as f:
43
- cache_file = f.read()
43
+ all_access_token = pickle.loads(f.read())
44
44
  except Exception as e:
45
45
  logging.error(e)
46
- cache_file = None
47
- renew_reason = "鉴权缓存读取错误"
48
-
49
- if cache_file:
50
- try:
51
- all_access_token = pickle.loads(cache_file)
52
- except pickle.PickleError:
53
- renew_reason = f"鉴权缓存解析错误"
46
+ renew_reason = "鉴权缓存读取或解析错误"
54
47
 
55
48
  if all_access_token:
56
49
  app_access_token = all_access_token.get(self.app_id)
@@ -44,7 +44,7 @@ class DingTalkWebhookResource(ConfigurableResource):
44
44
  ### 配置项:
45
45
 
46
46
  - **access_token** (str):
47
- 机器人 Webhook 地址中的 access_token 值。
47
+ 机器人 Webhook 地址中的 access_token 值。
48
48
  - **secret** (str, optional):
49
49
  如使用加签安全配置,则需传签名密钥。默认值为 None。
50
50
  - **alias** (str, optional):
@@ -54,46 +54,50 @@ class DingTalkWebhookResource(ConfigurableResource):
54
54
 
55
55
  ### 用例:
56
56
 
57
- 1. 使用单个资源:
58
-
57
+ ##### 1. 使用单个资源:
59
58
  ```python
60
59
  from dagster_dingtalk import DingTalkWebhookResource
60
+ from dagster import op, In, OpExecutionContext, job, Definitions
61
61
 
62
62
  @op(required_resource_keys={"dingtalk_webhook"}, ins={"text": In(str)})
63
63
  def op_send_text(context:OpExecutionContext, text:str):
64
64
  dingtalk_webhook:DingTalkWebhookResource = context.resources.dingtalk_webhook
65
- result = dingtalk.send_text(text)
65
+ dingtalk_webhook.send_text(text)
66
66
 
67
67
  @job
68
68
  def job_send_text():
69
- op_send_text
69
+ op_send_text()
70
70
 
71
71
  defs = Definitions(
72
- jobs=job_user_info,
72
+ jobs=[job_send_text],
73
73
  resources={"dingtalk_webhook": DingTalkWebhookResource(access_token = "<access_token>", secret = "<secret>")}
74
74
  )
75
75
  ```
76
76
 
77
- 2. 启动时动态构建企业内部应用资源, 可参考 [Dagster文档 | 在启动时配置资源](https://docs.dagster.io/concepts/resources#configuring-resources-at-launch-time)
77
+ ##### 2. 启动时动态构建企业内部应用资源, 可参考 [Dagster文档 | 在启动时配置资源](https://docs.dagster.io/concepts/resources#configuring-resources-at-launch-time)
78
78
 
79
79
  ```python
80
80
  from dagster_dingtalk import DingTalkWebhookResource
81
+ from dagster import op, In, OpExecutionContext, job, Definitions, schedule, RunRequest, RunConfig
81
82
 
82
83
  @op(required_resource_keys={"dingtalk_webhook"}, ins={"text": In(str)})
83
84
  def op_send_text(context:OpExecutionContext, text:str):
84
85
  dingtalk_webhook:DingTalkWebhookResource = context.resources.dingtalk_webhook
85
- result = dingtalk.send_text(text)
86
+ dingtalk_webhook.send_text(text)
86
87
 
87
88
  @job
88
89
  def job_send_text():
89
- op_send_text
90
+ op_send_text()
90
91
 
91
92
  dingtalk_webhooks = {
92
93
  "Group1" : DingTalkWebhookResource(access_token="<access_token>", secret="<secret>", alias="Group1"),
93
94
  "Group2" : DingTalkWebhookResource(access_token="<access_token>", secret="<secret>", alias="Group2")
94
95
  }
95
96
 
96
- defs = Definitions(jobs=job_send_text, resources={"dingtalk_webhook": DingTalkWebhookResource.configure_at_launch()})
97
+ defs = Definitions(
98
+ jobs=[job_send_text],
99
+ resources={"dingtalk_webhook": DingTalkWebhookResource.configure_at_launch()}
100
+ )
97
101
 
98
102
  @schedule(cron_schedule="20 9 * * *", job=job_send_text)
99
103
  def schedule_user_info():
@@ -109,16 +113,17 @@ class DingTalkWebhookResource(ConfigurableResource):
109
113
  应当从环境变量中读取密钥。你可以在代码中注册临时的环境变量,或从系统中引入环境变量。
110
114
 
111
115
  ```python
116
+
112
117
  import os
118
+ from dagster import EnvVar
113
119
  from dagster_dingtalk import DingTalkWebhookResource
114
120
 
115
121
  # 直接在代码中注册临时的环境变量
116
- os.environ.update({'access_token': "<access_token>"})
117
- os.environ.update({'secret': "<secret>"})
118
-
119
- webhook = DingTalkWebhookResource(access_token=EnvVar("access_token"), secret=EnvVar("secret"))
120
-
122
+ os.environ.update({'access_token_name': "<your-access_token>"})
123
+ os.environ.update({'secret_name': "<your-secret>"})
121
124
 
125
+ webhook = DingTalkWebhookResource(access_token=EnvVar("access_token_name"), secret=EnvVar("secret_name"))
126
+ ```
122
127
  """
123
128
 
124
129
  access_token: str = Field(description="Webhook地址中的 access_token 部分")
@@ -298,94 +303,100 @@ class DingTalkWebhookResource(ConfigurableResource):
298
303
 
299
304
  class DingTalkAppResource(ConfigurableResource):
300
305
  """
301
- [钉钉服务端 API](https://open.dingtalk.com/document/orgapp/api-overview) 企业内部应用部分的第三方封装。
302
-
303
- 通过此资源,可以调用部分钉钉服务端 API。具体封装的 API 可以在 IDE 中通过引入 `DingTalkAppClient` 类来查看 IDE 提示:
304
-
305
- `from dagster_dingtalk import DingTalkAppClient`
306
-
307
- ### 配置项:
308
-
309
- - **AppID** (str):
310
- 应用应用唯一标识 AppID,作为缓存标识符使用。不传入则不缓存鉴权。
311
- - **AgentID** (int, optional):
312
- 原企业内部应用 AgentId ,部分 API 会使用到。默认值为 None
313
- - **AppName** (str, optional):
314
- 应用名。
315
- - **ClientId** (str):
316
- 应用的 Client ID ,原 AppKey 和 SuiteKey
317
- - **ClientSecret** (str):
318
- 应用的 Client Secret ,原 AppSecret 和 SuiteSecret
319
-
320
- ### 用例:
321
-
322
- 1. 使用单一的企业内部应用资源。
323
-
324
- ```python
325
- from dagster_dingtalk import DingTalkAppResource
326
-
327
- @op(required_resource_keys={"dingtalk"}, ins={"user_id": In(str)})
328
- def op_user_info(context:OpExecutionContext, user_id:str):
329
- dingtalk:DingTalkAppClient = context.resources.dingtalk
330
- result = dingtalk.通讯录管理.用户管理.查询用户详情(user_id).get('result')
331
- context.log.info(result)
332
-
333
- @job
334
- def job_user_info():
335
- op_user_info
336
-
337
- defs = Definitions(jobs=job_user_info, resources={
338
- "dingtalk": DingTalkAppResource(
339
- AppID = "<the-app-id>",
340
- ClientId = "<the-client-id>",
341
- ClientSecret = EnvVar("<the-client-secret-env-name>"),
342
- )
343
- })
344
- ```
345
-
346
- 2. 启动时动态构建企业内部应用资源, 可参考 [Dagster文档 | 在启动时配置资源](https://docs.dagster.io/concepts/resources#configuring-resources-at-launch-time)
347
-
348
- ```python
349
- from dagster_dingtalk import DingTalkAppResource
350
-
351
- @op(required_resource_keys={"dingtalk"}, ins={"user_id": In(str)})
352
- def op_user_info(context:OpExecutionContext, user_id:str):
353
- dingtalk:DingTalkAppClient = context.resources.dingtalk
354
- result = dingtalk.通讯录管理.用户管理.查询用户详情(user_id).get('result')
355
- context.log.info(result)
356
-
357
- @job
358
- def job_user_info():
359
- op_user_info()
360
-
361
- dingtalk_apps = {
362
- "App1" : DingTalkAppResource(
363
- AppID = "<app-1-app-id>",
364
- ClientId = "<app-1-client-id>",
365
- ClientSecret = EnvVar("<app-1-client-secret-env-name>"),
366
- ),
367
- "App2" : DingTalkAppResource(
368
- AppID = "<app-2-app-id>",
369
- ClientId = "<app-2-client-id>",
370
- ClientSecret = EnvVar("<app-2-client-secret-env-name>"),
371
- )
372
- }
373
-
374
- defs = Definitions(jobs=job_user_info, resources={"dingtalk": DingTalkAppResource.configure_at_launch()})
306
+ Dagster 资源允许定义一个钉钉的 API Client,更加便捷地调用钉钉服务端企业内部应用 API
307
+
308
+ [钉钉服务端 API](https://open.dingtalk.com/document/orgapp/api-overview) 企业内部应用部分的第三方封装。
309
+
310
+ 通过此资源,可以调用部分钉钉服务端 API。具体封装的 API 可以在 IDE 中通过引入 `DingTalkAppClient` 类来查看 IDE 提示:
311
+
312
+ ```python
313
+ from dagster_dingtalk import DingTalkAppClient
314
+
315
+ dingtalk: DingTalkAppClient
316
+ ```
317
+
318
+ ### 配置项:
319
+
320
+ - **AppID** (str):
321
+ 应用应用唯一标识 AppID,作为缓存标识符使用。不传入则不缓存鉴权。
322
+ - **AgentID** (int, optional):
323
+ 原企业内部应用 AgentId ,部分 API 会使用到。默认值为 None
324
+ - **AppName** (str, optional):
325
+ 应用名。
326
+ - **ClientId** (str):
327
+ 应用的 Client ID ,原 AppKey 和 SuiteKey
328
+ - **ClientSecret** (str):
329
+ 应用的 Client Secret ,原 AppSecret 和 SuiteSecret
330
+
331
+ ### 用例
332
+
333
+ ##### 1. 使用单一的企业内部应用资源。
334
+
335
+ ```python
336
+ from dagster_dingtalk import DingTalkAppResource, DingTalkAppClient
337
+ from dagster import op, In, OpExecutionContext, job, Definitions, EnvVar
338
+
339
+ @op(required_resource_keys={"dingtalk"}, ins={"user_id": In(str)})
340
+ def op_user_info(context:OpExecutionContext, user_id:str):
341
+ dingtalk:DingTalkAppClient = context.resources.dingtalk
342
+ result = dingtalk.通讯录管理.用户管理.查询用户详情(user_id).get('result')
343
+ context.log.info(result)
344
+
345
+ @job
346
+ def job_user_info():
347
+ op_user_info()
348
+
349
+ defs = Definitions(
350
+ jobs=[job_user_info],
351
+ resources={"dingtalk": DingTalkAppResource(
352
+ AppID = "<the-app-id>",
353
+ ClientId = "<the-client-id>",
354
+ ClientSecret = EnvVar("<the-client-secret-env-name>"),
355
+ )})
356
+ ```
357
+
358
+ ##### 2. 启动时动态构建企业内部应用资源, 可参考 [Dagster文档 | 在启动时配置资源](https://docs.dagster.io/concepts/resources#configuring-resources-at-launch-time)
359
+
360
+ ```python
361
+ from dagster_dingtalk import DingTalkAppResource, DingTalkAppClient
362
+ from dagster import op, In, OpExecutionContext, job, Definitions, schedule, RunRequest, RunConfig, EnvVar
363
+
364
+ @op(required_resource_keys={"dingtalk"}, ins={"user_id": In(str)})
365
+ def op_user_info(context:OpExecutionContext, user_id:str):
366
+ dingtalk:DingTalkAppClient = context.resources.dingtalk
367
+ result = dingtalk.通讯录管理.用户管理.查询用户详情(user_id).get('result')
368
+ context.log.info(result)
369
+
370
+ @job
371
+ def job_user_info():
372
+ op_user_info()
373
+
374
+ dingtalk_apps = {
375
+ "App1" : DingTalkAppResource(
376
+ AppID = "<app-1-app-id>",
377
+ ClientId = "<app-1-client-id>",
378
+ ClientSecret = EnvVar("<app-1-client-secret-env-name>"),
379
+ ),
380
+ "App2" : DingTalkAppResource(
381
+ AppID = "<app-2-app-id>",
382
+ ClientId = "<app-2-client-id>",
383
+ ClientSecret = EnvVar("<app-2-client-secret-env-name>"),
384
+ )
385
+ }
375
386
 
376
- @schedule(cron_schedule="20 9 * * *", job=job_user_info)
377
- def schedule_user_info():
378
- return RunRequest(run_config=RunConfig(
379
- ops={"op_user_info": {"inputs": {"user_id": "<the-user-id>"}}},
380
- resources={"dingtalk": dingtalk_apps["App1"]},
381
- ))
382
- ```
387
+ defs = Definitions(jobs=[job_user_info], resources={"dingtalk": DingTalkAppResource.configure_at_launch()})
383
388
 
384
- ### 注意:
389
+ @schedule(cron_schedule="20 9 * * *", job=job_user_info)
390
+ def schedule_user_info():
391
+ return RunRequest(run_config=RunConfig(
392
+ ops={"op_user_info": {"inputs": {"user_id": "<the-user-id>"}}},
393
+ resources={"dingtalk": dingtalk_apps["App1"]},
394
+ ))
395
+ ```
385
396
 
386
- 应该永远避免直接将密钥字符串直接配置给资源,这会导致在 dagster 前端用户界面暴露密钥。
387
- 应当从环境变量中读取密钥。你可以在代码中注册临时的环境变量,或从系统中引入环境变量。
397
+ ### 注意:
388
398
 
399
+ 应该永远避免直接将密钥字符串直接配置给资源,这会导致在 dagster 前端用户界面暴露密钥。你可以在代码中注册临时的环境变量,或从系统中引入环境变量。
389
400
  """
390
401
 
391
402
  AppID: str = Field(description="应用应用唯一标识 AppID,作为缓存标识符使用。不传入则不缓存鉴权。")
@@ -0,0 +1 @@
1
+ __version__ = "0.1.13"
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "dagster-dingtalk"
3
- version = "0.1.11"
3
+ version = "0.1.13"
4
4
  description = "A dagster plugin for the DingTalk"
5
5
  authors = ["YiZixuan <sqkkyzx@qq.com>"]
6
6
  readme = "README.md"
@@ -9,7 +9,7 @@ readme = "README.md"
9
9
  python = ">=3.10,<3.13"
10
10
  httpx = "^0.27.2"
11
11
  pydantic = "^2.9.2"
12
- dagster = "^1.8.10"
12
+ dagster = ">=1.8.10"
13
13
 
14
14
 
15
15
  [build-system]
@@ -1,38 +0,0 @@
1
- Metadata-Version: 2.1
2
- Name: dagster-dingtalk
3
- Version: 0.1.11
4
- Summary: A dagster plugin for the DingTalk
5
- Author: YiZixuan
6
- Author-email: sqkkyzx@qq.com
7
- Requires-Python: >=3.10,<3.13
8
- Classifier: Programming Language :: Python :: 3
9
- Classifier: Programming Language :: Python :: 3.10
10
- Classifier: Programming Language :: Python :: 3.11
11
- Classifier: Programming Language :: Python :: 3.12
12
- Requires-Dist: dagster (>=1.8.10,<2.0.0)
13
- Requires-Dist: httpx (>=0.27.2,<0.28.0)
14
- Requires-Dist: pydantic (>=2.9.2,<3.0.0)
15
- Description-Content-Type: text/markdown
16
-
17
- # 钉钉与 Dagster 集成
18
-
19
- ---
20
-
21
- ## 介绍
22
-
23
- 该 Dagster 集成是为了更便捷的调用钉钉(DingTalk)的API,集成提供了两个 Dagster Resource。
24
-
25
-
26
- ## Webhook 资源
27
-
28
- ### DingTalkWebhookResource
29
-
30
- 该资源允许定义单个钉钉自定义机器人的 Webhook 端点,以便于发送文本、Markdown
31
- 、Link、 ActionCard、FeedCard 消息,消息具体样式可参考
32
- [钉钉开放平台 | 自定义机器人发送消息的消息类型](https://open.dingtalk.com/document/orgapp/custom-bot-send-message-type) 。
33
-
34
-
35
- ### DingTalkAppResource
36
-
37
- 该 Dagster 资源允许定义一个钉钉的 API Client,更加便捷地调用钉钉服务端企业内部应用 API
38
-
@@ -1,21 +0,0 @@
1
- # 钉钉与 Dagster 集成
2
-
3
- ---
4
-
5
- ## 介绍
6
-
7
- 该 Dagster 集成是为了更便捷的调用钉钉(DingTalk)的API,集成提供了两个 Dagster Resource。
8
-
9
-
10
- ## Webhook 资源
11
-
12
- ### DingTalkWebhookResource
13
-
14
- 该资源允许定义单个钉钉自定义机器人的 Webhook 端点,以便于发送文本、Markdown
15
- 、Link、 ActionCard、FeedCard 消息,消息具体样式可参考
16
- [钉钉开放平台 | 自定义机器人发送消息的消息类型](https://open.dingtalk.com/document/orgapp/custom-bot-send-message-type) 。
17
-
18
-
19
- ### DingTalkAppResource
20
-
21
- 该 Dagster 资源允许定义一个钉钉的 API Client,更加便捷地调用钉钉服务端企业内部应用 API
@@ -1 +0,0 @@
1
- __version__ = "0.1.11"