【日常杂耍】解析SSR订阅信息,将SSR信息保存到二维码中并保存到PDF中

 

今天放弃了收费的shadowsocks小火箭,转向了免费的potatso lite,这个过程是挺有意思的。

放弃shadowsocks的原因是:它经常更新,有时候一天一更,而我又有强迫症,它一更新我就想更新,不仅如此,共享的Apple ID也经常要换,每次更换ID之后,shadowsocks都需要重新下载,SSR订阅也需要更新添加,这个过程操作太多了,放弃了。

放弃了shadowsocks,需要一个新的替代方案,刚开始,我想的是自己编译shadowsocks,还没开始尝试,又在GitHub找到了一个提供了ipa文件的项目,Outline clients,这时问题又转移了,变成了如何安装ipa文件的问题,第一想法是使用爱思助手安装,可惜的是爱思助手还没有支持macOS Big Sur,我有需要转向其他方法,看到知乎的文章如何在手机上安装IPA? 讲四种方法!再也不怕应用下架了!,准备使用捷径来操作,而还没等操作,看到了去年玩捷径时的留下的TestFlight软件大全就执行了一下,这一执行,又发现了新大陆,其中有支持shadowsocks的app,不过人数都满了,我开始搜支持shadowsocks的app内测链接,然后搜到了这个TestFlight 邀请分享:iOS 应用 测试版收集清单,其中有十几个符合要求的应用,而且有一个potatso lite的测试人数没满,我开始了测试,很快,我就遇到了两个问题,订阅无法解析,而且还有广告,这时又有点忍不了了,开始又开始搜了起来,然后发现potatso lite是免费了,我登上了我美区的Apple ID,下载了并发现没有广告,虽然用其他方式也可以SSR连接信息,但是我还是开始研究订阅的问题。

订阅连接

通过ss和ssr链接解析,知道了shadowsocks链接是通过Base64进行编码的,尝试用Base64订阅连接返回结果,得到了许多SSR链接,中间以\n隔开,而其中SSR链接的编码方式是ss和ssr链接解析中说的方式,得到了SSR链接之后,使用potatso lite添加服务器,并不太方便,所以想着把它弄成二维码,而二维码图片太多也不好传文件,所以将它们保存到PDF中。

将SSR链接保存到二维码中

将信息存到二维码中,使用的是qrcode模块,简单易用。

import qrcode
img = qrcode.make('Some data here')

PDF将图片存到pdf文件中

通过poillow模块Convert Images to PDF using Python,简单示例如下。

from PIL import Image

image1 = Image.open(r'\Users\Ron\Desktop\Test\image1.png')
image2 = Image.open(r'\Users\Ron\Desktop\Test\image2.png')
image3 = Image.open(r'\Users\Ron\Desktop\Test\image3.png')

im1 = image1.convert('RGB')
im2 = image2.convert('RGB')
im3 = image3.convert('RGB')

imagelist = [im2, im3]

im1.save(r'\Users\Ron\Desktop\Test\myImages.pdf',save_all=True, append_images=imagelist)

其中save_all是必须等于True的

通过FPDF模块,简单示例如下。

from fpdf import FPDF

document = FPDF()
document.add_page()
document.set_font('Arial', size=12)
document.cell(w=0, txt="hello world")
document.output("hello_world.pdf")

pip安装来自Github的包

示例如下,参考链接为Using the Command Line to Install Packages from GitHub

GitHub链接:https://github.com/yourname/projectname

pip install git+git://github.com/yourname/projectname.git

完整代码

最简单的方式是解析好,放在腾讯服务器上。

import base64
import requests
from pprint import pprint
import pandas as pd
import qrcode
import os
from PIL import Image
from fpdf import FPDF

def fill_padding(base64_encode_str):

    need_padding = len(base64_encode_str) % 4 != 0
    if need_padding:
        missing_padding = 4 - need_padding
        base64_encode_str += '=' * missing_padding
    return base64_encode_str

def base64_decode(base64_encode_str):
    base64_encode_str = fill_padding(base64_encode_str)
    return base64.urlsafe_b64decode(base64_encode_str).decode('utf-8')

subscription_url = 'XXXXXXXXXXXX'

response = requests.get(subscription_url)
if response.status_code == 200:
    ssr_base64_strs = response.text
    ssr_strs = base64_decode(ssr_base64_strs)
    ssr_list = ssr_strs.split('\n')

    qrcodes_dir = 'ssr qrcodes'
    if os.path.exists(qrcodes_dir) == False:
            os.mkdir(qrcodes_dir)
    ssr_names = []
    pdf = FPDF('P', 'mm', (240, 240))
    for i, ssr in enumerate(ssr_list):
        temp_ssr = ssr.replace('ssr://', '').replace('_', '/').replace('-', '+')
        ssr_name = base64_decode(temp_ssr).split('.')[0].split('-')[0]
        ssr_names.append(ssr_name)
        pdf.add_page()
        pdf.set_font('Arial', 'B', 16)
        pdf.cell(20, 10, ssr_name)
        img = qrcode.make(ssr)
        img_name = os.path.join(qrcodes_dir, ssr_name + '.png')
        img.save(img_name)
        pdf.image(img_name, 20, 20, 200)
    pdf.output(qrcodes_dir+'.pdf', 'F')
    ssrs_dict = {'server name': ssr_names, 'ssr link': ssr_list}
    df = pd.DataFrame.from_dict(ssrs_dict)
    df.to_csv('ssr_links.txt', sep='\n', header=False, index=False)