import cv2, os import sys import json import base64 import sqlite3 import numpy as np import face_recognition from jdatetime import date from time import localtime, strftime from flask import Flask, render_template, request, abort, Response app = Flask(__name__) newimg_li = [0, 0, 0, 0] database = "/home/FaceAtt/mysite/database.db" cnt = sqlite3.connect(database) con = cnt.cursor() def ReadSQL(sql): cnt = sqlite3.connect(database) con = cnt.cursor() return list(con.execute(sql)) def ExecSQL(sql): cnt = sqlite3.connect(database) con = cnt.cursor() try: con.execute(sql) cnt.commit() return "1" except: return "0" def get_plast(id): ini = ReadSQL( """SELECT * FROM attendances WHERE "user_id" = '{}' AND "type" = 'ورود' ORDER BY "id" DESC LIMIT 0,1""".format( id)) out = ReadSQL( """SELECT * FROM attendances WHERE "user_id" = '{}' AND "type" = 'خروج' ORDER BY "id" DESC LIMIT 0,1""".format( id)) ini = ini[0] if len(ini) != 0 else ("", "", "", "00:00", "00-00-00") out = out[0] if len(out) != 0 else ("", "", "", "00:00", "00-00-00") return "از " + ini[4] + " " + ini[3] + " تا " + out[4] + " " + out[3] def readb64(uri): encoded_data = uri.split(',')[1] nparr = np.fromstring(base64.b64decode(encoded_data), np.uint8) img = cv2.imdecode(nparr, cv2.IMREAD_COLOR) return img @app.route("/") def hello(): return render_template('index.html', namep="-----", navp="-----", timep="از 00:00 تا 00:00", ) @app.route("/add", methods=['GET', 'POST']) def add(): if request.method == 'POST': global newimg_li newimg_li = [0, 0, 0, 0] return "1" return "0" @app.route("/one_img", methods=['GET', 'POST']) @app.route("/two_img", methods=['GET', 'POST']) @app.route("/tre_img", methods=['GET', 'POST']) @app.route("/for_img", methods=['GET', 'POST']) def one_img(): try: if request.method == 'POST': global newimg_li data = request.form['image'].split(',')[0] if "image/png" not in data and "image/jpeg" not in data: return "لطفا تصویر وارد کنید." img = readb64(request.form['image']) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) face_code = face_recognition.face_encodings(img) if len(face_code) == 0: return "چهره ای در تصویر شناسایی نشد." if len(face_code) > 1: return "لطفا تصویری با یک چهره وارد کنید." face_code = list(face_code[0]) if "one" in request.url: newimg_li[0] = face_code if "two" in request.url: if newimg_li[0] == 0: return "تصویر اول را وارد کنید." newimg_li[1] = face_code if "tre" in request.url: if newimg_li[0] == 0: return "تصویر اول را وارد کنید." if newimg_li[1] == 0: return "تصویر دوم را وارد کنید." newimg_li[2] = face_code if "for" in request.url: if newimg_li[0] == 0: return "تصویر اول را وارد کنید." if newimg_li[1] == 0: return "تصویر دوم را وارد کنید." if newimg_li[2] == 0: return "تصویر سوم را وارد کنید." newimg_li[3] = face_code return "1" except: pass return '0' @app.route("/savenew", methods=['GET', 'POST']) def savenew(): try: if request.method == 'POST': name = request.form['name'] nave = request.form['nav'] if name == "": return "نام را وارد کنید." if nave == "": return "کد ملی را وارد کنید." try: int(nave) except: return "کد ملی باید عدد باشد." naves = ReadSQL("SELECT * FROM users WHERE nave = '{nav}'".format(nav=nave)) if len(naves) != 0: return "کد ملی تکراری است." if 0 in newimg_li: return "تمامی تصاویر را وارد کنید." return ExecSQL("INSERT INTO users VALUES (null, '{name}', '{nav}', '{code}')".format(name=name, nav=nave, code=json.dumps( newimg_li))) except: pass return '0' @app.route('/search', methods=['GET', 'POST']) def search(): try: img = readb64(request.form['image']) users = ReadSQL("SELECT * FROM users") face_codes = face_recognition.face_encodings(img) out_li = [] l = 0 for face_code in face_codes: l += 1 for user in users: if True in face_recognition.compare_faces(json.loads(user[3]), face_code): au = list(user[:3]) au.append(get_plast(user[0])) out_li.append(au) continue if len(out_li) != l: out_li.append("0") if len(out_li) == 0: out_li.append("0") locs = face_recognition.face_locations(img) for loc in locs: rec = cv2.rectangle(img, (loc[3], loc[0]), (loc[1], loc[2]), (255, 0, 255), 3) retval, buffer = cv2.imencode('.png', img) img_base64 = "data:image/png;base64," + str(base64.b64encode(buffer))[2:-1] out_li.append(img_base64) return json.dumps(out_li) except: return '0' @app.route("/ini/") @app.route("/out/") def init(id): if id == "0": return "00:00" typ = "ورود" if "ini" in request.url else "خروج" ExecSQL( "INSERT INTO attendances VALUES (null, '{}', '{}', '{}', '{}')".format(id, typ, strftime("%H:%M", localtime()), str(date.today()))) return get_plast(id) @app.route("/users") def users_show(): theads = ["نام", "کد ملی"] tbodys = ReadSQL("SELECT name,nave FROM users") return render_template('table.html', title="کاربران", columns="[0, 1]", theads=theads, tbodys=tbodys) @app.route("/atts") def atts_show(): theads = ["نام", "کد ملی", "نوع", "تاریخ", "زمان"] tbodys = ReadSQL( "SELECT users.name, users.nave, type, date, time FROM attendances INNER JOIN users ON attendances.user_id = users.id;") return render_template('table.html', title="ورود و خروج", columns="[0, 1, 2, 3, 4]", theads=theads, tbodys=tbodys)