# -*- coding: utf-8 -*- # pip install qrcode # pip install pandas # pip install pillow import qrcode, hashlib, time import pandas as pd from PIL import Image import sys, os strtime = str(time.time()) print(os.getcwd()) path = os.getcwd() #print path # 從命令列參數取得資料夾名稱和 CSV 檔案名稱 # 第一個參數:資料夾名稱 # 第二個參數:CSV 檔案名稱(可選,如果沒有提供則使用資料夾名稱) if len(sys.argv) > 1: folder_name = sys.argv[1] # 第一個參數作為資料夾名稱 if len(sys.argv) > 2: csv_filename = sys.argv[2] # 第二個參數作為 CSV 檔案名稱 # 移除 .csv 副檔名(如果有的話) if csv_filename.endswith('.csv'): csv_filename = csv_filename[:-4] else: csv_filename = folder_name # 如果沒有第二個參數,使用資料夾名稱 else: folder_name = 'AB151' # 預設值 csv_filename = 'AB151' filename = folder_name + '/' class_folder=path + f'/output{filename}' if(not os.path.isdir(class_folder)): os.makedirs(class_folder + filename) in_csv = path + f'/{csv_filename}.csv' out_csv = path + f'/output{filename}/'+filename+'/outData_'+strtime+'.csv' out_csv2 = path + f'/output{filename}/'+filename+'/outData4enterlogsadmincards_'+strtime+'.csv' out_csv3 = path + f'/output{filename}/'+filename+'/outData4enterlogsadmincardsinput_'+strtime+'.csv' target = path + f'/output{filename}/' #useless enc_table_16 = "0123456789abcdef" enc_table_64 = "rFuWWAcPSqEhPF9nn8jfqStVE4nZxRJrhMGUKLFWb2uGgSx65KvfjdeF3CVsvd69" def create_qr_code(): df = pd.read_csv(in_csv, encoding='utf-8-sig') # 將所有空值(NaN)填充為空字串,避免型別錯誤 df = df.fillna('') class_prefix = [] name_arr = [] student_no_arr = [] phone_arr = [] email_arr = [] qrcode_link = [] card_id = [] for index, values in df.iterrows(): classprefix = str(values['課程代號']) name = str(values['姓名']) student_no = str(values['學號']) phone = str(values['手機']) email = str(values['信箱']) string = classprefix + email hashed_student_no = hash_classfix_account(string) parameter = name + student_no hash_parameter = short_str(parameter, 8) hash_filename = short_str_enc(hash_parameter, 8, enc_table_64) data = f'https://class.aiacademy.tw/student/{hashed_student_no}' print(student_no + ': ' + hashed_student_no) qr = qrcode.QRCode( version=1, error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4 ) qr.add_data(data) qr.make(fit=True) img = qr.make_image(fill='black', back_color='white') img.save(f'{target}{filename}{student_no}_{hash_filename}.jpg') #img.save(f'{target}{filename}{student_no}.png') # write back to special columns data in csv file_path = f'class.aiacademy.tw/assets/qrcode/{student_no}_{hash_filename}.jpg' #file_path = f'class.aiacademy.tw/assets/qrcode/{student_no}.png' print(student_no + ': ' + str(file_path)) class_prefix.append(classprefix) name_arr.append(name) student_no_arr.append(student_no) print('appending ' + phone) phone_arr.append(phone) email_arr.append(email) qrcode_link.append(file_path) card_id.append(hashed_student_no) pd.DataFrame({'課程代號': class_prefix, '姓名': name_arr, '學號': student_no_arr, '手機': phone_arr, \ '信箱': email_arr, '連結': qrcode_link, 'QR Code ID': card_id}).to_csv(out_csv, index=False, encoding='utf-8-sig') a = [] with open(out_csv, 'r', encoding='utf-8-sig') as f: a = f.read().splitlines() s = [] for i,v in enumerate(a): if i==0:continue; x = v.split(',') s += ["\t".join([x[6], x[1], x[2], x[3], x[4]])] with open(out_csv2, 'w', encoding='utf-8-sig') as f: f.write("\n".join(s)) # 生成第三個 CSV 檔案:hashed_student_no\thashed_student_no s3 = [] for hashed_id in card_id: s3 += [f"{hashed_id}\t{hashed_id}"] with open(out_csv3, 'w', encoding='utf-8-sig') as f: f.write("\n".join(s3)) def hash_classfix_account(string): md5 = hashlib.md5() md5.update(('newQRCODE'+string+'from20201118byBaoYunIdea').encode('UTF-8')) data_hash = md5.hexdigest() return data_hash def short_str(s, char_length=8): if char_length > 128: raise ValueError("char_length {} exceeds 128".format(char_length)) hash_object = hashlib.sha512(s.encode()) hash_hex = hash_object.hexdigest() return hash_hex[0:char_length] def int_to_enc(n, enc_table): if n == 0: return enc_table[0] base = len(enc_table) digits = "" while n: digits += enc_table[int(n % base)] n //= base return digits[::-1] def short_str_enc(s, char_length=8, enc_table=enc_table_64): if char_length > 128: raise ValueError("char_length {} exceeds 128".format(char_length)) hash_object = hashlib.sha512(s.encode()) hash_hex = hash_object.hexdigest() hash_enc = int_to_enc(int(hash_hex, 16), enc_table) return hash_enc[0:char_length] create_qr_code() ''' Input Image into QR Code ''' # im = Image.open(f'{target}{name}_{student_no}_{hash_filename}.png') # im = im.convert("RGBA") # logo = Image.open(f'{target}logo.png') # box = (135,135,235,235) # im.crop(box) # region = logo # region = region.resize((box[2] - box[0], box[3] - box[1])) # im.paste(region,box) # im.show() # width, height = im.size # # How big the logo we want to put in the qr code png # logo_size = 50 # # Open the logo image # logo = Image.open(f'{target}logo.png') # # Calculate xmin, ymin, xmax, ymax to put the logo # xmin = ymin = int((width / 2) - (logo_size / 2)) # xmax = ymax = int((width / 2) + (logo_size / 2)) # # resize the logo as calculated # logo = logo.resize((xmax - xmin, ymax - ymin)) # # put the logo in the qr code # im.paste(logo, (xmin, ymin, xmax, ymax)) # im.show() # im.save(f'{target}TC6/{name}_{student_no}_{hash_filename}.png')