# -*- coding: utf-8 -*-
"""
Created on Thu Nov 30 10:11:25 2017
@author:
"""
# -*- coding: utf-8 -*-
import re
import subprocess
import json
import requests
import tkinter.messagebox
import webbrowser
import time
class ShadowSocks(object):
"""docstring for ShadowSocks
初始化函數的兩個參數:
ssPath, ssConfigPath分別代表可執行程序shadowsocks.exe的路徑, gui-config.json的路徑
函數:
setShadowSocks(self, pattern=JapanA_pattern) # 可用help查看使用
getHtml(self) # 獲取頁面內容
printItem(self, pattern=JapanA_pattern) # 獲取服務器內容
"""
def __init__(self, ssPath, ssConfigPath):
'''
文檔註釋
Args:
ssPath: 代表可執行程序shadowsocks.exe的路徑
ssConfigPath: 代表gui-config.json的路徑
'''
super(ShadowSocks, self).__init__()
self.ssPath = ssPath
self.ssConfigPath = ssConfigPath
self.getHtml()
# 獲取頁面內容
def getHtml(self):
'''
文檔註釋
Args:
None
Returns:
None: 無返回值
self.content 保存頁面內容
若訪問頁面失敗, 程序直接退出.
'''
res = requests.get(url=url, headers=headers)
if res.status_code:
res.encoding = 'utf-8'
self.content = res.text
else:
print("error!")
exit(0)
# 設置服務器
def setShadowSocks(self, pattern):
'''
文檔註釋
Args:
pattern:所要爬取的服務器的模式.
可選值有:
* JapanA_pattern # 日本服務器A
* JapanB_pattern # 日本服務器B
* JapanC_pattern # 日本服務器C
* SingaporeA_pattern # 新加坡服務器A
* SingaporeB_pattern # 新加坡服務器B
* SingaporeC_pattern # 新加坡服務器C
* UsaA_pattern # 美國服務器A
Returns:
None, 無返回
'''
item = re.findall(pattern, self.content)[0]
if not item:
return
print(item)
server = item[0]
server_port = item[1]
password = item[2]
method = item[3]
data = None
with open(self.ssConfigPath, "r+") as f:
data = json.load(f)
data['configs'][0]['server'] = server
data['configs'][0]['server_port'] = server_port
data['configs'][0]['password'] = password
data['configs'][0]['method'] = method
with open(self.ssConfigPath, "w") as f:
json.dump(data, f, indent=4)
subprocess.call('taskkill /f /im shadowsocks.exe', stdout=subprocess.PIPE)
subprocess.Popen(self.ssPath)
##################################################
## 基本變量
##################################################
url = 'http://ss.ishadowx.com/' # 所要爬取服務器密碼的網站
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
}
# 匹配日本服務器的模式
JapanA_pattern = re.compile(r'<span id="ipjpa">(.+?)</span>.+<h4>Port:<span id="portjpa">(.+?)\n</span>.+<span id="pwjpa">(.+?)\n</span>.+<h4>Method:(.+?)</h4>', re.S)
JapanB_pattern = re.compile(r'<span id="ipjpb">(.+?)</span>.+<h4>Port:<span id="portjpb">(.+?)\n</span>.+<span id="pwjpb">(.+?)\n</span>.+<h4>Method:(.+?)</h4>', re.S)
JapanC_pattern = re.compile(r'<span id="ipjpc">(.+?)</span>.+<h4>Port:<span id="portjpc">(.+?)\n</span>.+<span id="pwjpc">(.+?)\n</span>.+<h4>Method:(.+?)</h4>', re.S)
# 匹配新加坡服務器的模式
SingaporeA_pattern = re.compile(
r'<span id="ipsga">(.+?)</span>.+<h4>Port:<span id="portsga">(.+?)\n</span>.+<span id="pwsga">(.+?)\n</span>.+<h4>Method:(.+?)</h4>', re.S)
SingaporeB_pattern = re.compile(
r'<span id="ipsgb">(.+?)</span>.+<h4>Port:<span id="portsgb">(.+?)\n</span>.+<span id="pwsgb">(.+?)\n</span>.+<h4>Method:(.+?)</h4>', re.S)
SingaporeC_pattern = re.compile(
r'<span id="ipsgc">(.+?)</span>.+<h4>Port:<span id="portsgc">(.+?)\n</span>.+<span id="pwsgc">(.+?)\n</span>.+<h4>Method:(.+?)</h4>', re.S)
# 匹配美國服務器的模式
UsaA_pattern = re.compile(
r'<span id="ipusa">(.+?)</span>.+<h4>Port:<span id="portusa">(.+?)\n</span>.+<span id="pwusa">(.+?)\n</span>.+<h4>Method:(.+?)</h4>', re.S)
UsaB_pattern = re.compile(
r'<span id="ipusb">(.+?)</span>.+<h4>Port:<span id="portusb">(.+?)\n</span>.+<span id="pwusb">(.+?)\n</span>.+<h4>Method:(.+?)</h4>', re.S)
UsaC_pattern = re.compile(
r'<span id="ipusc">(.+?)</span>.+<h4>Port:<span id="portusc">(.+?)\n</span>.+<span id="pwusc">(.+?)\n</span>.+<h4>Method:(.+?)</h4>', re.S)
if __name__ == '__main__':
# 更改爲你的ss程序路徑
ssPath = "D:\\Shadowsocks.exe"
# 更換爲你的ss配置文件路徑
ssConfigPath = "D:\\gui-config.json"
a = ShadowSocks(ssPath, ssConfigPath)
a.setShadowSocks(SingaporeA_pattern)