请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

调用钉钉接口失败

示例代码:

!/usr/bin/env python

import argparse
import logging
from dingtalk_stream import AckMessage
import dingtalk_stream

def setup_logger():
logger = logging.getLogger()
handler = logging.StreamHandler()
handler.setFormatter(
logging.Formatter(’%(asctime)s %(name)-8s %(levelname)-8s %(message)s [%(filename)s:%(lineno)d]’))
logger.addHandler(handler)
logger.setLevel(logging.INFO)
return logger

def define_options():
parser = argparse.ArgumentParser()
parser.add_argument(
’–client_id’, dest=‘client_id’, required=True,
help=‘app_key or suite_key from https://open-dev.digntalk.com
)
parser.add_argument(
’–client_secret’, dest=‘client_secret’, required=True,
help=‘app_secret or suite_secret from https://open-dev.digntalk.com
)
options = parser.parse_args()
return options

class EchoTextHandler(dingtalk_stream.ChatbotHandler):
def init(self, logger: logging.Logger = None):
super(dingtalk_stream.ChatbotHandler, self).init()
if logger:
self.logger = logger

async def process(self, callback: dingtalk_stream.CallbackMessage):
    incoming_message = dingtalk_stream.ChatbotMessage.from_dict(callback.data)
    print(incoming_message)
    text = incoming_message.text.content.strip()
    self.reply_text(text, incoming_message)
    return AckMessage.STATUS_OK, 'OK'

def main():
logger = setup_logger()
options = define_options()

credential = dingtalk_stream.Credential(options.client_id, options.client_secret)
client = dingtalk_stream.DingTalkStreamClient(credential)
client.register_callback_handler(dingtalk_stream.chatbot.ChatbotMessage.TOPIC, EchoTextHandler(logger))
client.start_forever()

if name == ‘main’:
main()

出错信息:
python ./src/echo_text.py --client_id=“ding”Xxxxxxxxx --client_secret="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
2025-05-17 07:57:27,030 dingtalk_stream.client INFO open connection, url=https://api.dingtalk.com/v1.0/gateway/connections/open [stream.py:151]
2025-05-17 07:57:27,161 dingtalk_stream.client INFO endpoint is {‘endpoint’: ‘wss://wss-open-connection.dingtalk.com:443/connect’, ‘ticket’: ‘852473fc-32b1-11f0-8bff-5215a8ef9827’} [stream.py:73]
— Logging error —
Traceback (most recent call last):
File “/Users/imooc/Library/Caches/pypoetry/virtualenvs/dingtalk-langchain-G04N6Vrq-py3.12/lib/python3.12/site-packages/dingtalk_stream/stream.py”, line 76, in start
async with websockets.connect(uri) as websocket:
File “/Users/imooc/Library/Caches/pypoetry/virtualenvs/dingtalk-langchain-G04N6Vrq-py3.12/lib/python3.12/site-packages/websockets/asyncio/client.py”, line 587, in aenter
return await self
^^^^^^^^^^
File “/Users/imooc/Library/Caches/pypoetry/virtualenvs/dingtalk-langchain-G04N6Vrq-py3.12/lib/python3.12/site-packages/websockets/asyncio/client.py”, line 541, in await_impl
self.connection = await self.create_connection()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/Users/imooc/Library/Caches/pypoetry/virtualenvs/dingtalk-langchain-G04N6Vrq-py3.12/lib/python3.12/site-packages/websockets/asyncio/client.py”, line 467, in create_connection
_, connection = await loop.create_connection(factory, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/base_events.py”, line 1146, in create_connection
transport, protocol = await self._create_connection_transport(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File “/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/base_events.py”, line 1179, in _create_connection_transport
await waiter
File “/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/sslproto.py”, line 575, in _on_handshake_complete
raise handshake_exc
File “/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/sslproto.py”, line 557, in _do_handshake
self._sslobj.do_handshake()
File “/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/ssl.py”, line 917, in do_handshake
self._sslobj.do_handshake()
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File “/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/logging/init.py”, line 1160, in emit
msg = self.format(record)
^^^^^^^^^^^^^^^^^^^
File “/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/logging/init.py”, line 999, in format
return fmt.format(record)
^^^^^^^^^^^^^^^^^^
File “/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/logging/init.py”, line 703, in format
record.message = record.getMessage()
^^^^^^^^^^^^^^^^^^^
File “/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/logging/init.py”, line 392, in getMessage
msg = msg % self.args
^~~~~~~
TypeError: not all arguments converted during string formatting
Call stack:
File “/Users/imooc/ai_learn/dingtalk_langchain/./src/echo_text.py”, line 52, in
main()
File “/Users/imooc/ai_learn/dingtalk_langchain/./src/echo_text.py”, line 49, in main
client.start_forever()
File “/Users/imooc/Library/Caches/pypoetry/virtualenvs/dingtalk-langchain-G04N6Vrq-py3.12/lib/python3.12/site-packages/dingtalk_stream/stream.py”, line 144, in start_forever
asyncio.run(self.start())
File “/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/runners.py”, line 194, in run
return runner.run(main)
File “/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/runners.py”, line 118, in run
return self._loop.run_until_complete(task)
File “/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/base_events.py”, line 671, in run_until_complete
self.run_forever()
File “/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/base_events.py”, line 638, in run_forever
self._run_once()
File “/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/base_events.py”, line 1971, in _run_once
handle._run()
File “/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/asyncio/events.py”, line 84, in _run
self._context.run(self._callback, *self._args)
File “/Users/imooc/Library/Caches/pypoetry/virtualenvs/dingtalk-langchain-G04N6Vrq-py3.12/lib/python3.12/site-packages/dingtalk_stream/stream.py”, line 91, in start
self.logger.exception(‘unknown exception’, e)
Message: 'unknown exception’
Arguments: (SSLCertVerificationError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1000)’),)
2025-05-17 07:57:30,280 dingtalk_stream.client INFO open connection, url=https://api.dingtalk.com/v1.0/gateway/connections/open [stream.py:151]
2025-05-17 07:57:30,379 dingtalk_stream.client INFO endpoint is {‘endpoint’: ‘wss://wss-open-connection.dingtalk.com:443/connect’, ‘ticket’: ‘870e6f3f-32b1-11f0-8bff-5215a8ef9827’} [stream.py:73]

正在回答 回答被采纳积分+3

1回答

tomiezhang 2025-05-18 07:27:15

在macOS上,Python不会自动使用系统的证书存储。您需要安装证书:

  1. 找到证书安装脚本: 在您的Python安装目录中找到Install Certificates.command文件,通常位于:

    /Library/Frameworks/Python.framework/Versions/3.12/bin/Install Certificates.command
  2. 运行证书安装脚本

    cd /Library/Frameworks/Python.framework/Versions/3.12/bin/
    ./Install\ Certificates.command

调不通可以拿钉钉官方SDK示例本地跑一下:https://github.com/open-dingtalk/dingtalk-stream-sdk-python?tab=readme-ov-file
0 回复 有任何疑惑可以回复我~
  • 提问者 慕前端5264115 #1
    在本地全局环境下执行
    1. python3 -c "import certifi; print(certifi.where())"
    输出:/Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/certifi/cacert.pem
    在项目下的poetry创建的虚拟环境中执行:
    1. poetry add certifi
    2. python -c "import certifi; print(certifi.where())"
    输出:/Users/imooc/Library/Caches/pypoetry/virtualenvs/dingtalk-langchain-G04N6Vrq-py3.12/lib/python3.12/site-packages/certifi/cacert.pem
    这说明我本地已经有证书了呀!
    回复 有任何疑惑可以回复我~ 2025-05-18 15:17:03
问题已解决,确定采纳
还有疑问,暂不采纳
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号