使用atproto包的Bluesky机器人突发故障求助
问题解决:TypeError: JwtPayload.init() got an unexpected keyword argument 'aud'
错误原因
11月7日Bluesky官方更新了认证接口的JWT返回格式,新增了aud(受众)字段,但你当前使用的旧版本atproto库的JwtPayload类并未定义该参数,导致登录解析JWT时抛出类型错误。
解决方案
方案1:升级atproto库到最新版本(推荐)
执行以下命令更新依赖,新版本已适配Bluesky的JWT格式变更:
pip install --upgrade atproto
更新后重新运行机器人代码即可。
方案2:临时修改库源码(仅应急用)
如果暂时无法升级,可找到本地/VPS上atproto库的auth.py文件(路径参考报错信息中的C:\Users\username\AppData\Local\Programs\Python\Python311\Lib\site-packages\atproto\xrpc_client\client\auth.py),修改JwtPayload类的定义,添加aud参数:
class JwtPayload(BaseModel): sub: str exp: int aud: Optional[str] = None # 新增该行
保存后重新运行代码。
原机器人代码
import os import sys import glob import time import openai from datetime import datetime from atproto import Client, models from random import randint # API settings openai.api_key = "..." bluesky_api = Client('...') bluesky_user_name = '...' bluesky_password = '...' bluesky_api.login( bluesky_user_name, bluesky_password ) # Post Image bluesky_images = [] imgs = glob.glob("/var/www/bsky/img/*") i = randint(0, len(imgs) - 1) file_path = f'{imgs[i]}' with open(file_path, "rb") as f: upload = bluesky_api.com.atproto.repo.upload_blob(f) bluesky_images.append(models.AppBskyEmbedImages.Image(alt='CatBot Photo', image=upload.blob)) # Post Body chat = [] chat.append({"role": "system", "content": "..."}) chat.append({"role": "user", "content": "..."}) response = openai.ChatCompletion.create(model="gpt-3.5-turbo", messages=chat) msg = response["choices"][0]["message"]["content"].lstrip() bluesky_embed = models.AppBskyEmbedImages.Main(images=bluesky_images) bluesky_api.com.atproto.repo.create_record( models.ComAtprotoRepoCreateRecord.Data( repo=bluesky_api.me.did, collection=models.ids.AppBskyFeedPost, record=models.AppBskyFeedPost.Main( createdAt=datetime.now().isoformat(), text=msg, embed=bluesky_embed ), ) )
报错信息
Traceback (most recent call last): File "D:\Desktop\bsky.py", line 15, in <module> bluesky_api.login( File "C:\Users\username\AppData\Local\Programs\Python\Python311\Lib\site-packages\atproto\xrpc_client\client\client.py", line 74, in login session = self._get_and_set_session(login, password) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\username\AppData\Local\Programs\Python\Python311\Lib\site-packages\atproto\xrpc_client\client\client.py", line 40, in _get_and_set_session self._set_session(session) File "C:\Users\username\AppData\Local\Programs\Python\Python311\Lib\site-packages\atproto\xrpc_client\client\methods_mixin\session.py", line 68, in _set_session self._refresh_jwt_payload = get_jwt_payload(session.refresh_jwt) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\username\AppData\Local\Programs\Python\Python311\Lib\site-packages\atproto\xrpc_client\client\auth.py", line 18, in get_jwt_payload return JwtPayload(**plain_payload) ^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: JwtPayload.__init__() got an unexpected keyword argument 'aud'
内容的提问来源于stack exchange,提问作者Blind Coder
相关产品推荐
相关产品推荐

