有感于前作:
https://linux.do/t/topic/171244
从数据库里直接更新 access token,简单粗暴。但是数据库类型有人用的是 SQLite,有的是 MySQL,甚至有的是 PostgreSQL,那操作数据库的方法就不能直接一一适配了。所幸 oneapi/newapi 为我们保留了 api 的操作接口,虽然没有文档,但是啃一啃还是把更新渠道密钥的格式调通了。
首先获取 one/new 的系统令牌,这是访问 one/new 的凭证,相当于 one/new 的 access token。 密级隐私,请勿泄露,如疑似泄露,请及时重置。
获取渠道信息使用GET方法,请求 “https://[YOUR_ONEAPI_URL]/api/channel/[channel-id]”;
更新渠道信息使用PUT方法,请求 “https://[YOUR_ONEAPI_URL]/api/channel”;
渠道是否有效使用GET方法,请求 “https://[YOUR_ONEAPI_URL]/api/test/channel/[channel-id]"
以下是从始皇接口获取 rt 然后更新 one/new 的渠道 at 的 python 代码:
代码自取
import requests
def rt2at(refresh_token):
'''通过始皇接口更新at'''
url = "https://token.oaifree.com/api/auth/refresh"
headers = {
"Content-Type": " x-www-form-urlencoded;charset=UTF-8"
}
data = {
"refresh_token": refresh_token
}
response = requests.post(url, data=data)
if response.status_code == 200:
return response.json()["access_token"],True
else:
return response.text,False
# 替换为你的 oneapi URL
url = "https://YOUR_ONEAPI_URL/api/channel"
# 将你的系统令牌放在这里
bearer_token = "todayisThusdaykfcvwo50"
# 准备认证头
headers = {
"Authorization": f"Bearer {bearer_token}"
}
rt_file = "refreshTokens.txt"
with open(rt_file, 'r', encoding="utf-8") as f:
for line in f:
channel_id, refresh_token, _ = line.split(",")
if channel_id.isdigit():
channel_url = f"{url}/{channel_id}"
response = requests.get(channel_url, headers=headers) # 获取渠道信息
if response.status_code==200:
response = response.json()
data = response["data"]
access_token,success = rt2at(refresh_token)
if success:
data["key"] = access_token
print(f"{refresh_token}对应的at:\n{access_token}")
response = requests.put(url, headers=headers, json=data) # 更新渠道信息
if response.status_code==200:
response = response.json()
if response["success"]:
print(f"渠道 {channel_id} 已更新")
test_url = f"{url}/test/{channel_id}"
response = requests.get(test_url, headers=headers) # 测试渠道可通性
if response.status_code==200:
response = response.json()
if response["success"]:
print(f"渠道 {channel_id} 测试成功")
else:
print(f"渠道 {channel_id} 测试失败,报错提示:{response['message']}")
else:
print(f"渠道 {channel_id} 测试失败,报错提示:{response['message']}")
else:
print(f"渠道 {channel_id} 更新失败")
else:
print(f"渠道 {channel_id} 更新失败")
else:
print(f"渠道 {channel_id} 获取 access token 失败,请检查 refresh token 是否有效")
else:
print(f"未能获取渠道 {channel_id} 的信息,请确认指定ID渠道是否存在")
为方便有很多 plus 账号的佬友,refresh token 使用以下格式放在 txt 里(使用英文逗号分隔),并命名为 refreshTokens.txt
:
渠道ID,refresh-token,备注
666666,todayisThusdaykfcvwo50,plus账号[email protected]
123456,todayisThusdaykfcvwo50,plus账号在哪里
当然,如果你不需要refresh token,或者搞定时更新,自然魔改下程序就好。总之更新渠道密钥的主要步骤在上头了,有不清楚的可以问问AI,以上です。