py征途4之无效思路

news2025/1/18 8:49:25

事件回顾:
近期班里组织了一个跑团,使用的是keep跑团助手(小程序)。每个人都有一个昵称,要对“每日跑量”进行统计,以明确到底有哪些人跑了步,哪些人没跑步。
为了解决这个问题,从3月28日(晚)到4月2日(早),共历时4天半,期间诞生了很多思路,学习了很多知识,下面 一 一 分享复盘一下。

思路

  • 一,抓包获取api
  • 二,pytesseract图片识别
    • 1cnocr
    • 2百度api
    • 3pytesseract
    • 4图片分割
  • 三,初识逆向
    • 1源码审计
    • 2来自PMR的支援
  • 四,autojs
    • 1控件!!!!!
    • 2配置vscode环境
    • 3用最傻的方式做最聪明的事情
  • 五,后记

一,抓包获取api

在网上主流的有两种,一种是fiddler,一种是charles,经过一天的研究我选择了charles。
Charles微信小程序抓包(详解)
但是抓包得到的结果却不尽人意,很明显,抓到的报文都是经过动态加密的。尝试根据抓包得到的url构造api也失败了,要么是404,要么是error。
在这里插入图片描述最终还是放弃了抓包的思路,不过,至少会使用charles了,不是吗?

二,pytesseract图片识别

随着跑团第一次活动的开展,每周要统计两次参与人员,那时是第一周的周二,我迎来了第一个挑战——当时我通过图片识别昵称,然后匹配python字典来解决。
想法很美好,显示很骨感。
备注:一定要关闭vpn在运行代码。

1cnocr

Python 自动识别图片文字—保姆级OCR实战教程
通过这段教程,我学习到了cnocr和pytesseract两个python图片文字识别库。使用cnocr的过程不是很愉悦,因为,它不支持长图识别,并且上下行文字之间不能有较大的留白,基本识别不出内容。

2百度api

本着什么简单,什么上的想法,我去注册了个百度api的账号。
python调用百度ocr接口,实现图片内文字识别
根据这个教程我创建了应用,经过测试,不得不说,体验很一般(暗人不说明话),识别结果一团糟,即:“有,但是不准确”。

3pytesseract

最终还是选择了pytesseract。
分两步:
1 pip install pytesseract
2 Tesseract-OCR的安装和使用
使用它,我坎坷的完成了这次挑战,但期间仍然出现了很多非预期,下面是个例子,以及我当时的解决思路。

# str1="小姜鸡39"
# str2="小辣圾39"
def like_standard(str1, str2):
    like_value = 0
    if len(str1) == len(str2):#如果长度相等,相似值加1
        like_value += 1
    for i in range(len(str1)):
        if str1[i:i+3] in str2:#三个字符三个字符增加相似值
            like_value += 1

    if like_value >= 2:#相似值至少大于3
        return True
    else:
        return False

尝试使用相似值来“归纳”识别结果,但最终统计出来的数据会出现1-2个bug,无论怎么修正相似值任然会出现各种各样的非预期。

4图片分割

为了提高pytesseract识别的精准度,我还是去学习了cv2的图片分割方法,这个代码是我让chatgpt写的,然后我只是修改了他写错的地方。

import cv2

img = cv2.imread('C:\\Users\\qte\\Desktop\\Screenshot_20230331_215023.jpg')# 指定图像路径并读取图像
img_height = img.shape[0]# 获取图像的高度。shape[0]是高度,shape[1]是宽度
#segment_size = 150#确定分割的大小,以像素为单位,例如每150像素分割一次:
segment_size=1180#这个像素似乎不会出现将一个名字分到两张图片
print(segment_size)
count = 1

for i in range(0,img_height,segment_size):
    print(i)
    segment = img[i:i+segment_size,:]
    cv2.imwrite(f'C:\\Users\\qte\\Desktop\\123\\segment{count}.jpg', segment)
    count += 1

在这个过程中我还解决了后续识别和分类的代码,以下这段代码将统计哪些人跑了,哪些人没跑。

class_all = [...]#这个列表记录了同学的信息
class_name = {...:...}#这个字典记录了昵称的对应关系
list_paole = []
for i in text1:
    #print(i)  # 输出识别结果
    for k in class_name.keys():
        if i.upper() == k.upper() or like_standard(i.upper(),k.upper()):  #精准匹配+自写函数模糊匹配
            #print(like_standard(i,k))
            print(k)  # 输出匹配上的识别结果
            if class_name[k] == "1":
                print(i)
                list_paole.append(i)
            else:
                print(class_name[k])
                list_paole.append(class_name[k])

print(list_paole)
re_class = [x for x in class_all if x not in list_paole]
print(re_class)

# list1 = [1,2,3,4]
# list2 = [3,4,5,6]
# list3 = [x for x in list1 if x not in list2]print(list3)#[1,2]
# list1中的1和2都不在list2中,而3和4则在list2中,所以执行list 减法后,生成的list3中只包含list1中不在list2中的1和2

即便如此我还是不甘心,这并没有在实际上解决问题,因为图片分割是不稳定的,他会因为图片的不同而出现意外情况。

三,初识逆向

偶然间我看到了这样两篇文章
实用的微信小程序逆向教程!
记一次小程序逆向和数据包解密
因为国内工具被删了,只好用国外的了。
wxappUnpacker

刚好近期学了nodejs,kali里面有node环境,然后,我“逆向”出了该微信小程序的源码。当然了期间总会遇到些小问题,都还算顺利的解决了。

1源码审计

在这里插入图片描述
因为方法较为特殊就不放代码的截图了,主要讲一讲大致的历程吧。兜兜转转了很久,找到了主要显示“每日跑量”的index.js和index.wxml,但是没有发现调库的痕迹。还是代码知识太浅薄了,可能是第一次接触微信小程序吧,没有真正做过小程序。

2来自PMR的支援

马上就要体能了,刚好P佬不是很擅长锻炼,于是我就拉着它去跑步,顺道提到了这个事情,一来二去,就讨论了起来。Ta指出“微信小程序逆向之后得到的并不是真实源码,它们是经过了微信的处理后生成的,分析起来比较难”。然后Ta给我提供了一个思路——autojs抓取webview的控件。

四,autojs

1控件!!!!!

在这里插入图片描述
在使用autojs查看布局后可以发现,这里面有个一text标签详细记录了昵称,那么我只要获取到这个控件的text就行或者直接获取该控件的全部信息也可以。
在这里插入图片描述

通过默认的选项生成代码,然后修改为获取全部变量即可。
className("android.view.View").text("这周末在做梦13").findOne()
将他修改为
className("android.view.View").find()
然后写入日志文件。

files.remove("/sdcard/Pictures/运行日志2.txt");
//app.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, android.net.Uri.fromFile(java.io.File("/sdcard/Pictures/运行日志1.txt"))));
var name = className("android.view.View").find();
console.setGlobalLogConfig({ "file": "/sdcard/Pictures/运行日志2.txt" });
console.log(name);

这样就可以获取到当前页面所有控件的信息了。

2配置vscode环境

参考这篇文章配置。
Auto.js的初次使用——在VSCode中使用
其中还是有部分步骤不一样的,需要学习的小伙伴可以参考下面这张我总结的图片
在这里插入图片描述

3用最傻的方式做最聪明的事情

(1)将日志文件输出到PC,调用Python进行字符串处理。
当时是因为懒得去学习atuojs的相关语法,感觉没有python用的顺手于是就直接写了Pyhton。

log_path="C://Users//qte//Nox_share//ImageShare//运行日志1.txt"
f = open(log_path, 'r',encoding='utf-8')
#print(f.read())
str_log=f.read()
f.close()

str_last=[]#记录最终日志分割后的列表
#根据'text: '和'; content'分割日志
str_log_list=str_log.split('text: ')
for i in str_log_list:
    i=i.split('; content')
    #print(i[0])
    str_last.append(i[0])#经过两次分割,掐头去尾,个i列表的第一个就是昵称。当然了,不排除可能出现其他非昵称字符的情况,但这种情况会在接下来的代码中解决。
print(str_last)
"""
以下这一段就是后续识别和分类的代码,和之前介绍的一样,只是去掉了like_standard。
"""
list_paole = []
for i in str_last:
    for k in class_name.keys():
        if i == k:  #匹配相等就输出
            #print(like_standard(i,k))
            print(k)  # 输出匹配上的识别结果
            if class_name[k] == "1":
                print(i)
                list_paole.append(i)
            else:
                print(class_name[k])
                list_paole.append(class_name[k])

print(list_paole,len(list_paole))
re_class = [x for x in class_all if x not in list_paole]
print(re_class)

(2)P佬指出你为啥不直接用一个atuojs脚本跑完呢?
对哦,然后我就让chatgpt将这段代码“翻译”了一下,这次他竟然出奇的正确,没有出现任何语法错误。
在这里插入图片描述

但是要提取控价,是需要分层的,然后根据布局来确定深度…P神佬给出了一个方案:请添加图片描述(3)用最傻的方式将代码集成到1个atuo脚本。
但是我就是懒,不愿意去学习autojs的输出流。之前不是已经把这些控件信息写到了txt文件嘛,然后chatgpt也“翻译”好了嘛,干脆在读出来呗。
在这里插入图片描述
于是乎就用这样最傻的方式解决了这个问题,最终这个脚本里只有“var name = ”这11个字符,emmm,外加4个分号是我自己写的。

五,后记

事后我得到了p佬的“肯定”。
在这里插入图片描述
当然了,其实只要将var name赋给str_log就行了,也不需要研究什么输出流,不过具体代码就不展示在这篇文章里了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/415176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot登录校验[JWT]

前言: 👏作者简介:我是笑霸final,一名热爱技术的在校学生。 📝个人主页:个人主页1 || 笑霸final的主页2 📕系列专栏:后端专栏 📧如果文章知识点有错误的地方,…

Spring Transaction 源码解读

Spring Transaction 规范的maven坐标如下&#xff1a; <dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>...</version></dependency>该包提供了spring事务规范和默认的jta(ja…

【SSM】SSM整合步骤和流程细化

整合SSM参考文献一、SSM整合前概述1. 各个框架在三层架构模式中所担任的角色2. 两个IOC容器的创建1&#xff09;整合时Spring中IOC容器的创建时间2&#xff09;Spring提供的监听器&#xff08;ContextLoaderListener&#xff09;二、SSM整合步骤参考文献 卤蛋的SSM整合完整流程…

华为nat配置实验:内网能够访问外网,内网服务器80端口映射出去

一 需求分析1.1 需求公司A在北京&#xff0c;公司B在上海&#xff0c;本次实验仅仅模拟局域网内出口路由器的配置&#xff0c;公司A业务流量较大&#xff0c;并且预算有限。公司B模拟外网的一个小型局域网&#xff0c;要求公司B的主机能够访问公司A的web服务器。1.2 分析采用na…

Linux中滴计划任务

计划任务计划任务计划任务分类at命令load averagecrontab命令配置文件通常包含三个部分cron服务配置文件cron服务的日志文件时间数值的特殊表示方法应用实例案例anacron服务计划任务 计划任务&#xff08;Cron Job&#xff09;是指在预定的时间自动执行一些指定的任务或脚本。…

Pytorch使用预训练好的卷积神经网络进行推理预测

本小节将会介绍如何利用已经预训练好的卷积神经网络模型对一张图像进行预测&#xff0c;并且通过可视化的方法&#xff0c;查看模型是如何得到其预测结果的。 我们直接看一个实例&#xff0c;利用已经预训练好的VGG16卷积神经网络对一张图像获取一些特定层的输出&#xff0c;并…

通过python理解光的偏振

文章目录基本原理椭圆偏振光基本原理 光是横波&#xff0c;可以写成E⃗A⃗cos(ωt−k⃗r⃗)\vec E \vec{A}cos(\omega t-\vec k\vec r)EAcos(ωt−kr)&#xff0c;振动方向与传播方向垂直&#xff0c;而在三维空间中&#xff0c;与光线垂直的乃是法平面。换言之&#xff0c;光…

【Minecraft开服】Windows搭建我的世界MC服务器「公网远程联机」

文章目录1. Java环境搭建2.安装我的世界Minecraft服务3. 启动我的世界服务4.局域网测试连接我的世界服务器5. 安装cpolar内网穿透6. 创建隧道映射内网端口7. 测试公网远程联机8. 配置固定TCP端口地址8.1 保留一个固定tcp地址8.2 配置固定tcp地址9. 使用固定公网地址远程联机简单…

【计算机网络-网络层】IPv4 和 IPv6

文章目录第一部分&#xff1a;IPv4&#xff08;IP 协议版本 4&#xff09;1 IP 数据报1.1 IP 数据报格式1.2 相关例题2 分类编址&#xff08;两级结构&#xff0c;网络号定长&#xff09;2.1 IP 地址的表示方法2.2 IP 分类编址2.3 IP 地址的特殊用途3 无分类编址 CIDR&#xff…

PyTorch 之 神经网络 Mnist 分类任务

文章目录一、Mnist 分类任务简介二、Mnist 数据集的读取三、 Mnist 分类任务实现1. 标签和简单网络架构2. 具体代码实现四、使用 TensorDataset 和 DataLoader 简化本文参加新星计划人工智能(Pytorch)赛道&#xff1a;https://bbs.csdn.net/topics/613989052 一、Mnist 分类任…

recyclerview中树状结构的实现,加载本地中文件夹信息

引文&#xff1a; 在项目实现中&#xff0c;对于树状图结构的分析一直无法实现正确的效果&#xff0c;结果查看别人的项目都不要适合我的应用场景&#xff0c;但是查看其实原理是差不多的&#xff0c;但是我没有看明白&#xff0c;所以一直在看这方面的东西。查阅并修改他人的代…

ADSP21489之CCES开发笔记(九)

21489评估板调试SigmaStudio&#xff0c;录音&#xff0c;算法效果对比等等&#xff0c;依此写上该文章&#xff0c;以便有兴趣的朋友参考之用。 一、硬件链路图 二、导入21489Demo程序 2.1、Demo路径&#xff1a;2.2、导入ADI的21489的Demo程序 修改相关代码 oCommConfig.n…

小白学Pytorch系列--Torch.optim API Base class(1)

小白学Pytorch系列–Torch.optim API Base class(1) torch.optim是一个实现各种优化算法的包。大多数常用的方法都已得到支持&#xff0c;而且接口足够通用&#xff0c;因此将来还可以轻松集成更复杂的方法。 如何使用优化器 使用手torch.optim您必须构造一个优化器对象&…

下载和阅读Android源码

目录一、如何下载AOSP1.全量下载2.单个下载目录结构二、如何阅读AOSP1.要阅读哪些源码2.阅读源码的顺序和方式2.1 阅读顺序2.2 阅读方式3.用什么工具来阅读3.1 下载安装Source Insight3.2 导入AOSP源码3.3查看源码三、其他一、如何下载AOSP 源码下载是我们分析源码的开始&…

ctfshow愚人杯web复现

easy_signin 题目url base64解码是face.png&#xff0c;尝试flag.txt和flag.php&#xff0c;base64加密后传入都不对&#xff0c;用index.php加密后传入&#xff0c;看源码 将后面的base64解密得到flag 被遗忘的反序列化 源码 <?php# 当前目录中有一个txt文件哦 error_r…

Unity- 游戏结束以及重启游戏

文章目录游戏结束以及重启游戏建个游戏结束页面编写委托类 游戏主角 以及 ui管理类的脚本重启游戏游戏结束以及重启游戏 思路&#xff1a;利用Canvas创建好覆盖全屏的结束页面&#xff0c;默认关闭。游戏结束时&#xff0c;玩家控制的对象发起委托&#xff0c;ui管理收下委托&…

electron+vue3全家桶+vite项目搭建【六】集成vue-i18n 国际化

文章目录注意引入1.引入依赖2.集成vue i18n3.测试代码4.封装多语言切换组件5.测试多语言切换6.优化代码注意 已发现 9.2.2版本的vue-i18n 如果使用cnpm安装&#xff0c;打包会报错&#xff0c;使用npm或者pnpm安装依赖没有问题 引入 如果需要多语言支持&#xff0c;那么最好…

【100个 Unity实用技能】 | Lua中获取当前时间戳,时间戳和时间格式相互转换、时间戳转换为多久之前

Unity 小科普 老规矩&#xff0c;先介绍一下 Unity 的科普小知识&#xff1a; Unity是 实时3D互动内容创作和运营平台 。包括游戏开发、美术、建筑、汽车设计、影视在内的所有创作者&#xff0c;借助 Unity 将创意变成现实。Unity 平台提供一整套完善的软件解决方案&#xff…

【AI大比拼】文心一言 VS ChatGPT-4

摘要&#xff1a;本文将对比分析两款知名的 AI 对话引擎&#xff1a;文心一言和 OpenAI 的 ChatGPT&#xff0c;通过实际案例让大家对这两款对话引擎有更深入的了解&#xff0c;以便大家选择合适的 AI 对话引擎。 亲爱的 CSDN 朋友们&#xff0c;大家好&#xff01;近年来&…

Python自动录入ERP系统数据

大家好&#xff0c;我是毕加锁。 今天给大家带来的是用Python解决Excel问题的最佳姿势 文末送书&#xff01; 文末送书&#xff01; 文末送书&#xff01; 项目总体情况 软件&#xff1a;Pycharm 环境: Python 3.7.9(考虑到客户可能会有不同操作系统&#xff0c;为了兼容性…