吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 9780|回复: 83
收起左侧

[Python 转载] 批量生成粤核酸采样二维码

  [复制链接]
jokerlicf 发表于 2022-2-24 21:05
利用python批量化生成粤核酸大规模核酸采集人员信息二维码

应用场景:在进行大规模核酸采集中,存在部分老人和儿童无法用手机展示核酸采集信息二维码或是部分群众不能熟练调出粤核酸采集二维码,拖慢核酸采集进度。利用村提前收集好的群众基本信息,帮助群众批量生成二维码并打印出来派发至群众保存,在核酸采集实践中,能够减轻现场工作人员的工作量,更专注的录入信息,加快核酸采集进度。
表格录入模板: 数据录入模板.png 打印效果展示: 成品图.png 源代码目前能够将模板表格中的人员信息转换成个人核酸采集二维码包含的信息,并贮存在结果工作簿中。后续还需要利用草料二维码或其他工具将信息字符串转化为二维码格式。其中代码中的token等需要填写的内容需自行利用fiddler对电脑微信粤核酸小程序进行抓包获取。
[Python] 纯文本查看 复制代码
#-*-coding=utf-8-*-#
''' 默认没有问题的填法 '''
import requests,json
from requests_toolbelt.multipart.encoder import MultipartEncoder
from PIL import Image
import urllib
import re
import sys
import xdrlib,sys
import xlrd
import xlwt
import os
from xlutils.copy import copy
import html5lib
import time
import urllib3
import easygui
import random



def check(IDcard):        # 按# 传入身份证号码,,返回正确与否以及信息,数组形式。

    if len(IDcard) != 18:
        var = '号码:' + IDcard + "__身份证号码位数不对!__错误的身份证号码.__请重新输入!__"
        valid ='False'
    else:
        IDcard_add = IDcard[0:6]     # 身份证前6位,对应归属地
        IDcard_birth = IDcard[6:14]  # 身份证中间8位,对应出生日期
        IDcard_sex = IDcard[14:17]   # 身份证15,,16,17位,对应性别

        area = {"11": "北京", "12": "天津", "13": "河北", "14": "山西", "15": "内蒙古", "21": "辽宁",
                "22": "吉林", "23": "黑龙江", "31": "上海", "32": "江苏", "33": "浙江", "34": "安徽",
                "35": "福建", "36": "江西", "37": "山东", "41": "河南", "42": "湖北","43": "湖南",
                "44": "广东", "45": "广西", "46": "海南", "50": "重庆", "51": "四川", "52": "贵州",
                "53": "云南", "54": "西藏", "61": "陕西", "62": "甘肃", "63": "青海", "64": "宁夏",
                "65": "新疆", "71": "台湾", "81": "香港", "82": "澳门", "91": "国外"}

        # 地区校验
        if IDcard[0:2] not in area.keys():
            var = '号码:' + IDcard + '__身份证地区非法!__错误的身份证号码__'
            valid = 'False'
        else:
            year = IDcard_birth[0:4]   # 出生年份
            month = IDcard_birth[4:6]  # 出生月份
            day = IDcard_birth[6:8]    # 出生日

            # 出生日期的合法性检查
            # 闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]
            # |[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
            # 平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]
            # |[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
            if (int(year) % 4 == 0 or (int(year) % 100 == 0 and int(year) % 4 == 0)):
                ereg = re.compile('[1-9][0-9]{5}((19[0-9]{2})|(20[0-1][0-8]))((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]'
                                  '|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))'
                                  '[0-9]{3}[0-9Xx]$')       # //闰年出生日期的合法性正则表达式
            else:
                ereg = re.compile('[1-9][0-9]{5}((19[0-9]{2})|(20[0-1][0-8]))((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]'
                                  '|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8])'
                                  ')[0-9]{3}[0-9Xx]$')      # //平年出生日期的合法性正则表达式
            # //测试出生日期的合法性
            if (re.match(ereg, IDcard)):
                IDcard_check = IDcard[17]  # 身份证最后一位
                W = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]   # 逐位权数
                IDcard_CHECK = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']  # 身份证检验位
                IDcard_sum = 0                                              # 定义累加和
                for i in range(0, 17):
                    IDcard_sum = IDcard_sum + int(IDcard[i]) * W[i]         # 逐位加权求和
                IDcard_Check = IDcard_sum % 11  # 取余数
                if IDcard_check != IDcard_CHECK[IDcard_Check]:              # 和检验位对比
                    var = '号码:' + IDcard + '__身份证号码校验错误!__错误的身份证号码__'
                    valid = 'False'
                else:
                    if int(IDcard_sex) % 2 == 0:
                        var = "正确的身份证号码! __" + '号码:' + IDcard + '__地区:' + area[IDcard[0: 2]] + \
                              '__生日:' + year + '年' + month + '月' + day + '日' + "__ 性别:女__"
                        valid = 'True'
                    else:

                        var = "正确的身份证号码! __" + '号码:' + IDcard + '__地区:' + area[IDcard[0: 2]] + \
                              "__生日: " + year + '年' + month + '月' + day + '日' + "__性别:男 __"
                        valid = 'True'
            else:
                var = '号码:' + IDcard + '__身份证号码出生日期超出范围或含有非法字符!__错误的身份证号码__'
                valid = 'False'
    #print(var)
    return valid, var


urllib3.disable_warnings()

# #变化部分
token = "" #自行抓微信包获取
Referer=""#自行抓微信包获取
appId=""#自行抓微信包获取
url = 'https://hsjc6.zdkqyy.com/ncov-nat-api/nat/sample/save/natSelfReportPerson'
urlqr="https://hsjc6.zdkqyy.com/ncov-nat-api/nat/sample/getNatSelfReportPersonQrcode"
headers = {
    'Host': 'hsjc6.zdkqyy.com',
    'Content-Type': 'application/json',
    'Accept-Encoding': 'gzip, deflate, br',
    'Connection': 'keep-alive',
    'token': token,#变化部分
    'version': 'V20220111',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat',
    'Referer': Referer,#变化部分
}

path = easygui.fileopenbox()
#print(path)
jieguoname = path.replace( ".xlsx", "(处理结果).xlsx" )

data = xlrd.open_workbook(path)
wb = copy( data )  # 写入表格
ws = wb.get_sheet( 0 )  # 写入表格

for x in range( 0, 1 ):

    table = data.sheets()[x]  # 0代表第一个表单
    nrows = table.nrows  # 行
    ncols = table.ncols  # 列数
    #print(nrows)
    #print(ncols)
    for i in range( 1, nrows ):  # nrows

        personName = table.cell( i, 1 ).value  # 姓名
        identityNumber = table.cell( i, 2 ).value# 身份证号码
        try:
           identityNumber=int(identityNumber)
        except:
            pass

        return_list = check(str(identityNumber))
        if return_list[0] == "False":
            #print( '错误' )
            #print( return_list[1] )
            ws.write(i,9,return_list[1])
            i+=1
        else:
            #print( return_list[1] )
            try:
                phoneNumber = int(table.cell( i, 3 ).value)# 手机号码
            except:
                phoneNumber = 5234088
            gender1 = table.cell( i, 4 ).value  # 性别
            if gender1=="男":
                gender=1
            else:
                gender=2
            age = int(table.cell( i, 5 ).value)  # 年龄
            print(i,personName,identityNumber,phoneNumber)
            postdata={
                    "data":{"identityValid":"1",
                    "identityType":"1",
                    "nationality":"156",
                    "personSource":"4",
                    "personIdentity":"99",
                    "insuranceType":"1",
                    "overseasPersonnel":"0",
                    "personDataSource":"6",
                    "sampleDate":"2022-01-12 13:48:00",
                    "sampleList":[{"sampleBarcode":"","sampleType":"2","detectionItem":"1","paymentType":"3"}],
                    "personName":personName,
                    "phoneNumber":phoneNumber,
                    "identityNumber":identityNumber,
                    "gender":gender,
                    "age":age}}
            r = requests.post(url, headers=headers,data=json.dumps(postdata),verify=False)
            time.sleep(random.uniform(0.5,1.5))
            print(r.url,r.status_code,r.text)#r.text
            r_data=json.loads(r.text)
            print(r_data["statusCode"])
            if r_data["statusCode"]=="000000":
                print(r_data["resultData"]["personName"],"上传成功")
                ws.write(i,9,r_data["resultData"]["id"])
                print(r_data["resultData"]["id"])
                qrpostdata={
                    "id":r_data["resultData"]["id"],
                    "appId":appId}#appID 需要根据实际情况更换。
                qr_r = requests.post(urlqr, headers=headers,data=json.dumps(qrpostdata),verify=False)
                qr_data=json.loads(qr_r.text)
                print(qr_data)
                ws.write(i,10,qr_data["resultData"]["qrCode"])
            else:
                ("上传失败")
                ws.write(i,9,"上传失败")
        wb.save(jieguoname)

免费评分

参与人数 14吾爱币 +18 热心值 +14 收起 理由
voloi + 1 我很赞同!
pride_Luv + 1 + 1 我很赞同!
corncat + 1 + 1 热心回复!
xyg10300 + 1 + 1 麻烦给个exe的成品,不会用这个代码
无缺i + 1 + 1 用心讨论,共获提升!
尘叶云渡 + 1 + 1 我很赞同!
zhao003 + 1 + 1 用心讨论,共获提升!
fengkuangbaolon + 1 + 1 希望能够教教我们 谢谢
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
sweether + 1 + 1 用心讨论,共获提升!
Ls30 + 1 非常不错的小工具,希望能够帮到有需要的人!
风云起舞 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
17798 + 1 鼓励转贴优秀软件安全工具和文档!
颜师古都 + 2 + 1 我很赞同!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

zhangpan0912 发表于 2022-2-25 07:41
这种事情非政府单位授权,还是不要搞了吧。毕竟事关公共卫生安全。建议楼主删帖。
 楼主| jokerlicf 发表于 2022-3-24 11:13
清江堤畔 发表于 2022-3-24 10:21
支持楼主便民的想法,但不支持楼主的做法。生成二维码的算法应该用官方接口。
说到底,就是如果出现问题, ...

就目前我们在农村开展的大规模全员核酸检测工作来说,提前打印好核酸二维码仍是较为便捷的方式。一是农村留守老人居多,很多人没有智能手机或者是不会操作智能手机,现场工作人员没办法同时为那么多人手把手在手机上录入信息生成核酸码,会造成核酸采样现场人员拥堵,采样流程受阻,最主要的是一些上了年纪的老年人在炎热天气下等待时间过长。
二是政府要求各村(居)提前将核酸码打印出来派发给村民,方便村民进行核酸检测的。原手机录入信息生成二维码截图的方式只能显示出姓名,更容易派发错误,所以我们在原有二维码基础上增加了身份证号码,所属自然村,行政村等字段来补充确保人、码一致。同时批量化处理也减轻村(居)手动录入的工作量已经人为重复过程中出错的几率。
三是无论以何种技术手段来讲,我们始终还是无法做到百分之百的无问题。即使所有人都是用手机上生成的二维码去检测,我们就能确保使用的二维码和被检测的人就是对应的么?技术是用来优化流程,解放人的生产力,同时更不应该抛弃老年人,就目前所经历的几次大规模核酸采集来看,很多流程我们都可以在优化一下,能直接用身份证来处理的问题,没必要非变成电子化。
 楼主| jokerlicf 发表于 2022-2-25 08:54
cn005897 发表于 2022-2-25 08:43
核算顺序出错了要出问题的

打印出来的二维码还是会分发给个人的,大规模核酸采集时还是大家排队出示自己的二维码,只是等于有的人用手机出示二维码,有人出示的是纸质版的二维码。而且信息采集工作人员在核实二维码是会显示出被检测者的有关信息进行再次核实。
 楼主| jokerlicf 发表于 2022-2-25 08:42
zhangpan0912 发表于 2022-2-25 07:41
这种事情非政府单位授权,还是不要搞了吧。毕竟事关公共卫生安全。建议楼主删帖。

这种应该是不会侵犯到公共卫生安全,相反能够在某个环节上加快全员核酸检测的进度,全员核酸检测应是越快越好,这一步只是针对采集信息二维码的提前录入也只是对于乡镇社区一级工作人员,为他们提供一个方法和思路。也方便一些留守老人能够快速参与检测。
zhukoukou 发表于 2022-2-25 09:44
佩服佩服 现场确实很麻烦 不懂操作手机的话就很慢
zjfandy 发表于 2022-2-25 07:42
这个好,支持下
7R903 发表于 2022-2-25 08:43
核算顺序出错了要出问题的
颜师古都 发表于 2022-2-25 08:46
zhangpan0912 发表于 2022-2-25 07:41
这种事情非政府单位授权,还是不要搞了吧。毕竟事关公共卫生安全。建议楼主删帖。

一个给验核酸工作人员进行信息采集的二维码也可以和公共卫生安全扯上也是离谱 人家既然会用到这种就基本是单位批量做核酸的 我们工地三百多号人 做核酸 一堆三四十岁的 要一个一个给他们操作手机 填写信息
我今天是大佬 发表于 2022-2-25 08:48
那么问题来了, 如果不幸出现了问题, 谁背锅呢
我今天是大佬 发表于 2022-2-25 08:49
颜师古都 发表于 2022-2-25 08:46
一个给验核酸工作人员进行信息采集的二维码也可以和公共卫生安全扯上也是离谱 人家既然会用到这种就基本 ...

那怎么不能录好视频, 在电视或者投影上播出呢, 大家看着来, 不就解决了起码90%了
 楼主| jokerlicf 发表于 2022-2-25 09:00
我今天是大佬 发表于 2022-2-25 08:49
那怎么不能录好视频, 在电视或者投影上播出呢, 大家看着来, 不就解决了起码90%了

一般来讲场地和设备不允许,另外也不是每个人的手机设备都是一样的,还有的是年龄大一点的也不是人人初高中以上学历,很多人连自己的身份证号码都不会背。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 00:56

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表