以下函数均由道无涯i封装,如果有更好的改进欢迎评论区指正!
完整路径拼接
def 完整路径拼接(fileName=None):
"""
适用于打包和直接运行的情况。
fileName为完整文件名,例 "测试.txt"
如果fileName为空,则返回当前程序所在目录;
如果fileName不为空,则返回 当前程序所在目录和fileName拼接后的路径
"""
if getattr(sys, 'frozen', False):
# 如果是打包后的exe文件
if fileName:
return os.path.join(os.path.dirname(sys.executable), fileName)
return os.path.dirname(sys.executable)
else:
# 如果是直接运行的.py文件
if fileName:
return os.path.join(os.path.dirname(__file__), fileName)
return os.path.dirname(__file__)
读取指定行
def 读取指定行(txt_path, line_number):
"""
读取txt文本的指定行
txt_path:txt文本路径
line_number:读取的行号
返回读取的文本内容
"""
with open(txt_path, "r", encoding='utf-8') as file:
lines = file.readlines()
if 0 <= line_number < len(lines):
return lines[line_number]
else:
return None
删除指定行
def 删除指定行(txt_path, line_number):
"""
删除txt文本的指定行
txt_path:txt文本路径
line_number:删除的行号
"""
# 读取文件所有行
with open(txt_path, "r", encoding='utf-8') as file:
lines = file.readlines()
# 检查行号是否有效
if 0 <= line_number < len(lines):
# 删除指定行
del lines[line_number]
# 将剩余的行重新写入文件中
with open(txt_path, "w", encoding='utf-8') as file:
file.writelines(lines)
else:
print("指定的行号无效!")
不重复写入文本
def 不重复写入文本(txt_path, content):
"""
将指定文本写入txt文件,如果txt文件内已存在该文本内容,则不写入
txt_path:txt文本路径
content:指定写入的文本
"""
已存在 = False
if os.path.exists(txt_path):
with open(txt_path, "r", encoding="utf-8") as f:
if content in f.read():
已存在 = True
print(f"文本已存在,不写入{txt_path}!")
f.close()
# 如果不存在相同的文本,则写入文件
if not 已存在:
print(f"将文本写入{txt_path}!")
with open(txt_path, "a", encoding="utf-8") as f:
if content.endswith("\n"): # 检查内容是否已经以换行符结束
f.write(content) # 如果已经以换行符结束,直接写入
else:
f.write(content + "\n") # 如果没有以换行符结束,添加一个换行符后写入
f.close()
提取代理ip
def 提取代理ip(link):
"""
根据link提取代理ip,并检测可用性,直到可用才退出函数
link:提取ip的url链接
返回提取到的可用的代理ip
"""
try:
# 获取代理ip
proxy = requests.get(link, timeout=5).text.strip()
print('正在使用代理:', proxy)
proxies = {
"http": f"http://{proxy}",
"https": f"http://{proxy}",
}
# 先用 requests 检查代理是否可用
response = requests.get("http://httpbin.org/ip",
proxies=proxies, timeout=5)
response.raise_for_status() # 如果响应状态码不是 200,将抛出 HTTPError 异常
return proxy
except Exception as e:
print('该代理不可用,正在更换代理...', e)
time.sleep(1)
return 提取代理ip(link)
控件点击函数重新封装
function click(selector, depth, indexArr) {
/****
* 控件点击,成功返回true,否则返回false
* selector 选择器,例如:id("11").text("22")
* depth 层数,如果是0,则点击自身,不找parent或child,此时参数indexArr可省略不写
* indexArr 数组,depth为0时可省略,depth有几层就代表indexArr数组成员有几个
* 数组成员里-1代表parent(),>=0则代表child的索引,例child(0)、child(1)等等
*/
/*****************************
* 调用示例如下
【1】点击id为button的控件:
click(id("button"),0) 等价于 id("button").findOne(1000).click()
【2】点击id为button的父控件
click(id("button"),1,[-1]) 等价于 id("button").findOne(1000).parent().click()
【3】点击id为button的父控件的父控件
click(id("button"),1,[-1,-1]) 等价于 id("button").findOne(1000).parent().parent().click()
【4】点击id为button的父控件的父控件的第2子控件
click(id("button"),1,[-1,-1,1]) 等价于 id("button").findOne(1000).parent().parent().child(1).click()
【5】点击id为button的父控件的父控件的第2子控件的第3子控件
click(id("button"),1,[-1,-1,2,2]) 等价于 id("button").findOne(1000).parent().parent().child(1).child(2).click()
*/
try {
let target = selector.findOne(1000);
for (let i = 0; i < depth; i++) {
let index = indexArr[i]
if (index == -1) {
target = target.parent();
} else if (index >= 0) {
target = target.child(index);
}
}
return target.click();
} catch (error) {
console.log("tap_error" + error)
return false
}
}
其他
以后遇到了再补充...