我的编程空间,编程开发者的网络收藏夹
学习永远不晚

IOS看书最终选择|源阅读转换|开源阅读|IOS自签

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

IOS看书最终选择|源阅读转换|开源阅读|IOS自签

环境:IOS想使用 换源阅读
问题:换新手机,源阅读下架后,没有好的APP阅读小说
解决办法:自签APP + 转换源仓库书源

最终预览 :https://rc.real9.cn/

背景:自从我换了新iPhone手机,就无法使换源阅读了,于是我自用上,结果发现现在的书源发展的很快,旧版本的源阅读APP部分书源的语法不支持,于是我反复总结对比,写了一个自动转换的python程序,如上链接

解决过程:自签APP+转换书源

文章目录


1.下载 ipa:

下载地址我就不放了

2.自签IPA:

关于怎么自签,你们可以用轻松签、全能签,小白啥也不会就算了

3.转换书源

3.1 获得书源

源仓库也不提供了,自己搜:
https://yuedu.miaogongzi.net/

3.2 转换规则

由于这款APP版本是2021年左右的,很多新版书源不支持,我们要进行转换,我自己花了点时间总结了一点转换规则:

最常见的规则是不支持a.1@text 这种,要转换,其他参考下列

书源类型0    文本2    视频3    漫画1    音频-------------------------------#    选择ID.     选择元素 class之类>     子元素~     第二个,兄弟元素,同级关系p:nth-child(2) 父元素的第n个子元素[]    属性选择器            [class^=book] 选择class以book开头的元素!    倒序选择器            img:!-1 选择最后一个img元素||      列组合选择器            col||td 选择col和td元素 ( )    分组选择器            (div,p) 选择所有div和p,      多个选择器            .item, .active 选择item和active类*       通用元素选择器        *.item 选择所有类名包含item的元素n      表达式选择器            li:nth-child(3n) 按序选择li元素,每个li元素的父元素中的第 3、6、9、12等序号a.-1@text     改为a:nth-last-child(1)@texta.1@text         a:nth-child(1)@text```### 3.3 步骤3.3

3.3 转换书源

现在开始转换,笨的办法是用记事本替换,我写了个python脚本来自动替换

import jsonimport requestsdef replace_selectors(json_data):    # 替换选择器的函数    def replace_selector(selector):        if "." in selector and "@" in selector:            parts = selector.split('.')            tag = parts[0]            selector_part = parts[1]            if "@" in selector_part:                num, at_text = selector_part.split('@', 1)                if ":" in num:                    num, tag_after_colon = num.split(':', 1)                    num = f"{num}@{tag_after_colon}"                if num.replace("-", "").replace(".", "").isdigit():                    num = "1" if num == "0" else num  # 处理小数点后面是0的情况                    if num.startswith("-"):                        num = num[1:]                        return f"{tag}:nth-last-child({num})@{at_text}"                    else:                        return f"{tag}:nth-child({num})@{at_text}"        return selector    # 处理列表类型的 JSON 数据    if isinstance(json_data, list):        for item in json_data:            replace_selectors(item)        return    # 遍历字典类型的 JSON 数据,查找并替换选择器    for key, value in json_data.items():        if isinstance(value, str):            if "@" in value:                value = replace_selector(value)            json_data[key] = value        elif isinstance(value, dict):            replace_selectors(value)        elif isinstance(value, list):            for item in value:                if isinstance(item, dict):                    replace_selectors(item)    # 增加替换规则,当"ruleExplore": []时,替换为"ruleExplore": "##"    if "ruleExplore" in json_data and not json_data["ruleExplore"]:        json_data["ruleExplore"] = "##"if __name__ == "__main__":    # 用户输入 JSON 文件的 URL    json_url = input("请输入 JSON 文件的 URL: ")    # 下载 JSON 数据    response = requests.get(json_url)    json_data = response.json()    # 替换选择器    replace_selectors(json_data)    # 提取文件名,并保存 JSON 内容到文件    file_name = json_url.split('/')[-1]    with open(file_name, 'w', encoding='utf-8') as file:        json.dump(json_data, file, indent=4, ensure_ascii=False)    print(f"JSON 内容已按照新的替换原则进行替换并保存为文件:{file_name}")

4.在线转换

本地转换有点麻烦,我玩手机的时候电脑又不会一直在身边,我就把上面的代码改成了web版本,这些复制转换后的连接,到APP剪贴板导入就好了,效果如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.1 web版源代码:

import jsonimport osimport requestsfrom flask import Flask, render_template, request, send_from_directory, url_forfrom werkzeug.utils import secure_filenameapp = Flask(__name__)def replace_selectors(json_data):    # 替换选择器的函数    def replace_selector(selector):        if "." in selector and "@" in selector:            parts = selector.split('.')            tag = parts[0]            selector_part = parts[1]            if "@" in selector_part:                num, at_text = selector_part.split('@', 1)                if ":" in num:                    num, tag_after_colon = num.split(':', 1)                    num = f"{num}@{tag_after_colon}"                if num.replace("-", "").replace(".", "").isdigit():                    num = "1" if num == "0" else num  # 处理小数点后面是0的情况                    if num.startswith("-"):                        num = num[1:]                        return f"{tag}:nth-last-child({num})@{at_text}"                    else:                        return f"{tag}:nth-child({num})@{at_text}"        return selector    # 处理列表类型的 JSON 数据    if isinstance(json_data, list):        for item in json_data:            replace_selectors(item)        return    # 遍历字典类型的 JSON 数据,查找并替换选择器    for key, value in json_data.items():        if isinstance(value, str):            if "@" in value:                value = replace_selector(value)            json_data[key] = value        elif isinstance(value, dict):            replace_selectors(value)        elif isinstance(value, list):            for item in value:                if isinstance(item, dict):                    replace_selectors(item)        # 增加替换规则,当"ruleExplore": []时,替换为"ruleExplore": "##"    if "ruleExplore" in json_data and not json_data["ruleExplore"]:        json_data["ruleExplore"] = "##"if __name__ == "__main__":    @app.route('/', methods=['GET', 'POST'])    def index():        if request.method == 'POST':            json_url = request.form['json_url']            response = requests.get(json_url)            json_data = response.json()            replace_selectors(json_data)            # 提取文件名,并保存 JSON 内容到文件            file_name = json_url.split('/')[-1]            json_dir = os.path.join(os.path.dirname(__file__), 'json')            if not os.path.exists(json_dir):                os.makedirs(json_dir)            json_path = os.path.join(json_dir, file_name)            with open(json_path, 'w', encoding='utf-8') as file:                json.dump(json_data, file, indent=4, ensure_ascii=False)            # 生成下载链接            download_link = url_for('download', file_name=file_name)            return render_template('result.html', json_data=json_data, download_link=download_link)        return render_template('form.html')    @app.route('/json/', methods=['GET'])    def download(file_name):        json_dir = os.path.join(os.path.dirname(__file__), 'json')        file_path = os.path.join(json_dir, file_name)        return send_from_directory(json_dir, file_name, as_attachment=True)    app.run(host='0.0.0.0', port=5000, debug=True)

4.2 我还写了个docker版本的

docker pull realwang/booksource_transios:latestdocker run -d  --name transios -p 5000:5000 booksource_transios
# 使用python3环境作为基础镜像FROM python:3# 设置工作目录WORKDIR /app# 安装git,用于从GitHub下载代码#RUN apt-get update && apt-get install -y git# 从GitHub下载代码RUN git clone https://ghproxy.com/https://github.com/wangrui1573/booksource_transIOS.git /app# 切换到代码目录WORKDIR /app# 安装python依赖RUN pip install --no-cache-dir -r requirements.txt# 将容器5000端口映射到主机的5000端口EXPOSE 5000# 启动Python应用程序CMD ["python", "api/conv_book_web.py"]# docker run -d -p 5000:5000 booksource_transios

源代码:https://github.com/wangrui1573/booksource_transIOS

来源地址:https://blog.csdn.net/wangrui1573/article/details/131898637

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

IOS看书最终选择|源阅读转换|开源阅读|IOS自签

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录