using ss



# -*- 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)   
    

發佈了35 篇原創文章 · 獲贊 103 · 訪問量 31萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章