蘭雅sRGB 个人笔记 https://262235.xyz
提供编程和电脑应用视频教程,工具和源代码
C, C++, Python Programming, Source Code, Video

旧Hexo博客 | Github | IP定位WebAPI | Docker Hub
编程中文文档 | 网盘分享 | 中文Linux命令

Python学习: Qrcode库学习,把订阅转换成二维码

logo.png

首先我们要下载网页数据,选用Python最常用抓网页库 Requests

  • 我们使用 github的events 举例 requests 库简单的使用,实际使用订阅URL
import requests
url = 'https://api.github.com/events'
r = requests.get(url)

requests.png

  • 如图,开启 Python Shell 命令行,输入上面三行代码,网页数据就下载到本地内存中了
  • 输入 r.txet 就能显示网页的文本信息,本例获取的是 json数据

实际订阅数据是 base64 编码的加密数据,我们需要解码才能看到信息

import base64
s = base64.b64decode(r.text).decode('ascii')
print(s)
vms = s.split('\n')

base64.png

  • base64 解码也很简单,使用前先导入库 import base64,然后使用 base64.b64decode 解码
  • 变量 s 就是解码订阅后的文本, print(s),就能把节点配置分行打印出来了
  • 如图 s[:100] 只显示前100个字节文本,再使用 s.split('\n') 把节点分离保存的 vms 数组里
  • 命令 vms[0] 是第一个节点的数据,检查比较得知,我们获得正确

转传成二维码其实也是很简单,需要 QRCode

import qrcode
i=7
img = qrcode.make(vms[i])
img.save('vms_007.png')

007.png

  • 如图,接着输入上面代码,使用 qrcode.make 函数把文本转换成图像, save 保存成 png 格式
  • 变量 i=7 ,用来选择节点序号

最后完成的Python脚本: QRCode把订阅转换成二维码

  • 实际脚本在增加了在图片添加文本信息,用来区别协议节点
  • 添加的函数代码中都有注释
import requests, base64, re , qrcode, io
from PIL import Image, ImageDraw, ImageFont

""" # 图片转RGB  # 创建一个可以在给定图像上绘图的对象
    # 字体的格式,中文要中文字体       # 绘制文本 """
def image_add_text(img, text, left, top, text_color=(255, 0, 0), text_size=13):
    img = img.convert("RGB")
    draw = ImageDraw.Draw(img)
    fontStyle = ImageFont.truetype("FreeMono.ttf", text_size, encoding="utf-8")
    draw.text((left, top), text, text_color, font=fontStyle)
    return img

def print_md(text, file):
    print("![%s](./png/%s)\n" % (text , file))

# 获取订阅表,Base64解码,节点分离
url = 'https://github.公益项目/USA'
r = requests.get(url)
s = base64.b64decode(r.text).decode('ascii')
vms = s.split('\n')

# 节点配置转换 Qrcode 二维码
def make_qrc(vms , i):
    img = qrcode.make(vms[i])
    new_size = (int(img.size[0]/2), int(img.size[1]/2))
    img = img.resize(new_size)
    text = vms[i][:32]
    img = image_add_text(img, text , 2, 2 , text_color=(0,0,0), text_size=18)
    img = img.convert("L")
    return img

# 遍历节点全转 Qrcode
for i in range(len(vms)-1):
    img = make_qrc(vms, i)
    text = vms[i][:10].replace("://", "_")
    file = str(i) + '_'+ text  +'.png'
    img.save('./png/' + file)
    print_md(vms[i][:32] , file)

除了转换二维码,我还可以二次解码节点配置信息

import re, json
for vmess in vms :
    res = re.match(r"vmess://(.*)", vmess)
    try :
        json_str = base64.b64decode(res[1]).decode('utf-8')
        data = json.loads(json_str)
        print("UUID: %s\tAdd: %s:%s\n" % (data['id'], data['add'],  data['port']) )
    except:
        pass

uuid.png

  • 使用 regex 正则表达式库 和 json 轻量级数据交换格式库
本原创文章自由转载,转载请注明本博来源及网址 | 当前页面:蘭雅sRGB 个人笔记 » Python学习: Qrcode库学习,把订阅转换成二维码