Windows上利用Python自动切换代理IP的终极方案!

本文介绍了如何利用Python脚本和AutoHotkey自动化地设置Windows系统的代理配置,包括如何通过注册表操作实现动态代理设置,并提供了Python脚本源码和AutoHotkey快捷操作示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

声明下:不同于网络上千百篇方法,下文是经过各种严格测试都通过的,同时也是一个实验的过程,排除了各种不靠谱的方法。有需要的可以评论来讨论,想要源码和相关参考文献或笔记的,也可以找我。

思路及启发

先说一下我这一路实验的思路吧,这个至关重要。

之前一直在用Python做爬虫抓取数据,发现本机IP的问题不解决,爬虫相当于白费了。然后各种百度,不管是用urllib2还是requests的代理设置,都不管用。然后又各种搜索Python更改windows代理的设置,还需要接触windos底层API,有复杂又不好实现。于是爬虫的学习就放弃了好长一段时间。

最近因为一直在用AutoHotkey大大加快电脑操作效率,各种快捷键和代替手动操作一些常规系统设置。突发奇想,想让它自动打开IE的Internet设置,然后自动点击“局域网设置”,在自动在代理框里输入IP地址,按回车完成设置。这真是个好主意~

不过失败了。。。因为AHK在IE设置弹出的框框中选择某一个输入框,很麻烦,我也没法实现。所以就在想另一个办法,因为AHK操作Windows的cmd命令很方便,所以在想能不能用它打开cmd然后用命令设置IE呢?

然后又各种百度。发现这是可以通过reg add注册表设置来实现的!于是,就开启了reg命令的百度之旅。

按照网上各种方法,都指向了注册表的这个地方:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings

大家都说在这个路径下,有这么3个项非常重要:

  • ProxyEnable - 使用代理

  • ProxyServer - 代理IP的地址及端口号

  • AutoConfigURL - 自动配置脚本(PAC)的地址

于是试着用reg add命令操作:

reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyEnable /tREG_DWORD /d 1 /f
reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings" /v ProxyServer /d"192.168.1.1:8080" /f

这两句第一个是打开“代理”,第二个是设置代理的IP地址。

先在命令行里敲了下命令,然后打开regedit注册表,刷新下看,还真改了!

然后手动打开IE设置,发现里面的内容也确实改变了。然后再打开浏览器,打开IP查询的网址,自己的IP真的变了!

至此以为大功告成了。结果再用时,发现大错特错——再次用命令行改我指定的IP地址后,网页打不开了。。。

来回反复调试查错之后,我发现一个“大秘密”:如果不手动打开IE设置里的局域网设置窗口的话,所有代理设置是不生效的。这是为什么呢?

百度里搜索不到。

于是我就用英文到Stackoverflow去搜,结果发现实际影响本机代理的注册表项目并不是之前的那几个!(真怀疑网上那些人说自己用这个项达到定时设置代理的人是不是玩真的。。。)

而是这个位置的项:

HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections

其中的DefaultConnectionSettings才是真正需要改的东西。打开以后各种乱码,原来是二进制值。
不过用编辑器看二进制值,确实发现代理IP地址和自动配置脚本的地址都在里面。

那怎么办呢?AHK可不会操作二进制,也没什么方法能用reg add命令行直接把二进制值注入。然后又进入无尽的百度模式。

注册表的二进制项修改方式的突发奇想

忘了什么启发的我吧,好像是自己无聊到在注册表上乱点,发现我刻意导出注册表。

然后导出了下试试,发现是个.reg文件。然后无聊双击一下,发现可以把这个文件导入到注册表!于是灵光一闪,赶紧用文本编辑器打开这个.reg文件,发现里面是文字画的十六进制码,类似这样的:

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections]
"DefaultConnectionSettings"=hex:46,00,00,00,03,00,00,00,07,00,00,00,0e,00,00,\
 00,31,39,32,2e,31,36,38,2e,31,2e,31,3a,38,30,00,00,00,00,21,00,00,00,68,74,\
 74,70,3a,2f,2f,78,64,75,6f,74,61,69,2e,63,6f,6d,2f,70,52,73,4f,33,4e,47,52,\
 33,2d,2e,70,61,63,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00,00,00
"SavedLegacySettings"=hex:46,00,00,00,c1,0c,00,00,07,00,00,00,0e,00,00,00,31,\
 39,32,2e,31,36,38,2e,31,2e,31,3a,38,30,00,00,00,00,21,00,00,00,68,74,74,70,\
 3a,2f,2f,78,64,75,6f,74,61,69,2e,63,6f,6d,2f,70,52,73,4f,33,4e,47,52,33,2d,\
 2e,70,61,63,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,00,00,00,00,00

于是最终答案就出来了(这里开始有Python介入)

这个时候我还不知道这是正确答案,只是想试一试:

用Python组成一段有效的二进制码(其实是十六进制) -> 把注册表值封装为reg文件 -> 通过命令行的reg import命令导入reg文件 -> 成功!

然后问题就在于怎么安装正确的格式组成

DefaultConnectionSettings十六进制值的分析

于是继续到Stackoverflow上搜索DefaultConnectionSettings这个项中十六进制的读取问题。
发现有一个人大概总结了每一位字节是代表什么,不过不够详细。地址在这里【How to set 'automatic configuration script' for a dial-up connection programmatically?

然后开始做笔记:

How to set 'automatic configuration script' for a dial-up connection programmatically?

接着开始尝试对照着那段二进制值看一看。于是我把这段十六进制码做成PDF,方便做笔记,大概是这样的:

Windows代理设置注册表值的十六进制分析DefaultConnectionSettings

实际的十六进制值果然和网上的不同。经过实验,后面一大段画删除线的,都是没用的,删除也没关系。实际上,它只有在你手动打开IE设置面板时,才自动加上的。不管它,实际上有用的十六进制并不长。总结下也就这么几位:

46 00 00 00 00 00 00 00 开关 00 00 00 IP长度 00 00 00 IP地址 00 00 00 是否跳过本地代理 21 00 00 00 PAC地址

其中,通过规律发现每个信息的分隔符是三个00,即00 00 00。上面有7个00的,因为没什么用我就不讲了(其实第四个代表自增数,直接为00就好了)

当然,其中汉字的部分是十六进制格式的。

这几个汉字,是其中最重要的信息,具体如下:

  • 开关(switcher): 主要代表IE设置中复选框的选中情况,你可以打开IE设置看看。以下是所有可用的值(括号中是我用的别名):

    • 0F全部开启(ALL);01全部禁用(Off)

    • 03使用代理服务器(ProxyOnly);05使用自动脚本(PacOnly);

    • 07使用脚本和代理(ProxyAndPac);09打开自动检测设置(D);

    • 0B打开自动检测并使用代理(DIP);0D打开自动检测并使用脚本(DS);

  • IP长度:必须是十六进制的,0就是00,7就是07,10就是0a,11是0b。在Python中,格式是0xa,所以需要把格式统一为注册表的标准。

  • IP地址:直接把IP安装每个字符转十六进制就好了。如果IP为空的话,就直接为00。这时会看到switcher后面跟了11个00。。。

  • 是否跳过本地代理:这段有点复杂,实际上我们几乎不用。如果不用的话直接为00就好了。但是用的话,就必须写为:附加信息长度00 00 00 附加信息这样的。

    • 附加信息:只能是这句话:<local>

    • 附加信息长度:因为附加信息是固定的,所以共7位,写为07就好了。

  • PAC地址:这个简单,直接把PAC地址翻译为十六进制就好了。如果没有则什么都不写。

至此这段十六进制值就全部解析完毕了。

剩下的就是把你需要的代理IP地址和PAC地址作为参数传进去就好了。然后把这段值封装到reg文件中的对应位置就完全ok了~这步太简单,就不用多说了。

增加更方便的功能

各种测试成功后,非常高兴。但是还有点余味不足,就想着多添加点方便的功能。

这个Python文件的最后成品可以做到这些事:

  • 直接通过命令行传参数达到各种设置代理的效果。这个很自豪~第一次用系统参数功能,哈哈哈!

  • 在文件夹中直接双击达到效果

  • 在别的Python文件中(如爬虫)作为模块被使用

  • 被AHK调用

在Autohotkey中调用——极其方便极其傻瓜式操作!

不忘初心嘛~

python处理一切完成后,又回到了AHK中。

这一步可能也就写了几分钟,让AHK直接带参数打开python脚本就做到了。比如设置一个代理IP地址:

path = "D:\setRegProxy.py" ;这里是python脚本的地址,随便放哪都行。
key   = "0.0.0.0:80"  ;这里根据需要设置为代理地址
Run % path " -o ProxyOnly " key

这样就齐活了~

当然,我的AHK脚本实现的功能比这个还要爽快——弹出一个小输入框,直接粘贴一个ip地址,按回车就能实现代理设置。

Python脚本的源码(setProxy.py)

只要机器上安装了Python 2.x版本就行,不需要依赖安装和设置其他任何东西。

# coding:utf-8
'''
  # Title   : setRegProxy
  # Author  : Solomon Xie
  # Utility : Via Registry key of windows, change proxy settings of IE on Windows.
  # Require : Python 2.x, Windows 7
  # Reg Path: HKUC\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections
  # Anlysis : 注册表的二进制值(及关键信息)如下:"46 00 00 00 00 00 00 00 开关 00 00 00 IP长度 00 00 00 IP地址 00 00 00 是否跳过本地代理 21 00 00 00 PAC地址"
  # Method  : 通过在cmd中导入reg文件的方式执行并立即生效。
  # Notes   : - 二进制值的设置选项在代码中已经体现了。本代码可以根据需要自动设置代理。
  # switcher: 开关:0F全部开启(ALL);01全部禁用(Off)
              03使用代理服务器(ProxyOnly);05使用自动脚本(PacOnly);
              07使用脚本和代理(ProxyAndPac);09自动检测设置(D);
              0B自动检测并使用代理(DIP);0D自动检测并使用脚本(DS);
'''
import os, sys, re, getopt

def regIESettings(op, noLocal=False, ip='', pac=''):
  '''
    # 根据需求生成Windows代理设置注册表的.reg文件内容
    # DefaultConnectionSettings项是二进制项
    # 而具体这个二进制文件怎么解析,在收藏的PDF中有详细解释。
  '''
  if not op : return
  # 如果是设置IP代理的模式 则检查IP地址的有效性(允许为空,但不允许格式错误)
  if 'Proxy' in op and not ip == '': 
    # if len(extractIp(ip))==0
    if 1 > len(re.findall('([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\s*:{0,1}\s*([0-9]{1,5}){0,1}',ip)) :
      print '---Unexpected IP Address:%s---'%ip
      return
  options = {'On':'0F','Off':'01','ProxyOnly':'03','PacOnly':'05','ProxyAndPac':'07','D':'09','DIP':'0B','DS':'0D'}
  if op == 'Off':
    reg_value = '46,00,00,00,00,00,00,00,01'
  else:
    switcher = options.get(op)
    if not switcher:
      print '\n---Unexpected Option. Please check the value after [-o]---\n'
      return
    skipLocal = '07,00,00,00,%s'%__toHex('<local>') if noLocal else '00'
    reg_value = '46,00,00,00,00,00,00,00,%(switcher)s,00,00,00,%(ipLen)s,00,00,00,%(ip)s00,00,00,%(skipLocal)s,21,00,00,00%(pac)s' % ({ 'switcher':switcher,'ipLen':__toHex(len(ip)),'ip':__toHex(ip)+',' if ip else '','infoLen':__toHex(len('<local>')),'skipLocal':skipLocal,'pac':','+__toHex(pac) if pac else '' })
  settings = 'Windows Registry Editor Version 5.00\n[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections]\n"DefaultConnectionSettings"=hex:%s' % reg_value
  # print 'Using proxy address: %s' % ip
  print op, ip, pac
  print options[op] +'\n'+ __toHex(ip) +'\n'+ __toHex(pac)
  print settings
  # === 生成reg文件并导入到注册表中 ===
  filePath = '%s\DefaultConnectionSettings.reg'%os.getcwd() 
  with open(filePath, 'w') as f:
    f.write( settings )
  cmd = 'reg import "%s"' %filePath
  result  = os.popen(cmd)
  if len(result.readlines()) < 2 :
    print '---Successfully import proxy into Registry on this machine.---'
  return 

def __toHex(obj):
  if   obj == '': return ''
  elif obj == 0 or obj == '0' or obj == '00': return '00'
  if isinstance(obj, str):
    rehex = [str(hex(ord(s))).replace('0x','') for s in obj]
    return ','.join(rehex)
  elif isinstance(obj, int):
    num = str(hex(obj)).replace('0x', '')
    return num if len(num)>1 else '0'+num # 如果是一位数则自动补上0,7为07,e为0e

if __name__ == '__main__':
  # 获取文件外部参数
  # 用法:在命令行中输入setRegProxy.py -o "ProxyOnly" -l --proxy"0.0.0.0:80" -l
  opts, args = getopt.getopt(sys.argv[1:], 'o:p:a:l',['option=','proxy=','pac=','local'])
  print opts, args #调试用
  if len(opts) > 0:
    op, ip, pac = '', '', ''
    noLocal = False
    for o,a in opts:
      if   o == '-o' or o == '--option':  op = a
      elif o == '-p' or o == '--proxy' :  ip = a
      elif o == '-a' or o == '--pac'   : pac = a
      elif o == '-l' or o == '--local' : noLocal = False
    pac = 'http://xduotai.com/pRsO3NGR3-.pac' if not pac else pac
    if op == 'ProxyOff':
      regIESettings(op='Off', ip=ip, pac=pac, noLocal=noLocal)
      regIESettings(op='PacOnly', ip=ip, pac=pac, noLocal=noLocal)
    elif op == 'PacOff':
      regIESettings(op='Off', ip=ip, pac=pac, noLocal=noLocal)
      regIESettings(op='ProxyOnly', ip=ip, pac=pac, noLocal=noLocal)
    else:
      regIESettings(op=op, ip=ip, pac=pac, noLocal=noLocal)

Autohotkey源码

Autohotkey怎么用呢?太简单了,傻到爆!

直接官网下载安装一个Autohotkey软件,也就几M。然后呢,新建一个文本文件,把下面内容粘贴进去。把文件名后缀改为.ahk,然后双击就启动了脚本哈哈!

这时你试着按一下键盘上的ScrollLock键,就会弹出来一个对话框。效果是这样的:

按下ScrollLock键后弹出的框框

你可以在这里输入改代理的命令~ 我设计的命令都非常简单,如下:

  • 输入proxy,就会打开IE设置的窗口

  • 输入proxy 192.168.1.1:8080 ,就会把代理设置为这个IP

  • 输入proxy on,就会打开代理(但是IP为空)

  • 输入proxy off,就会关闭代理

  • 输入pac http://abc.com/123.pac,就开启某自动代理设置脚本

  • 输入pac off,就会关闭自动脚本

输入指令的样子

注意:

  1. 我这里注册的键是键盘上的ScrollLock按钮,按一下就有了。也可以自己设定一个。

  2. 下面的代码是处理过的,实际上这个按键远比它要方便的多:它是我的快速操作杀手锏,一条命令实现巨多功能。如有感兴趣的可以联系我讨论,或者看我的下一篇专门针对AHK的文章(如果我不犯懒写了的话)。

  3. 我设定的指令是proxy ??这样的,如果嫌长或者不方便,可以改为别的自己用着舒服的。甚至不用弹出框,直接按一下F1之类的就完成设置都可以。不过这就需要稍微了解下AHK语法啦~(也不难)

ScrollLock:: 
{
    ; --- 获取指令及关键词 ---
    InputBox, fullCommand, (Command Line Interface), Please give me a command:, , 600, 130 ;获取命令
    if (fullcommand = "")
        Return
    ; -- 解析命令 ---
    split  := " " 
    StringGetPos , posi, fullCommand, %split%
    if (posi > 0) {
        StringMid, eng, fullCommand, 0 , posi ;
        StringMid, key, fullCommand, posi+2 , StrLen(fullCommand)
    }
    else {
        eng := fullCommand
        key := ""
    }
        ; === 打开IE设置窗口的命令 ===
        ieSettings := "rundll32.exe shell32.dll, Control_RunDLL inetcpl.cpl, ,4L"
        ; === python脚本的地址 ===
    path  := "D:\Solomon Xie\Workspace\setRegProxy.py" ;Python设置代理脚本,可接收命令行参数
    ; ---开始执行操作---
    if      (eng = "" and fullcommand != "")
        Run % ieSettings
    else if (eng = "Proxy"){
        if (key = "")
            Return
        else if (key = "Off")
            Run % path " -o Off "
        else{
            if (key = "On")
                key := "" ;“获取”历史IP值太麻烦 先为空吧
            else
                key = "--proxy " %key%
            Run % path  " -o ProxyOnly " key
        }
    }
    else if (eng = "Pac" and key != "") {
        if (key = "" or key = "On")
            key = "http://xduotai.com/pRsO3NGR3-.pac"
        if (key = "Off")
            Run % path  " -o Off "
        else {
            key = "%key%"
            Run % path " -o PacOnly --pac " key
        }
    }
    Return
}
<think>我们正在解决Windows系统中使用idf.py时出现的"No module named 'click'"错误。根据之前的解决方案,我们需要确保Python环境正确配置,并安装所需的依赖包。由于是在Windows系统,步骤会有所不同。 解决思路: 1. 确认Python环境:确保使用ESP-IDF支持的Python版本(3.6以上)。 2. 安装或修复click模块:通过pip安装缺失的模块。 3. 安装所有ESP-IDF的Python依赖:使用requirements.txt文件安装所有必要包。 4. 检查环境变量:确保Python的Scripts目录在PATH中,以便命令行可以找到idf.py和相关工具。 5. 使用ESP-IDF提供的环境:在ESP-IDF命令提示符中运行命令。 详细步骤: 步骤1:确认Python环境 打开ESP-IDF的命令提示符(通常通过开始菜单中的“ESP-IDF Command Prompt”快捷方式打开)。然后检查Python版本: ```bash python --version ``` 如果显示的版本低于3.6,需要安装或切换到更高版本。 步骤2:安装click模块 在ESP-IDF命令提示符中运行: ```bash pip install click ``` 如果因为权限问题无法安装,可以加上`--user`选项: ```bash pip install --user click ``` 步骤3:安装所有依赖 通常,ESP-IDF目录下有一个requirements.txt文件,包含了所有需要的Python包。运行以下命令安装所有依赖: ```bash pip install --user -r %IDF_PATH%\requirements.txt ``` 其中`%IDF_PATH%`是环境变量,指向ESP-IDF的安装目录。在ESP-IDF命令提示符中,这个变量已经设置好。 步骤4:检查环境变量 确保Python的Scripts目录(例如`C:\Users\<用户名>\AppData\Roaming\Python\Python39\Scripts`)被添加到PATH环境变量中。在ESP-IDF命令提示符中,通常已经设置好,但如果安装包时使用了`--user`选项,可能需要手动添加。 步骤5:在正确的环境中运行 确保始终在ESP-IDF命令提示符中运行idf.py命令,因为该环境设置了必要的环境变量。 如果问题仍然存在,可以尝试以下步骤: 1. 更新pip和setuptools: ```bash python -m pip install --user --upgrade pip setuptools ``` 2. 重新安装ESP-IDF工具:使用ESP-IDF安装工具(如离线安装包或在线安装工具)修复安装。 3. 检查多个Python冲突:如果系统中有多个Python安装,确保ESP-IDF使用的是正确的那个。可以通过`where python`命令查看。 4. 使用虚拟环境(可选): 在项目目录中创建虚拟环境: ```bash python -m venv venv venv\Scripts\activate.bat pip install -r %IDF_PATH%\requirements.txt ``` 然后在该虚拟环境中运行idf.py。 注意:在Windows中,路径使用反斜杠,并且环境变量用%括起来。 参考:ESP-IDF官方文档中关于Windows环境设置的部分[^1]。 相关问题: 1. 如何在Windows上设置ESP-IDF开发环境? 2. 如何解决ESP-IDF中其他Python模块缺失的问题? 3. 在Windows上使用ESP-IDF时,如何管理多个项目环境?</think>### 解决 Windows 系统 ESP-IDF "No module named 'click'" 错误 在 Windows 系统使用 ESP-IDF 时出现 "No module named 'click'" 错误,通常是由于 Python 环境配置不正确或依赖包缺失所致。以下是完整的解决步骤: --- #### 1. **激活 ESP-IDF 环境** ESP-IDF 必须在其专属环境中运行: ```cmd :: 通过开始菜单找到并运行 "ESP-IDF Command Prompt" cd %IDF_PATH% install.bat export.bat ``` 这将激活包含所有必要工具链的环境[^1]。 --- #### 2. **安装缺失的 Python 依赖** 在 **ESP-IDF Command Prompt** 中执行: ```cmd pip install click :: 安装所有依赖包(关键步骤) pip install -r %IDF_PATH%\requirements.txt ``` ![ESP-IDF 命令提示符示意图](https://docs.espressif.com/projects/esp-idf/en/latest/_images/command-prompt.png) *图:必须在 ESP-IDF 专用终端操作[^1]* --- #### 3. **修复 Python 环境冲突** ##### 情况1:多个 Python 版本冲突 ```cmd where python :: 查看所有Python路径 set PATH=C:\Python38;%PATH% :: 指定ESP-IDF使用的Python版本 ``` ##### 情况2:虚拟环境问题 ```cmd python -m venv %IDF_PATH%\venv %IDF_PATH%\venv\Scripts\activate pip install -r %IDF_PATH%\requirements.txt ``` --- #### 4. **验证修复** ```cmd python -c "import click; print(click.__version__)" > 应输出版本号(如8.1.0) cd your_project_directory idf.py --version > 应显示ESP-IDF版本 ``` --- #### 5. **彻底重装工具链(终极方案)** 如果以上无效,使用官方安装工具修复: 1. 下载 [ESP-IDF Tools Installer](https://dl.espressif.com/dl/esp-idf/) 2. 选择 **"Modify"** > 勾选 **"Python environment"** 3. 完成安装后重启电脑 --- ### 关键注意事项 1. **永远使用专用终端** 所有操作必须在 **ESP-IDF Command Prompt** 中完成,普通 CMD 或 PowerShell 会缺少环境变量[^1]。 2. **路径规范** Windows 路径需使用: ```cmd %IDF_PATH%\requirements.txt :: 正确 C:/esp-idf/requirements.txt :: 错误(Linux风格路径无效) ``` 3. **权限问题** 避免安装在 `C:\Program Files\`,建议路径如 `C:\esp-idf\`,否则可能因权限导致安装失败。 --- ### 故障排查表 | 现象 | 解决方案 | |------|----------| | 安装后仍报错 | 运行 `python -m pip install --upgrade pip setuptools` | | 提示 `'idf.py' 不是命令` | 检查 `%IDF_PATH%\tools` 是否在 PATH 中 | | 虚拟环境激活失败 | 使用 `%IDF_PATH%\venv\Scripts\activate.bat`(非Linux的`source`) | | 公司网络限制 | 添加代理:`pip --proxy=http://proxy_ip:port install click` | > 注:完整指南见 [ESP-IDF Windows Setup](https://docs.espressif.com/projects/esp-idf/en/latest/esp32/get-started/windows-setup.html)[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值