AI 0X0使用经历


前言

最近很开心,发现了一款桌面悬浮AI聚合助手AI 0X0,很感谢作者大大,因为我对python爬虫这方面比较擅长,而且我很喜欢在cmd终端里对话,所以我就调用了一下作者大大的网站,

一、对网站进行分析

网站一开始需要进行账号登录,我们去AI 0x0注册一下就可以了,然后我们F12对网页进行分析,
在这里插入图片描述

对login 进行分析,可以看到我们的账号信息已经传入,从这里可以看到我们的token值和token过期时长为604800s,也就是一星期,所以说我们一星期之后又要重新获取token,这是一个很痛苦的事情,等会我们就解决这个问题,我表红框的地方是后面要用到的一个很重要的点,暂时放在这里,

二、编写代码

我们现在就去聊天,显然会返回不允许,因为我们没有在设置里填上我们的api_key,这里我用的是gpt3.5的key,你们也可以用4.0的,但是我比较穷,🤭
在这里插入图片描述
填写好key之后,我们在开始就可以对话了,我们CTRL+R刷新页面就会发现页面已经发生改变,我们点开completions,可以看到payload里已经出现了我们的对话记录,分别是0,1,2,3,4,5,6…,我们点开就可以找到对话记录了,这里分别是两个角色,user和assitant,我们需要的就是这两个部分,下面写代码
在这里插入图片描述爬虫必备requests,我们开始,

在这里插入图片描述
开始构造请求头,

headers={
 "Accept": "application/json",
  "Accept-Language": "zh-CN,zh;q=0.9",
  "Authorization": "Bearer sk-************************************",
  "Authorization2": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJ1c2VySWQiOiIxNzY0MjU4MTM4MzMxNjExMTM4IiwidXNlcm5hbWUiOiJodXR1dHUiLCJ0eXBlIjoxLCJkZXZpY2UiOiI3MmMzMzBhZjBhMmI1ZmM3YzgyMjRkNmE2ZDc3ZjJhOCIsImlhdCI6MTcxMDIzMjM2OCwiZXhwIjoxNzEwODM3MTY4fQ.de1qoBZn3jTBJgNyFnu4mnriDs6LZwkKDrjz8ftx8KYuugHqMN4Cusj43ARYSmI3SZNp5jNEB56UEDBHV2ZF_huMd4CuplAMVfr85CPzfDNsk9b_XZ5af06Z-VaS_czeyAy2py4ntHun7OkgCcSVSW63xwJAgV-KEteRNTSSpNTtO_wiszLYjXZh5Rr5fyERcj4Wp44pQC-biNUZaa5v8RJ-xK52vlOemmAsJc0jdp_VPrhXIbKMhSby5aKoWB5UFsDHc2A5dei00RLbnrAtPeF-5ZDXbGWGIaGyMgnsTJTwb_BWfObgEHtYgtulJH_yUpYYg9cKA5vBTi2wLUY6OwydGOK4O5j3s2fAJhyoIvoAC2OY0DnhpSG2Fo_hjTuaJ_oC8ovr1j83zeF7cQsk1Bw-EY6fv5_eWWyrVTU5Mb-9QYXdblPUrhtVaZIsRwyw0NDeZzsy-r1vt-zePTNYmULEYVOw_oSN1nvzXQGUrvQcFG4fjrtThwzCFK3q23YRgRsqIuReQm4Ktm8xngW1AuB5G1KTfhy9tbkvXwLKrnj4oIjMqvWMaN94RGz_lYKcmMoF_fOFz_sm5Ww3MFdm8CdV4YHqPy4mbQc5dQd-lmSr06fK4dwbFQcWqGMaedd0rIBqC0576r-ohetdPP40qqpeljMaItbxCyZ_HkdA6i0",
  "Connection": "keep-alive",
  "Content-Type": "application/json",
  "Origin": "http://123.57.84.141:3000",
  "Referer": "http://123.57.84.141:3000/",
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
  "x-requested-with": "XMLHttpRequest"
}

比较重要的两个部分就是Authorization和Authorization2,仔细观察不难看出Authorization就是我们的api key加上Bearer,至于Authorization2的话就是某种特定方式生成的,这里我们也看不出加密方式,难道没有办法了吗,这里就可以提到我上面的截图了,还记得吗,login抓包里是不是有一个token,睁大你的眼睛,Authorization2不就是token加上Bearer吗,哈哈,到这里我们就已经成功了50%,我们继续。

1.抓包

在这里插入图片描述

我们这里用json格式化看一下,是不是一目了然,每次assitant content都是在user content之后回复的,我们可以对其进行索引,但是有一个点就是如果是我们先请求了user content,那么assitant content就是+1,但是我们请求之后会显示list out of range ,啥意思,就是我们user content的索引值初始值到底是多少,假如我说是[0],那么 assitant content 就是[1]对吧,但是我们运行一下,显然是报错的,为啥呢?

# 提取user和assistant的content
user_content = response_data['choices'][0]['message']['content']
assistant_content = response_data['choices'][1]['message']['content']
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
Cell In[19], line 50
     48 # 提取user和assistant的content
     49 user_content = response_data['choices'][0]['message']['content']
---> 50 assistant_content = response_data['choices'][1]['message']['content']
     52 print("User Content:", user_content)
     53 print("Assistant Content:", assistant_content)

IndexError: list index out of range

所以说问题出在哪里了,显然就是user content的索引初始值不好确定,因为我们每次进行对话之前会先出现一句话,下载桌面端使用完整功能哦,网页端建议用浏览器打开添加到桌面使用,请问有什么可以帮你~和一个😊,所以索引初始值就变成了[2],那我们再加一不就行啦,可信还是错了,那又是为啥呢?后来我发现了,我们问一句话之后不会立刻出现在下一个索引,而是要当我们继续问下一句,那么前一个回答的索引才出现,懂了吧,意思就是ai是回答了,但是并没有立刻返回被我们请求到,而是要我们再问一句,此刻才能请求到上一个问题的答案,不过我们也不是没有方法,我们可以先预设一个问题,比如说一句hello,那么以后的每个请求不就对上号了吗?很nice😆
那么我们开始写吧,

import requests
import json

url = 'http://123.57.84.141:3000/api/openai/v1/chat/completions'

headers = {
  "Accept": "application/json",
  "Accept-Language": "zh-CN,zh;q=0.9",
  "Authorization": "Bearer sk-*********************************************",
  "Authorization2": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJ1c2VySWQiOiIxNzY0MjU4MTM4MzMxNjExMTM4IiwidXNlcm5hbWUiOiJodXR1dHUiLCJ0eXBlIjoxLCJkZXZpY2UiOiI3MmMzMzBhZjBhMmI1ZmM3YzgyMjRkNmE2ZDc3ZjJhOCIsImlhdCI6MTcxMDIzMjM2OCwiZXhwIjoxNzEwODM3MTY4fQ.de1qoBZn3jTBJgNyFnu4mnriDs6LZwkKDrjz8ftx8KYuugHqMN4Cusj43ARYSmI3SZNp5jNEB56UEDBHV2ZF_huMd4CuplAMVfr85CPzfDNsk9b_XZ5af06Z-VaS_czeyAy2py4ntHun7OkgCcSVSW63xwJAgV-KEteRNTSSpNTtO_wiszLYjXZh5Rr5fyERcj4Wp44pQC-biNUZaa5v8RJ-xK52vlOemmAsJc0jdp_VPrhXIbKMhSby5aKoWB5UFsDHc2A5dei00RLbnrAtPeF-5ZDXbGWGIaGyMgnsTJTwb_BWfObgEHtYgtulJH_yUpYYg9cKA5vBTi2wLUY6OwydGOK4O5j3s2fAJhyoIvoAC2OY0DnhpSG2Fo_hjTuaJ_oC8ovr1j83zeF7cQsk1Bw-EY6fv5_eWWyrVTU5Mb-9QYXdblPUrhtVaZIsRwyw0NDeZzsy-r1vt-zePTNYmULEYVOw_oSN1nvzXQGUrvQcFG4fjrtThwzCFK3q23YRgRsqIuReQm4Ktm8xngW1AuB5G1KTfhy9tbkvXwLKrnj4oIjMqvWMaN94RGz_lYKcmMoF_fOFz_sm5Ww3MFdm8CdV4YHqPy4mbQc5dQd-lmSr06fK4dwbFQcWqGMaedd0rIBqC0576r-ohetdPP40qqpeljMaItbxCyZ_HkdA6i0",
  "Connection": "keep-alive",
  "Content-Type": "application/json",
  "Origin": "http://123.57.84.141:3000",
  "Referer": "http://123.57.84.141:3000/",
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
  "x-requested-with": "XMLHttpRequest"
}

# 初始的用户输入内容
user_content = "中国功夫"

while True:
    data={
      "messages": [
        {
          "role": "user",
          "content": user_content
        }
      ],
      "model": "gpt-3.5-turbo",
      "temperature": 0.5,
      "presence_penalty": 0,
      "frequency_penalty": 0,
      "top_p": 1
    }

    response = requests.post(url, headers=headers, data=json.dumps(data))
    response_data = response.json()

    # 获取回复
    assistant_content = response_data['choices'][0]['message']['content']
    
    print("User Content:", user_content)
    print("Assistant Content:", assistant_content)
    
    # 将回复作为下一次用户输入的一部分
    user_content = assistant_content

我们运行一下,结果不就出现了,我们可以连续去提问问题,不过马上就发现了我们不能自主输入问题进行提问啊,每次都是上一次回答的结果作为提问,我们继续改,

我们加一个while判断,

import requests
import json

url = 'http://123.57.84.141:3000/api/openai/v1/chat/completions'

headers = {
  "Accept": "application/json",
  "Accept-Language": "zh-CN,zh;q=0.9",
  "Authorization": "Bearer sk-***********************************",
  "Authorization2": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJ1c2VySWQiOiIxNzY0MjU4MTM4MzMxNjExMTM4IiwidXNlcm5hbWUiOiJodXR1dHUiLCJ0eXBlIjoxLCJkZXZpY2UiOiI3MmMzMzBhZjBhMmI1ZmM3YzgyMjRkNmE2ZDc3ZjJhOCIsImlhdCI6MTcxMDIzMjM2OCwiZXhwIjoxNzEwODM3MTY4fQ.de1qoBZn3jTBJgNyFnu4mnriDs6LZwkKDrjz8ftx8KYuugHqMN4Cusj43ARYSmI3SZNp5jNEB56UEDBHV2ZF_huMd4CuplAMVfr85CPzfDNsk9b_XZ5af06Z-VaS_czeyAy2py4ntHun7OkgCcSVSW63xwJAgV-KEteRNTSSpNTtO_wiszLYjXZh5Rr5fyERcj4Wp44pQC-biNUZaa5v8RJ-xK52vlOemmAsJc0jdp_VPrhXIbKMhSby5aKoWB5UFsDHc2A5dei00RLbnrAtPeF-5ZDXbGWGIaGyMgnsTJTwb_BWfObgEHtYgtulJH_yUpYYg9cKA5vBTi2wLUY6OwydGOK4O5j3s2fAJhyoIvoAC2OY0DnhpSG2Fo_hjTuaJ_oC8ovr1j83zeF7cQsk1Bw-EY6fv5_eWWyrVTU5Mb-9QYXdblPUrhtVaZIsRwyw0NDeZzsy-r1vt-zePTNYmULEYVOw_oSN1nvzXQGUrvQcFG4fjrtThwzCFK3q23YRgRsqIuReQm4Ktm8xngW1AuB5G1KTfhy9tbkvXwLKrnj4oIjMqvWMaN94RGz_lYKcmMoF_fOFz_sm5Ww3MFdm8CdV4YHqPy4mbQc5dQd-lmSr06fK4dwbFQcWqGMaedd0rIBqC0576r-ohetdPP40qqpeljMaItbxCyZ_HkdA6i0",
  "Connection": "keep-alive",
  "Content-Type": "application/json",
  "Origin": "http://123.57.84.141:3000",
  "Referer": "http://123.57.84.141:3000/",
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
  "x-requested-with": "XMLHttpRequest"
}

# 初始的用户输入内容
user_content = "hello"

while True:
    user_input = input("You: ")

    data = {
        "messages": [
            {
                "role": "user",
                "content": user_content
            },
            {
                "role": "assistant",
                "content": user_input
            }
        ],
        "model": "gpt-3.5-turbo",
        "temperature": 0.5,
        "presence_penalty": 0,
        "frequency_penalty": 0,
        "top_p": 1
    }

    response = requests.post(url, headers=headers, data=json.dumps(data))
    response_data = response.json()

    # 获取回复
    assistant_content = response_data['choices'][0]['message']['content']
    
    print("Assistant:", assistant_content)
    
    # 将回复作为下一次用户输入的一部分
    user_content = assistant_content
现在就可以自主输入提问了,但是怎么停止啊,直接ESC强制停止太难受,下次还要重启内核,麻烦,我们加一个exit作为结束标志,当我们输入exit就可以停止输出,用if ,break就🆗了,到这里了我还想实现一下streaming流式输出,然我们的输出看起来更好看,更有意思,代码如下
import requests
import json
import time

url = 'http://123.57.84.141:3000/api/openai/v1/chat/completions'

headers = {
  "Accept": "application/json",
  "Accept-Language": "zh-CN,zh;q=0.9",
  "Authorization": "Bearer sk-********************",
  "Authorization2": "Bearer eyJhbGciOiJSUzUxMiJ9.eyJ1c2VySWQiOiIxNzY0MjU4MTM4MzMxNjExMTM4IiwidXNlcm5hbWUiOiJodXR1dHUiLCJ0eXBlIjoxLCJkZXZpY2UiOiI3MmMzMzBhZjBhMmI1ZmM3YzgyMjRkNmE2ZDc3ZjJhOCIsImlhdCI6MTcxMDIzMjM2OCwiZXhwIjoxNzEwODM3MTY4fQ.de1qoBZn3jTBJgNyFnu4mnriDs6LZwkKDrjz8ftx8KYuugHqMN4Cusj43ARYSmI3SZNp5jNEB56UEDBHV2ZF_huMd4CuplAMVfr85CPzfDNsk9b_XZ5af06Z-VaS_czeyAy2py4ntHun7OkgCcSVSW63xwJAgV-KEteRNTSSpNTtO_wiszLYjXZh5Rr5fyERcj4Wp44pQC-biNUZaa5v8RJ-xK52vlOemmAsJc0jdp_VPrhXIbKMhSby5aKoWB5UFsDHc2A5dei00RLbnrAtPeF-5ZDXbGWGIaGyMgnsTJTwb_BWfObgEHtYgtulJH_yUpYYg9cKA5vBTi2wLUY6OwydGOK4O5j3s2fAJhyoIvoAC2OY0DnhpSG2Fo_hjTuaJ_oC8ovr1j83zeF7cQsk1Bw-EY6fv5_eWWyrVTU5Mb-9QYXdblPUrhtVaZIsRwyw0NDeZzsy-r1vt-zePTNYmULEYVOw_oSN1nvzXQGUrvQcFG4fjrtThwzCFK3q23YRgRsqIuReQm4Ktm8xngW1AuB5G1KTfhy9tbkvXwLKrnj4oIjMqvWMaN94RGz_lYKcmMoF_fOFz_sm5Ww3MFdm8CdV4YHqPy4mbQc5dQd-lmSr06fK4dwbFQcWqGMaedd0rIBqC0576r-ohetdPP40qqpeljMaItbxCyZ_HkdA6i0",
  "Connection": "keep-alive",
  "Content-Type": "application/json",
  "Origin": "http://123.57.84.141:3000",
  "Referer": "http://123.57.84.141:3000/",
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
  "x-requested-with": "XMLHttpRequest"
}

# 初始的用户输入内容
user_content = "hello"

while True:
    user_input = input("You: ")

    if user_input.lower() == "exit":
        print("对话结束,你已退出对话...")
        break

    data = {
        "messages": [
            {
                "role": "user",
                "content": user_content
            },
            {
                "role": "assistant",
                "content": user_input
            }
        ],
        "model": "gpt-3.5-turbo",
        "temperature": 0.5,
        "presence_penalty": 0,
        "frequency_penalty": 0,
        "top_p": 1
    }

    response = requests.post(url, headers=headers, data=json.dumps(data))
    response_data = response.json()

    # 获取回复
    assistant_content = response_data['choices'][0]['message']['content']
    
    # 实现打字机效果
    for char in assistant_content:
        print(char, end='', flush=True)
        time.sleep(0.05)  # 控制打字速度
    
    print()  # 换行
    
    # 将回复作为下一次用户输入的一部分
    user_content = assistant_content

2.解决token失效问题

该做的都做了,那么token失效问题怎么解决呢,尽然不能构造出token,那么就每次对话时都获取一下token,岂不很好,说干就干,我上面说login可以找到token,

import requests
import json

url = 'https://chat.zijiancode.cn/open/login'

headers = {
  "Accept": "*/*",
  "Accept-Language": "zh-CN,zh;q=0.9",
  "Connection": "keep-alive",
  "Content-Type": "application/json",
  "Origin": "http://123.57.84.141:3000",
  "Referer": "http://123.57.84.141:3000/",
  "Sec-Fetch-Dest": "empty",
  "Sec-Fetch-Mode": "cors",
  "Sec-Fetch-Site": "cross-site",
  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
  "sec-ch-ua-mobile": "?0"
}

data={
  "email": "1879******",
  "password": "12345*******",
  "protocol": True,
  "device": "72c330af0a2b5fc7c8224d6a6d77f2a8"
}
data = json.dumps(data, separators=(',', ':'))

# 发送GET请求
response = requests.post(url, headers=headers, data=data)

# 将响应转换为JSON格式
response_json = response.json()

# 提取token值
token = response_json['data']['token']

# 打印提取的token
print(token)
eyJhbGciOiJSUzUxMiJ9.eyJ1c2VySWQiOiIxNzY0MjU4MTM4MzMxNjExMTM4IiwidXNlcm5hbWUiOiJodXR1dHUiLCJ0eXBlIjoxLCJkZXZpY2UiOiI3MmMzMzBhZjBhMmI1ZmM3YzgyMjRkNmE2ZDc3ZjJhOCIsImlhdCI6MTcxMDI0NjE2OCwiZXhwIjoxNzEwODUwOTY4fQ.Rn5oKOGa_GdIDjq2GuMKTU_zWzsr6AHqMXtgPNYng2BkdLGjlT5RCvUUvQFhev04D7unQeKagRotafxko4Ru_reEVHFvgGg5JGXpjTMJ9gGnts974xkDRY1UZvCvNKVBBh-BeHCxrPjrDSrJNggPtNH_SHJ-T4-rqSU_54IqLGeavfnSv5PlaaUVyhdytaNnFlMf9lchzG3FVyfCT99-zYdDlx66KkbFJx9aF4ef5AnGlgZdE3Vgb8KH6bulpVNpSLc1eIGU-70UoZ5OW-Nc_hWFfeNGCyp0G1eEL6axUEvt3-yPlc8y6p7_jQdNtEKHgKpUW00s5Abh2iIxZW08hBT36-mE8ufBx8ZDUf3X7R3cTK2eGpxp9aRerRtavP_Ym7kjMsr723lFtw5wUls1jk_IRVS41SyjgyfNemgVv3EX9ojH_-ERB2gea60MLWwqpOVCuaq6r5488lKR0wIfiNG-DHPFIeZwQp9tondsTXDDgEyyCSNDNXHWbjRhXJK5BxiBR_QzfonYG0EJavvA4rHSzj4Q0zLgqWrumgGrDUuKGvLXOniP_25kmRM4NoGxUBf8PxKzcR9MW9I7TWNF55FxKCWmfaRYeHZc2B4FRs5uxsLtxau0Aneu2z1zM5aO35t0v144cqczg0eu7jBZ57YLpY5MuPx3SQagGVOq35o

我们下面来综合一下,
先登录获取token,再把token加入对话请求之中,顺便把api_key也整理一下

import requests
import json

# 发送第一个请求获取token
url_login = 'https://chat.zijiancode.cn/open/login'
data = {
    "email": "187******",  #AI0X0账号
    "password": "1234*******",  #AI0X0密码
    "protocol": True,
    #"device": "72c330af0a2b5fc7c8224d6a6d77f2a8"  #可要可不要
}
headers_login = {
    "Accept": "*/*",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Connection": "keep-alive",
    "Content-Type": "application/json",
    "Origin": "http://123.57.84.141:3000",
    "Referer": "http://123.57.84.141:3000/",
    "Sec-Fetch-Dest": "empty",
    "Sec-Fetch-Mode": "cors",
    "Sec-Fetch-Site": "cross-site",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
    "sec-ch-ua-mobile": "?0"
}
response = requests.post(url_login, headers=headers_login, data=json.dumps(data, separators=(',', ':')))
token = response.json()['data']['token']
api_key = 'sk-****************'

# 使用获取的token发送新的请求
url_new = 'http://123.57.84.141:3000/api/openai/v1/chat/completions'
headers_new = {
    "Accept": "application/json",
    "Accept-Language": "zh-CN,zh;q=0.9",
    "Authorization": f"Bearer {api_key}",
    "Authorization2": f"Bearer {token}",
    "Connection": "keep-alive",
    "Content-Type": "application/json",
    "Origin": "http://123.57.84.141:3000",
    "Referer": "http://123.57.84.141:3000/",
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36",
    "x-requested-with": "XMLHttpRequest"
}

# 初始的用户输入内容
user_content = "hello"

while True:
    user_input = input("You: ")

    if user_input.lower() == "exit":
        print("对话结束,你已退出对话...")
        break

    data_new = {
        "messages": [
            {
                "role": "user",
                "content": user_content
            },
            {
                "role": "assistant",
                "content": user_input
            }
        ],
        "model": "gpt-3.5-turbo",
        "temperature": 0.5,
        "presence_penalty": 0,
        "frequency_penalty": 0,
        "top_p": 1
    }

    response = requests.post(url_new, headers=headers_new, data=json.dumps(data_new))
    response_data = response.json()

    # 获取助手的回复
    assistant_content = response_data['choices'][0]['message']['content']
    
    # 实现打字机效果
    for char in assistant_content:
        print(char, end='', flush=True)
        time.sleep(0.05)  # 控制打字速度
    
    print()  # 换行
    
    # 将助手的回复作为下一次用户输入的一部分
    user_content = assistant_content

看一下效果,
在这里插入图片描述
这里是在vscode里jupyter notebook里运行的,下面我们再cmd终端里运行,复制以上代码保存为py文件,然后再cmd终端里打开,
在这里插入图片描述
怎么样,还不错吧!
代码贴一下
在这里插入图片描述

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值