成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Windows上利用Python自動切換代理IP的終極方案!

jeyhan / 4160人閱讀

摘要:在中,格式是,所以需要把格式統(tǒng)一為注冊表的標(biāo)準(zhǔn)。注冊表的二進(jìn)制值及關(guān)鍵信息如下開關(guān)長度地址是否跳過本地代理地址通過在中導(dǎo)入文件的方式執(zhí)行并立即生效。本代碼可以根據(jù)需要自動設(shè)置代理。

聲明下:不同于網(wǎng)絡(luò)上千百篇方法,下文是經(jīng)過各種嚴(yán)格測試都通過的,同時(shí)也是一個實(shí)驗(yàn)的過程,排除了各種不靠譜的方法。有需要的可以評論來討論,想要源碼和相關(guān)參考文獻(xiàn)或筆記的,也可以找我。

思路及啟發(fā)

先說一下我這一路實(shí)驗(yàn)的思路吧,這個至關(guān)重要。

之前一直在用Python做爬蟲抓取數(shù)據(jù),發(fā)現(xiàn)本機(jī)IP的問題不解決,爬蟲相當(dāng)于白費(fèi)了。然后各種百度,不管是用urllib2還是requests的代理設(shè)置,都不管用。然后又各種搜索Python更改windows代理的設(shè)置,還需要接觸windos底層API,有復(fù)雜又不好實(shí)現(xiàn)。于是爬蟲的學(xué)習(xí)就放棄了好長一段時(shí)間。

最近因?yàn)橐恢痹谟?b>AutoHotkey大大加快電腦操作效率,各種快捷鍵和代替手動操作一些常規(guī)系統(tǒng)設(shè)置。突發(fā)奇想,想讓它自動打開IE的Internet設(shè)置,然后自動點(diǎn)擊“局域網(wǎng)設(shè)置”,在自動在代理框里輸入IP地址,按回車完成設(shè)置。這真是個好主意~

不過失敗了。。。因?yàn)锳HK在IE設(shè)置彈出的框框中選擇某一個輸入框,很麻煩,我也沒法實(shí)現(xiàn)。所以就在想另一個辦法,因?yàn)锳HK操作Windows的cmd命令很方便,所以在想能不能用它打開cmd然后用命令設(shè)置IE呢?

然后又各種百度。發(fā)現(xiàn)這是可以通過reg add注冊表設(shè)置來實(shí)現(xiàn)的!于是,就開啟了reg命令的百度之旅。

按照網(wǎng)上各種方法,都指向了注冊表的這個地方:

HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternet Settings

大家都說在這個路徑下,有這么3個項(xiàng)非常重要:

ProxyEnable - 使用代理

ProxyServer - 代理IP的地址及端口號

AutoConfigURL - 自動配置腳本(PAC)的地址

于是試著用reg add命令操作:

reg add "HKCUSoftwareMicrosoftWindowsCurrentVersionInternet Settings" /v ProxyEnable /tREG_DWORD /d 1 /f
reg add "HKCUSoftwareMicrosoftWindowsCurrentVersionInternet Settings" /v ProxyServer /d"192.168.1.1:8080" /f

這兩句第一個是打開“代理”,第二個是設(shè)置代理的IP地址。

先在命令行里敲了下命令,然后打開regedit注冊表,刷新下看,還真改了!

然后手動打開IE設(shè)置,發(fā)現(xiàn)里面的內(nèi)容也確實(shí)改變了。然后再打開瀏覽器,打開IP查詢的網(wǎng)址,自己的IP真的變了!

至此以為大功告成了。結(jié)果再用時(shí),發(fā)現(xiàn)大錯特錯——再次用命令行改我指定的IP地址后,網(wǎng)頁打不開了。。。

來回反復(fù)調(diào)試查錯之后,我發(fā)現(xiàn)一個“大秘密”:如果不手動打開IE設(shè)置里的局域網(wǎng)設(shè)置窗口的話,所有代理設(shè)置是不生效的。這是為什么呢?

百度里搜索不到。

于是我就用英文到Stackoverflow去搜,結(jié)果發(fā)現(xiàn)實(shí)際影響本機(jī)代理的注冊表項(xiàng)目并不是之前的那幾個!(真懷疑網(wǎng)上那些人說自己用這個項(xiàng)達(dá)到定時(shí)設(shè)置代理的人是不是玩真的。。。)

而是這個位置的項(xiàng):

HKCUSoftwareMicrosoftWindowsCurrentVersionInternet SettingsConnections

其中的DefaultConnectionSettings才是真正需要改的東西。打開以后各種亂碼,原來是二進(jìn)制值。
不過用編輯器看二進(jìn)制值,確實(shí)發(fā)現(xiàn)代理IP地址和自動配置腳本的地址都在里面。

那怎么辦呢?AHK可不會操作二進(jìn)制,也沒什么方法能用reg add命令行直接把二進(jìn)制值注入。然后又進(jìn)入無盡的百度模式。

注冊表的二進(jìn)制項(xiàng)修改方式的突發(fā)奇想

忘了什么啟發(fā)的我吧,好像是自己無聊到在注冊表上亂點(diǎn),發(fā)現(xiàn)我刻意導(dǎo)出注冊表。

然后導(dǎo)出了下試試,發(fā)現(xiàn)是個.reg文件。然后無聊雙擊一下,發(fā)現(xiàn)可以把這個文件導(dǎo)入到注冊表!于是靈光一閃,趕緊用文本編輯器打開這個.reg文件,發(fā)現(xiàn)里面是文字畫的十六進(jìn)制碼,類似這樣的:

Windows Registry Editor Version 5.00
[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternet SettingsConnections]
"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介入)

這個時(shí)候我還不知道這是正確答案,只是想試一試:

用Python組成一段有效的二進(jìn)制碼(其實(shí)是十六進(jìn)制) -> 把注冊表值封裝為reg文件 -> 通過命令行的reg import命令導(dǎo)入reg文件 -> 成功!

然后問題就在于怎么安裝正確的格式組成

DefaultConnectionSettings十六進(jìn)制值的分析

于是繼續(xù)到Stackoverflow上搜索DefaultConnectionSettings這個項(xiàng)中十六進(jìn)制的讀取問題。
發(fā)現(xiàn)有一個人大概總結(jié)了每一位字節(jié)是代表什么,不過不夠詳細(xì)。地址在這里【How to set "automatic configuration script" for a dial-up connection programmatically?】

然后開始做筆記:

接著開始嘗試對照著那段二進(jìn)制值看一看。于是我把這段十六進(jìn)制碼做成PDF,方便做筆記,大概是這樣的:

實(shí)際的十六進(jìn)制值果然和網(wǎng)上的不同。經(jīng)過實(shí)驗(yàn),后面一大段畫刪除線的,都是沒用的,刪除也沒關(guān)系。實(shí)際上,它只有在你手動打開IE設(shè)置面板時(shí),才自動加上的。不管它,實(shí)際上有用的十六進(jìn)制并不長。總結(jié)下也就這么幾位:

46 00 00 00 00 00 00 00 開關(guān) 00 00 00 IP長度 00 00 00 IP地址 00 00 00 是否跳過本地代理 21 00 00 00 PAC地址

其中,通過規(guī)律發(fā)現(xiàn)每個信息的分隔符是三個00,即00 00 00。上面有7個00的,因?yàn)闆]什么用我就不講了(其實(shí)第四個代表自增數(shù),直接為00就好了)

當(dāng)然,其中漢字的部分是十六進(jìn)制格式的。

這幾個漢字,是其中最重要的信息,具體如下:

開關(guān)(switcher): 主要代表IE設(shè)置中復(fù)選框的選中情況,你可以打開IE設(shè)置看看。以下是所有可用的值(括號中是我用的別名):

0F全部開啟(ALL);01全部禁用(Off)

03使用代理服務(wù)器(ProxyOnly);05使用自動腳本(PacOnly);

07使用腳本和代理(ProxyAndPac);09打開自動檢測設(shè)置(D);

0B打開自動檢測并使用代理(DIP);0D打開自動檢測并使用腳本(DS);

IP長度:必須是十六進(jìn)制的,0就是00,7就是07,10就是0a,11是0b。在Python中,格式是0xa,所以需要把格式統(tǒng)一為注冊表的標(biāo)準(zhǔn)。

IP地址:直接把IP安裝每個字符轉(zhuǎn)十六進(jìn)制就好了。如果IP為空的話,就直接為00。這時(shí)會看到switcher后面跟了11個00。。。

是否跳過本地代理:這段有點(diǎn)復(fù)雜,實(shí)際上我們幾乎不用。如果不用的話直接為00就好了。但是用的話,就必須寫為:附加信息長度00 00 00 附加信息這樣的。

附加信息:只能是這句話:

附加信息長度:因?yàn)楦郊有畔⑹枪潭ǖ?,所以?位,寫為07就好了。

PAC地址:這個簡單,直接把PAC地址翻譯為十六進(jìn)制就好了。如果沒有則什么都不寫。

至此這段十六進(jìn)制值就全部解析完畢了。

剩下的就是把你需要的代理IP地址和PAC地址作為參數(shù)傳進(jìn)去就好了。然后把這段值封裝到reg文件中的對應(yīng)位置就完全ok了~這步太簡單,就不用多說了。

增加更方便的功能

各種測試成功后,非常高興。但是還有點(diǎn)余味不足,就想著多添加點(diǎn)方便的功能。

這個Python文件的最后成品可以做到這些事:

直接通過命令行傳參數(shù)達(dá)到各種設(shè)置代理的效果。這個很自豪~第一次用系統(tǒng)參數(shù)功能,哈哈哈!

在文件夾中直接雙擊達(dá)到效果

在別的Python文件中(如爬蟲)作為模塊被使用

被AHK調(diào)用

在Autohotkey中調(diào)用——極其方便極其傻瓜式操作!

不忘初心嘛~

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

這一步可能也就寫了幾分鐘,讓AHK直接帶參數(shù)打開python腳本就做到了。比如設(shè)置一個代理IP地址:

path = "D:setRegProxy.py" ;這里是python腳本的地址,隨便放哪都行。
key   = "0.0.0.0:80"  ;這里根據(jù)需要設(shè)置為代理地址
Run % path " -o ProxyOnly " key

這樣就齊活了~

當(dāng)然,我的AHK腳本實(shí)現(xiàn)的功能比這個還要爽快——彈出一個小輸入框,直接粘貼一個ip地址,按回車就能實(shí)現(xiàn)代理設(shè)置。

Python腳本的源碼(setProxy.py)

只要機(jī)器上安裝了Python 2.x版本就行,不需要依賴安裝和設(shè)置其他任何東西。

# 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: HKUCSoftwareMicrosoftWindowsCurrentVersionInternet SettingsConnections
  # Anlysis : 注冊表的二進(jìn)制值(及關(guān)鍵信息)如下:"46 00 00 00 00 00 00 00 開關(guān) 00 00 00 IP長度 00 00 00 IP地址 00 00 00 是否跳過本地代理 21 00 00 00 PAC地址"
  # Method  : 通過在cmd中導(dǎo)入reg文件的方式執(zhí)行并立即生效。
  # Notes   : - 二進(jìn)制值的設(shè)置選項(xiàng)在代碼中已經(jīng)體現(xiàn)了。本代碼可以根據(jù)需要自動設(shè)置代理。
  # switcher: 開關(guān):0F全部開啟(ALL);01全部禁用(Off)
              03使用代理服務(wù)器(ProxyOnly);05使用自動腳本(PacOnly);
              07使用腳本和代理(ProxyAndPac);09自動檢測設(shè)置(D);
              0B自動檢測并使用代理(DIP);0D自動檢測并使用腳本(DS);
"""
import os, sys, re, getopt

def regIESettings(op, noLocal=False, ip="", pac=""):
  """
    # 根據(jù)需求生成Windows代理設(shè)置注冊表的.reg文件內(nèi)容
    # DefaultConnectionSettings項(xiàng)是二進(jìn)制項(xiàng)
    # 而具體這個二進(jìn)制文件怎么解析,在收藏的PDF中有詳細(xì)解釋。
  """
  if not op : return
  # 如果是設(shè)置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 "
---Unexpected Option. Please check the value after [-o]---
"
      return
    skipLocal = "07,00,00,00,%s"%__toHex("") 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("")),"skipLocal":skipLocal,"pac":","+__toHex(pac) if pac else "" })
  settings = "Windows Registry Editor Version 5.00
[HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternet SettingsConnections]
"DefaultConnectionSettings"=hex:%s" % reg_value
  # print "Using proxy address: %s" % ip
  print op, ip, pac
  print options[op] +"
"+ __toHex(ip) +"
"+ __toHex(pac)
  print settings
  # === 生成reg文件并導(dǎo)入到注冊表中 ===
  filePath = "%sDefaultConnectionSettings.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 # 如果是一位數(shù)則自動補(bǔ)上0,7為07,e為0e

if __name__ == "__main__":
  # 獲取文件外部參數(shù)
  # 用法:在命令行中輸入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 #調(diào)試用
  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怎么用呢?太簡單了,傻到爆!

直接官網(wǎng)下載安裝一個Autohotkey軟件,也就幾M。然后呢,新建一個文本文件,把下面內(nèi)容粘貼進(jìn)去。把文件名后綴改為.ahk,然后雙擊就啟動了腳本哈哈!

這時(shí)你試著按一下鍵盤上的ScrollLock鍵,就會彈出來一個對話框。效果是這樣的:

你可以在這里輸入改代理的命令~ 我設(shè)計(jì)的命令都非常簡單,如下:

輸入proxy,就會打開IE設(shè)置的窗口

輸入proxy 192.168.1.1:8080 ,就會把代理設(shè)置為這個IP

輸入proxy on,就會打開代理(但是IP為空)

輸入proxy off,就會關(guān)閉代理

輸入pac http://abc.com/123.pac,就開啟某自動代理設(shè)置腳本

輸入pac off,就會關(guān)閉自動腳本

注意:

我這里注冊的鍵是鍵盤上的ScrollLock按鈕,按一下就有了。也可以自己設(shè)定一個。

下面的代碼是處理過的,實(shí)際上這個按鍵遠(yuǎn)比它要方便的多:它是我的快速操作殺手锏,一條命令實(shí)現(xiàn)巨多功能。如有感興趣的可以聯(lián)系我討論,或者看我的下一篇專門針對AHK的文章(如果我不犯懶寫了的話)。

我設(shè)定的指令是proxy ??這樣的,如果嫌長或者不方便,可以改為別的自己用著舒服的。甚至不用彈出框,直接按一下F1之類的就完成設(shè)置都可以。不過這就需要稍微了解下AHK語法啦~(也不難)

ScrollLock:: 
{
    ; --- 獲取指令及關(guān)鍵詞 ---
    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設(shè)置窗口的命令 ===
        ieSettings := "rundll32.exe shell32.dll, Control_RunDLL inetcpl.cpl, ,4L"
        ; === python腳本的地址 ===
    path  := "D:Solomon XieWorkspacesetRegProxy.py" ;Python設(shè)置代理腳本,可接收命令行參數(shù)
    ; ---開始執(zhí)行操作---
    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
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/37724.html

相關(guān)文章

  • 如何快速掌握Python數(shù)據(jù)采集與網(wǎng)絡(luò)爬蟲技術(shù)

    摘要:通過本文的學(xué)習(xí),可以快速掌握網(wǎng)絡(luò)爬蟲基礎(chǔ),結(jié)合實(shí)戰(zhàn)練習(xí),寫出一些簡單的爬蟲項(xiàng)目。從技術(shù)手段來說,網(wǎng)絡(luò)爬蟲有多種實(shí)現(xiàn)方案,如。二網(wǎng)絡(luò)爬蟲技術(shù)基礎(chǔ)在本次課中,將使用技術(shù)手段進(jìn)行項(xiàng)目的編寫。 摘要:本文詳細(xì)講解了python網(wǎng)絡(luò)爬蟲,并介紹抓包分析等技術(shù),實(shí)戰(zhàn)訓(xùn)練三個網(wǎng)絡(luò)爬蟲案例,并簡單補(bǔ)充了常見的反爬策略與反爬攻克手段。通過本文的學(xué)習(xí),可以快速掌握網(wǎng)絡(luò)爬蟲基礎(chǔ),結(jié)合實(shí)戰(zhàn)練習(xí),寫出一些簡單的...

    W4n9Hu1 評論0 收藏0
  • Windows 命令行下解決python utf-8中文輸出終極解決方案

    摘要:代碼參考了這里上文對各種系統(tǒng)無法輸出奇葩編碼的字符做了總結(jié),本文中只針對下編碼但想執(zhí)行編碼的文件進(jìn)行修改。這樣就實(shí)現(xiàn)了下和下兼容了當(dāng)然如果不知道原來是什么編碼,但想轉(zhuǎn)成編碼的話,將上面的條件刪掉即可。 代碼參考了這里:http://wiki.python.org/moin/P... 上文對各種系統(tǒng)無法輸出奇葩編碼的字符做了總結(jié),本文中只針對windows cmd下GBK編碼(cp936...

    h9911 評論0 收藏0
  • 【失敗】windows10中利用MingGW編譯64 bit GVIM with python27/

    摘要:終極目標(biāo)問題描述首先聲明,這是一次失敗的編譯經(jīng)歷,僅供參考,歡迎討論。近期發(fā)現(xiàn)是一個很棒的編輯器,簡潔高效。所以,毅然決然,自己從源碼編譯一個。首先運(yùn)行上面目錄樹中的。我猜想這可能和我的失敗有關(guān)。設(shè)置為,編譯結(jié)果是,則代表。 終極目標(biāo) VIM = Python multi-version IDE 問題描述 首先聲明,這是一次失敗的編譯經(jīng)歷,僅供參考,歡迎討論。 近期發(fā)現(xiàn)VIM是一個很棒...

    cikenerd 評論0 收藏0
  • 【失敗】windows10中利用MingGW編譯64 bit GVIM with python27/

    摘要:終極目標(biāo)問題描述首先聲明,這是一次失敗的編譯經(jīng)歷,僅供參考,歡迎討論。近期發(fā)現(xiàn)是一個很棒的編輯器,簡潔高效。所以,毅然決然,自己從源碼編譯一個。首先運(yùn)行上面目錄樹中的。我猜想這可能和我的失敗有關(guān)。設(shè)置為,編譯結(jié)果是,則代表。 終極目標(biāo) VIM = Python multi-version IDE 問題描述 首先聲明,這是一次失敗的編譯經(jīng)歷,僅供參考,歡迎討論。 近期發(fā)現(xiàn)VIM是一個很棒...

    JeOam 評論0 收藏0

發(fā)表評論

0條評論

jeyhan

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<