优雅地为 one/new 更新 access token

有感于前作:

https://linux.do/t/topic/171244

从数据库里直接更新 access token,简单粗暴。但是数据库类型有人用的是 SQLite,有的是 MySQL,甚至有的是 PostgreSQL,那操作数据库的方法就不能直接一一适配了。所幸 oneapi/newapi 为我们保留了 api 的操作接口,虽然没有文档,但是啃一啃还是把更新渠道密钥的格式调通了。

首先获取 one/new 的系统令牌,这是访问 one/new 的凭证,相当于 one/new 的 access token。 密级隐私,请勿泄露,如疑似泄露,请及时重置。

image

获取渠道信息使用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,以上です。

13 Likes

太好了,赞:100:,我来试试。

多谢大佬

感谢分享

感谢感谢

看到这里我以为可以直接过盾获取rt :joy: 后来发现是我想错了

是不是应该明天发 :tieba_025:

哥哥我做不到啊 :laughing:

1 Like

你也太强了吧

天天都是星期四

实际上是只会 python,所以佬友的高级货我不会用 :melting_face:

非常有用,感谢

感谢你的消息

真是太优雅了

太好啦,赶紧收藏学习