求不使用Flask的Xero API Python非Web应用示例代码
不依赖Flask的Xero API Python调用示例
可以直接使用xero-python库完成非Web场景的API调用,核心是通过私有应用或OAuth2离线模式获取凭证,以下是具体示例:
前提准备
- 已在Xero开发者平台创建对应类型的应用(私有应用适合内部系统,公共/合作伙伴应用支持离线授权)
- 安装依赖库:
pip install xero-python python-dotenv
私有应用示例(内部系统专用,无需用户授权)
私有应用通过RSA密钥对认证,适合长期运行的后台任务:
from xero_python.api_client import ApiClient, Configuration from xero_python.api.accounting_api import AccountingApi import os from dotenv import load_dotenv # 加载环境变量(敏感信息存于.env文件,避免硬编码) load_dotenv() # 配置API客户端 configuration = Configuration( debug=False, oauth2_token={ "client_id": os.getenv("XERO_CLIENT_ID"), "client_secret": os.getenv("XERO_CLIENT_SECRET"), "private_key": open(os.getenv("XERO_PRIVATE_KEY_PATH")).read(), "token_type": "Bearer" } ) with ApiClient(configuration) as api_client: accounting_api = AccountingApi(api_client) # 获取关联组织信息 organizations = accounting_api.get_organizations() print(f"当前关联组织: {organizations[0].name}") # 获取账户列表 accounts = accounting_api.get_accounts() print("账户列表:") for account in accounts[:5]: print(f"- {account.name} (类型: {account.type})")
OAuth2离线模式示例(单次授权后离线访问)
如果需要用户授权但无需持续Web交互,可先通过临时本地服务获取refresh token,后续用该令牌自动刷新访问权限:
from xero_python.api_client import ApiClient, Configuration from xero_python.api.accounting_api import AccountingApi from xero_python.oauth2 import OAuth2Credentials import os from dotenv import load_dotenv load_dotenv() # 初始化凭证(首次授权后保存refresh token,后续直接复用) credentials = OAuth2Credentials( client_id=os.getenv("XERO_CLIENT_ID"), client_secret=os.getenv("XERO_CLIENT_SECRET"), refresh_token=os.getenv("XERO_REFRESH_TOKEN"), expires_at=int(os.getenv("XERO_EXPIRES_AT")) if os.getenv("XERO_EXPIRES_AT") else None ) # 配置客户端并绑定令牌刷新回调 configuration = Configuration(debug=False, oauth2_token=credentials.token) api_client = ApiClient(configuration) api_client.oauth2_token = credentials # 令牌刷新后自动保存(可替换为写入数据库等逻辑) def token_saver(token): os.environ["XERO_REFRESH_TOKEN"] = token["refresh_token"] os.environ["XERO_EXPIRES_AT"] = str(token["expires_at"]) credentials.set_token_saver(token_saver) # 调用API获取发票数据 with api_client: accounting_api = AccountingApi(api_client) invoices = accounting_api.get_invoices(statuses=["AUTHORISED"]) print("已授权发票:") for invoice in invoices[:5]: print(f"- 编号: {invoice.invoice_number}, 总额: {invoice.total} {invoice.currency_code}")
注意事项
- 私有应用需在Xero开发者平台上传公钥,且仅能关联单个组织
- OAuth2离线模式的首次授权需临时搭建简单本地服务(比如用Python自带的
http.server)完成,获取refresh token后即可脱离Web环境 - 所有敏感凭证均需通过环境变量或加密配置文件管理,禁止硬编码到代码中
内容的提问来源于stack exchange,提问作者user21136557
相关产品推荐
相关产品推荐

