使用simplematrixbotlib通过access token登录Matrix服务器失败求助
问题
使用simplematrixbotlib开发机器人时,密码认证方式完全正常:
import simplematrixbotlib as botlib creds = botlib.Creds( homeserver="https://example.org", username="username", password="password", session_stored_file="session.txt" ) bot = botlib.Bot(creds) bot.run()
但改用access token认证时,代码如下:
... creds = botlib.Creds( homeserver="https://example.org", username="username", access_token="syt_c2...DTJ", session_stored_file="session.txt" ) ...
出现以下错误:
Traceback (most recent call last): File "/home/shaman/simple-bot/venv/lib/python3.10/site-packages/cryptography/fernet.py", line 127, in _verify_signature h.verify(data[-32:]) File "/home/shaman/simple-bot/venv/lib/python3.10/site-packages/cryptography/hazmat/primitives/hmac.py", line 72, in verify ctx.verify(signature) File "/home/shaman/simple-bot/venv/lib/python3.10/site-packages/cryptography/hazmat/backends/openssl/hmac.py", line 85, in verify raise InvalidSignature("Signature did not match digest.") cryptography.exceptions.InvalidSignature: Signature did not match digest. During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/shaman/simple-bot/main.py", line 498, in <module> bot.run() File "/home/shaman/simple-bot/venv/lib/python3.10/site-packages/simplematrixbotlib/bot.py", line 84, in run asyncio.run(self.main()) File "/usr/lib/python3.10/asyncio/runners.py", line 44, in run return loop.run_until_complete(main) File "/usr/lib/python3.10/asyncio/base_events.py", line 649, in run_until_complete return future.result() File "/home/shaman/simple-bot/venv/lib/python3.10/site-packages/simplematrixbotlib/bot.py", line 43, in main self.creds.session_read_file() File "/home/shaman/simple-bot/venv/lib/python3.10/site-packages/simplematrixbotlib/auth.py", line 89, in session_read_file decrypted_session_data = fw.decrypt( File "/home/shaman/simple-bot/venv/lib/python3.10/site-packages/fernet_wrapper/__init__.py", line 37, in decrypt data = str(f.decrypt(token)) File "/home/shaman/simple-bot/venv/lib/python3.10/site-packages/cryptography/fernet.py", line 88, in decrypt return self._decrypt_data(data, timestamp, time_info) File "/home/shaman/simple-bot/venv/lib/python3.10/site-packages/cryptography/fernet.py", line 145, in _decrypt_data self._verify_signature(data) File "/home/shaman/simple-bot/venv/lib/python3.10/site-packages/cryptography/fernet.py", line 129, in _verify_signature raise InvalidToken cryptography.fernet.InvalidToken
已确认access token有效(浏览器中可正常使用),且严格遵循官方文档操作,仍无法正常登录,问题出在哪里?
解决方案
问题根源在于之前密码认证生成的session.txt文件与access token认证不兼容。当使用密码登录时,库会用基于密码的密钥加密会话数据并写入session.txt;而改用access token时,库尝试读取该文件,但加密密钥不匹配,导致解密失败抛出InvalidToken错误。
解决步骤:
- 删除之前生成的
session.txt文件,避免旧的加密会话数据干扰。 - 修改代码,确保
access_token参数正确,若不需要会话持久化可直接移除session_stored_file参数;若需要保留,库会基于access token重新生成合法的会话文件。
修改后的示例代码:
import simplematrixbotlib as botlib creds = botlib.Creds( homeserver="https://example.org", username="username", access_token="syt_c2...DTJ" # 可选:如果需要会话持久化,保留session_stored_file,库会自动生成新文件 # session_stored_file="new_session.txt" ) bot = botlib.Bot(creds) bot.run()
验证:运行修改后的代码,若保留session_stored_file,会生成新的会话文件,不会再出现解密错误。
内容的提问来源于stack exchange,提问作者Dmitry Kopylov
相关产品推荐
相关产品推荐

