1.需求
-
笔者科室承担区内部分重点人员核酸检测的督促任务,每日要在区卫健委开发的应检尽检系统上面进行人员的新增以及删除工作。其中新增只需要按照excel模板填写人员信息,然后上传文件即可。但是删除操作只能一个一个地在框内输入名字或者身份证号码,然后点击删除选项。这样做法比较机械费事,笔者尝试通过编写脚本发送post请求来完成自动化删除功能。
应检尽检系统界面
2.实现步骤
step1:抓包分析删除请求
-
在框内输入被删除人的姓名,然后点击删除,同时抓包。可以看到请求数据只有两个字段:getStr以及id。通过多次抓包分析,每次删除操作getStr字段都是相同的,只有id字段不同,可以合理推测id字段为被删除人员在数据库中对应的编号。每次删除返回的响应为两个字段:i以及v,若删除成功,则i字段返回0,v字段返回请求字段的id。
POST请求数据
POST响应数据
step2:爬取数据库
-
通过上述抓包分析,可以得知,要想通过Post请求删除一个人员的数据,需要得到这个人员在系统数据库中的“id”字段,因此需要爬取到系统数据库。笔者在页面勾选全部人员,同时抓包查看请求与响应。可以看到响应数据中包含人员的具体信息。
抓包分析响应数据
- 笔者复制下来响应的信息,通过分析,响应信息中每个人的具体信息共有3个字段:person字段,personfrom字段以及Total字段。其中person字段包含人员的具体信息,包括姓名,身份证号等。而personfrom里面的fpid字段,就是step1中删除操作需要的"id"字段。
step3:思路分析
- 通过以上准备工作,笔者设计如下步骤
1.爬取系统数据库并保存至本地
2.利用爬取的数据库,构建<身份证,fpid>对应哈希表id_fpid_map
3.读取需要删除人员的身份证信息,并通过id_fpid_map获取对应的“fpid”字段
4.根据fpid字段发送post请求完成删除操作
3.实现代码
- 爬取数据库的代码:
from email import header
from urllib import response
import requests
import json
post_url = "POST请求对应的url(出于信息保护不放入具体网址)"
data = {
"getStr":"CE01eWFybqtkFmNKFD4zeXJlsDBecepuDVDEe0JqLnEmF0zuDV4BGXWaxWNOLVc0eZBuKUSkNXfVGpcjLFScLzDEKnzeDhWuyis4eWtlKDkBwUJIDXdEIX4awiN5DmpjFFxzeXJlsDBVKhWvsGC4egplsDBXwlzvDUj4AppIMHWFKqNxDFSfPFFCJVzcGqEIFVEYDncaAizcGqEIFVEYDncaGDzbPrR-",
"keyWord":"0",
"pageSize": "99999"
}
data = json.dumps(data)
header = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0",
"Accept":"application/json, text/plain, */*",
"Accept-Language":"zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Connection":"keep-alive",
"Accept-Encoding":"gzip, deflate",
"Content-Type": "application/json;charset=utf-8",
"Content-Length": "270",
"Origin": "(出于信息保护不放入具体网址)",
"Connection": "keep-alive",
"Referer": "(出于信息保护不放入具体网址)"
}
response = requests.post(post_url,data=data,headers=header)
print(response.status_code)
result = response.content.decode()
print(result)
with open("result.txt", "w", encoding='utf-8-sig') as f:
f.write(result)
- 自动发送post请求的代码:
from email import header
from unittest import result
from urllib import response
import requests
import json
database = None
with open("result.txt", "r", encoding='utf-8-sig') as f: #打开文本
data = f.read() #读取文本
print(type(data))
database = data
print(type(database))
database = json.loads(database)
persons = database["s"]
name_fpid = {}
idc_fpid = {}
for i in range(len(persons)):
name = persons[i]["person"]["name"]
idc = persons[i]["person"]["idc"]
fpid = persons[i]["person_From"]["fpid"]
name_fpid[name] = fpid
idc_fpid[idc] = fpid
idc_lst = []
with open('idc_delete.txt', 'r', encoding='utf-8') as f:
for item in f.readlines():
item = item.strip("\n")
idc_lst.append(item)
post_url = "(出于信息保护不放入具体网址)"
header = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0",
"Accept":"application/json, text/plain, */*",
"Accept-Language":"zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
"Connection":"keep-alive",
"Accept-Encoding":"gzip, deflate",
"Content-Type": "application/json;charset=utf-8",
"Content-Length": "251",
"Origin": "(出于信息保护不放入具体网址)",
"Connection": "keep-alive",
"Referer": "(出于信息保护不放入具体网址)"
}
fpid_lst = []
for item in idc_lst:
if item != "":
# print(item)
if item in idc_fpid:
fpid_lst.append(idc_fpid[item])
for fpid in fpid_lst:
del_data = {}
del_data["getStr"] = "CE01eWFybqtkFmNKFD4zeXJlsDBecepuDVDEe0JqLnEmF0zuDV4BGXWaxWNOLVc0eZBuKUSkNXfVGpcjLFScLzDEKnzeDhWuyis4eWtlKDkBwUJIDXdEIX4awiN5DmpjFFxzeXJlsDBVKhWvsGC4ApplvDBXwlpvJUjSeWWIMHWFKqNxDFSfPFFCJVzcGqEIFVEYDncaAizcGqEIFVEYDncaGDzbPrR-"
del_data["id"] = fpid
del_data = json.dumps(del_data)
response = requests.post(post_url,data=del_data,headers=header)
print(response.status_code)
result = response.content.decode()
print(result)










网友评论