自动更新shadowsocks免费密码之python爬虫实战

版权声明:本文为博主原创文章,未经博主 请随意转载!! 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中,并启用服务代理即可

猜你喜欢

转载自blog.csdn.net/VonSdite/article/details/75332446
今日推荐