版权声明:本文为博主原创文章,未经博主 请随意转载!! https://blog.csdn.net/VonSdite/article/details/75332446
详情见github: (https://github.com/VonSdite/Auto_ishadow)
实现原因:
因为http://ss.ishadowx.com/上的密码每6小时会更换(0点, 6点, 12点, 18点)并重启服务器,导致每次都要重新打开网页去找密码,所以做了以下程序,每次只需启动程序就会重新获取密码,并会自动打开shadowsocks,方便了使用.
从而实现需要科学上网时, 运行该项目代码即可科学上网
使用及注意:
- 仅适用windows环境
- 代码适用需要配置python3.0以上的版本, python下载地址
python需要用到requests模块
下载requests模块的方法如下:
- 在cmd输入即可:
pip install requests
- 需要下载shadowsocks客户端, github中给出, download项目即可获得
- 使用时, 记得设置好代码的ssPath, ssConfigPath的路径(见shadowsocks.py)
实现代码:
代码分两部分:
- 第一部分api_shadowsocks.py为设计的api接口类
- 第二部分shadowsocks.py是使用举例
api_shadowsocks
主要函数 setShadowSocks(self, pattern):
- 用于爬取 http://ss.ishadowx.com/ 上的服务器,密码,端口,加密方式,并将其设置到shadowsocks.exe的配置文件中
函数getHtml(self), 用于获取页面的内容
函数printItem(self, pattern), 显示爬取的服务器,密码,端口,加密方式
实现思想
- 爬取页面上的密码,服务器,端口,加密方式
- 将爬取的信息设置到shadowsocks可执行程序的配置文件gui-config.json中
- 判断shadowsocks.exe进程是否存在(因为一个目录下的shadowsocks.exe只能打开一个), 若存在, 则关闭.
- 打开可执行程序shadowsocks.exe即可(记得启动系统代理)
文件: api_shadowsocks.py
# -*- coding: utf-8 -*-
# @Author : Sdite
# @DateTime : 2017-07-18 21:13:00
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 printItem(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
* UsaB_pattern # 建议不使用
* UsaC_pattern # 建议不使用
Returns:
None, 无返回
打印出服务器,加密方式,密码,端口
'''
item = re.findall(pattern, self.content)[0]
print('服务器 :', item[0])
print('端口 :', item[1])
print('密码 :', item[2])
print('加密方式:', item[3])
print('===================================')
# 设置服务器
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
* UsaB_pattern # 建议不使用
* UsaC_pattern # 建议不使用
Returns:
None, 无返回
'''
item = re.findall(pattern, self.content)[0]
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:(.+?)</h4>.+<span id="pwjpa">(.+?)</span>.+<h4>Method:(.+?)</h4>.+jpa.png', re.S)
JapanB_pattern = re.compile(
r'<span id="ipjpb">(.+?)</span>.+<h4>Port:(.+?)</h4>.+<span id="pwjpb">(.+?)</span>.+<h4>Method:(.+?)</h4>.+jpb.png', re.S)
JapanC_pattern = re.compile(
r'<span id="ipjpc">(.+?)</span>.+<h4>Port:(.+?)</h4>.+<span id="pwjpc">(.+?)</span>.+<h4>Method:(.+?)</h4>.+jpc.png', re.S)
# 匹配新加坡服务器的模式
SingaporeA_pattern = re.compile(
r'<span id="ipsga">(.+?)</span>.+<h4>Port:(.+?)</h4>.+<span id="pwsga">(.+?)</span>.+<h4>Method:(.+?)</h4>.+sga.png', re.S)
SingaporeB_pattern = re.compile(
r'<span id="ipsgb">(.+?)</span>.+<h4>Port:(.+?)</h4>.+<span id="pwsgb">(.+?)</span>.+<h4>Method:(.+?)</h4>.+sgb.png', re.S)
SingaporeC_pattern = re.compile(
r'<span id="ipsgc">(.+?)</span>.+<h4>Port:(.+?)</h4>.+<span id="pwsgc">(.+?)</span>.+<h4>Method:(.+?)</h4>.+sgc.png', re.S)
# 匹配美国服务器的模式
UsaA_pattern = re.compile(
r'<span id="ipusa">(.+?)</span>.+<h4>Port:(.+?)</h4>.+<span id="pwusa">(.+?)</span>.+<h4>Method:(.+?)</h4>.+usa.png', re.S)
UsaB_pattern = re.compile(
r'<span id="ipusb">(.+?)</span>.+<h4>Port:(.+?)</h4>.+<span id="pwusb">(.+?)</span>.+<h4>Method:(.+?)</h4>.+usb.png', re.S)
UsaC_pattern = re.compile(
r'<span id="ipusc">(.+?)</span>.+<h4>Port:(.+?)</h4>.+<span id="pwusc">(.+?)</span>.+<h4>Method:(.+?)</h4>.+usc.png', re.S)
if __name__ == '__main__':
# 更改为你的ss程序路径
ssPath = "E:\Shadowsocks\Shadowsocks.exe"
# 更换为你的ss配置文件路径
ssConfigPath = "E:\Shadowsocks\gui-config.json"
a = ShadowSocks(ssPath, ssConfigPath)
a.printItem(pattern=JapanA_pattern)
a.printItem(pattern=JapanB_pattern)
a.printItem(pattern=JapanC_pattern)
a.printItem(pattern=SingaporeA_pattern)
a.printItem(pattern=SingaporeB_pattern)
a.printItem(pattern=SingaporeC_pattern)
a.printItem(pattern=UsaA_pattern)
a.printItem(pattern=UsaB_pattern)
a.printItem(pattern=UsaC_pattern)
文件: shadowsocks.py
from api_shadowsocks import *
# 更改为你的ss程序路径
ssPath = "E:\Shadowsocks\Shadowsocks.exe"
# 更换为你的ss配置文件路径
ssConfigPath = "E:\Shadowsocks\gui-config.json"
if __name__ == '__main__':
shadowsocks = ShadowSocks(ssPath=ssPath, ssConfigPath=ssConfigPath)
shadowsocks.setShadowSocks(pattern=JapanA_pattern)
# setShadowSocks可选服务器
#
# pattern:所要爬取的服务器的模式.
# 可选值有(定义在api中):
# * JapanA_pattern # 日本服务器A
# * JapanB_pattern # 日本服务器B
# * JapanC_pattern # 日本服务器C
# * SingaporeA_pattern # 新加坡服务器A
# * SingaporeB_pattern # 新加坡服务器B
# * SingaporeC_pattern # 新加坡服务器C
# * UsaA_pattern # 美国服务器A
# * UsaB_pattern # 建议不使用
# * UsaC_pattern # 建议不使用
使用批处理(见github):
本次提供了两种使用shadowsocks.py的方式:
Auto.bat:直接运行shadowsocks.py,注意Auto.bat路径更改后要修改相应的路径位置(见代码注释)
(当网站密码可能在使用期间更改,当访问失效时,重新运行bat程序即可)Auto_update.bat:增加加入计划任务的功能,令其在0,6,12,18,24点重新启动程序来重新获取密码
注意,Auto.bat以及Auto_update.bat是为了方便打开程序才提供的,如果不想修改其中路径问题,直接创建快捷方式放到桌面即可
O(∩_∩)O妈妈再也不怕我掉线了 (路径问题见代码)
不使用该项目的科学上网方法:
- 直接download项目中的shadowsocks
- 然后打开ishadow的网址: http://ss.ishadowx.com/
- 找到密码和服务器,更改到shadowsocks中,并启用服务代理即可