[C#]某省学法考法平台自动学习工具(成品 + 源码)

[复制链接]
124 |10
发表于 前天 17:32 | 显示全部楼层 |阅读模式
以前的贴子过期了,有不少坛友在问更新的,所以再发一个新帖,介绍如题
代码瞎写的,没有备注,没有try catch。。不过稳定性还可以,没崩溃过。。。
可搭配StupidOCR验证码识别使用(或者收费的接码平台)




可以实现多账号全自动挂机,,你可以帮你们单位的人全学了。。。
但要这个功能需要自己接一个打码平台。。。

关于打码
在源码的Global类中有打码的方法。
上面的是收费平台的在线打码,有需要的就你们自己研究了,我把我的key删掉了。
软件默认下方StupidOCR方法配合本地使用,需要修改请自己修改源码。


下载

https://github.com/CrazyNutLz/AutoStudyXFK
代码已经同步开源到GitHub,有需要的话点个star噢,谢谢

成品:AutoStudyXFK_v1.1.zip(355.78 KB, 下载次数: 142)2025-6-11 00:11 上传
点击文件名下载附件



另外,因StupidOCR过大(200M),请前往原帖链接下载
StupidOCR_1.0.6 验证码识别,可本地可部署服务器,增加图标点选功能  (出处: 吾爱破解论坛)
回复

使用道具 举报

发表于 前天 17:33 | 显示全部楼层
广东的怎么用呢,大佬
回复

使用道具 举报

发表于 前天 17:33 | 显示全部楼层
学法考法平台有个万能验证码,在这里不宜说
回复

使用道具 举报

发表于 前天 17:33 | 显示全部楼层
感谢分享
回复

使用道具 举报

发表于 前天 17:34 | 显示全部楼层
   速速细嗦
回复

使用道具 举报

发表于 前天 17:35 | 显示全部楼层
学习一下
回复

使用道具 举报

发表于 前天 17:35 | 显示全部楼层
[Python]  
  1. from torch.utils.data import DataLoader
  2. from torch.utils.data import Dataset
  3. from torch.utils.tensorboard import SummaryWriter
  4. from torch import nn
  5. from torch.optim import Adam
  6. from torchvision import transforms
  7. import torch
  8. import os
  9. from PIL import Image
  10. captcha_array=list("0123456789")
  11. captcha_size=4
  12. def text2Vec(text):
  13.     vec=torch.zeros(captcha_size,len(captcha_array))
  14.     for i in range(len(text)):
  15.         vec[i,captcha_array.index(text[i])]=1
  16.     return vec
  17. def vec2Text(vec):
  18.     vec=torch.argmax(vec,dim=1)
  19.     text=""
  20.     for i in vec:
  21.         text+=captcha_array[i]
  22.     return text
  23. class vkmodel(nn.Module):
  24.     def __init__(self):
  25.         super(vkmodel,self).__init__()
  26.         self.layer1=nn.Sequential(
  27.             nn.Conv2d(in_channels=1,out_channels=64,kernel_size=3,padding=1),
  28.             nn.ReLU(),
  29.             nn.MaxPool2d(kernel_size=2)
  30.         )
  31.         self.layer2=nn.Sequential(
  32.             nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,padding=1),
  33.             nn.ReLU(),
  34.             nn.MaxPool2d(kernel_size=2)
  35.         )
  36.         self.layer3=nn.Sequential(
  37.             nn.Conv2d(in_channels=128,out_channels=256,kernel_size=3,padding=1),
  38.             nn.ReLU(),
  39.             nn.MaxPool2d(kernel_size=2)
  40.         )
  41.         self.layer4=nn.Sequential(
  42.             nn.Conv2d(in_channels=256,out_channels=512,kernel_size=3,padding=1),
  43.             nn.ReLU(),
  44.             nn.MaxPool2d(kernel_size=2)
  45.         )
  46.         self.layer5=nn.Sequential(
  47.             nn.Flatten(),
  48.             nn.Linear(in_features=6144,out_features=4096),
  49.             nn.Dropout(0.2),
  50.             nn.ReLU(),
  51.             nn.Linear(in_features=4096,out_features=captcha_size*captcha_array.__len__())
  52.         )
  53.     def forward(self,x):
  54.         x=self.layer1(x)
  55.         x=self.layer2(x)
  56.         x=self.layer3(x)
  57.         x=self.layer4(x)
  58.         x=self.layer5(x)
  59.         return x
  60.    
  61. class my_dataset(Dataset):
  62.     def __init__(self,root_dir) -> None:
  63.         super(my_dataset,self).__init__()
  64.         self.image_path=[os.path.join(root_dir,image_name) for image_name in os.listdir(root_dir)]
  65.         self.transforms=transforms.Compose(
  66.             [
  67.                 transforms.ToTensor(),
  68.                 transforms.Resize((47,100)),
  69.                 transforms.Grayscale()
  70.             ]
  71.         )
  72.     def __len__(self):
  73.         return self.image_path.__len__()
  74.     def __getitem__(self, index):
  75.         image_path=self.image_path[index]
  76.         image=self.transforms(Image.open(image_path))
  77.         label=image_path.split('\\')[-1]
  78.         label=label.split("_")[0]
  79.         label_tensor=text2Vec(label)
  80.         label_tensor=label_tensor.view(1,-1)[0]
  81.         return image,label_tensor
  82.    
  83. class Predict():
  84.     def __init__(self,modelPath) -> None:
  85.         self.device='cuda' if torch.cuda.is_available() else 'cpu'
  86.         self.detector = torch.load(modelPath, map_location=torch.device(self.device), weights_only=False)
  87.         self.detector.eval()
  88.         self.trans=transforms.Compose(
  89.             [
  90.                 transforms.Resize((47,100)),
  91.                 transforms.Grayscale(),
  92.                 transforms.ToTensor(),
  93.             ]
  94.         )
  95.     def predict(self,img:Image.Image):
  96.         if img.mode=='RGBA':
  97.             fill_color = (255,255,255)
  98.             background = Image.new(img.mode[:-1], img.size, fill_color)
  99.             background.paste(img, img.split()[-1])
  100.             img = background.convert("RGB")
  101.         img_tensor=self.trans(img).to(self.device)
  102.         img_tensor=img_tensor.reshape((1,1,47,100))
  103.         output=self.detector(img_tensor)
  104.         output=output.view(-1,captcha_array.__len__())
  105.         output_label=vec2Text(output)
  106.         return output_label
  107. if __name__=='__main__':
  108.     device='cuda' if torch.cuda.is_available() else 'cpu'
  109.     train_dataset=my_dataset(os.path.join(os.getcwd(),r'datasets\train'))
  110.     train_dataloader=DataLoader(dataset=train_dataset,batch_size=40,shuffle=True)
  111.     w=SummaryWriter("log")
  112.     loss_fn=nn.MultiLabelSoftMarginLoss().to(device)
  113.     vk=vkmodel().to(device)
  114.     optim=Adam(vk.parameters(),lr=0.001)
  115.     total_step=0
  116.     for epoch in range(10):
  117.         print("训练epoch{}".format(epoch))
  118.         for i,(images,labels) in enumerate(train_dataloader):
  119.             images=images.to(device)
  120.             labels=labels.to(device)
  121.             vk.train()
  122.             outputs=vk(images)
  123.             loss=loss_fn(outputs,labels)
  124.             optim.zero_grad()
  125.             loss.backward()
  126.             optim.step()
  127.             total_step+=1
  128.             if i%100==0:
  129.                 print("训练次数{},{}".format(i,loss.item()))
  130.                 w.add_scalar("loss",loss,total_step)
  131.     torch.save(vk,os.path.join(os.getcwd(),"model.pth"))
复制代码
回复

使用道具 举报

发表于 前天 17:35 | 显示全部楼层
哦哦,不是同一个平台,我以为是faxunyun.com
回复

使用道具 举报

发表于 前天 17:36 | 显示全部楼层
膜拜会训练模型的大佬
回复

使用道具 举报

发表于 前天 17:36 | 显示全部楼层
兄弟,坐下慢慢讲
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

72小时热榜
热门版块
热门帖子
1
自用剪贴板
12038陌
2025-12-07
2
京东时间同步器新增淘宝时间2.0
骑着悟空看八戒
2025-12-07
4
python写的rtsp码流录制工具
骑着悟空看八戒
2025-12-06
6
Web打印工具
12038陌
2025-12-06
快速回复 返回顶部 返回列表