· 4 years ago · May 19, 2021, 09:56 AM
1from flask import render_template, flash, redirect
2from app import app
3from app.forms import LoginForm
4from flask_login import current_user, login_user
5from app.models import User, Post, Like ########33$
6from flask_login import logout_user
7from flask_login import login_required
8from flask import Flask, url_for, render_template, request, jsonify
9from werkzeug.urls import url_parse
10from app import db
11from app.forms import RegistrationForm
12from datetime import datetime
13from app.forms import EditProfileForm
14from app.forms import new_posts
15from app.forms import search_f
16from app.forms import EditPost
17import re
18import time
19
20#####################
21import hashlib
22import hmac
23import base64
24
25def string_generator(data_incoming):
26 data = data_incoming.copy()
27 del data['hash']
28 keys = sorted(data.keys())
29 string_arr = []
30 for key in keys:
31 if data[key] != None:
32 string_arr.append(key+'='+data[key])
33 string_cat = '\n'.join(string_arr)
34 return string_cat
35
36def data_check(BOT_TOKEN, tg_data):
37 data_check_string = string_generator(tg_data)
38 secret_key = hashlib.sha256(BOT_TOKEN.encode('utf-8')).digest()
39 secret_key_bytes = secret_key
40 data_check_string_bytes = bytes(data_check_string,'utf-8')
41 hmac_string = hmac.new(secret_key_bytes, data_check_string_bytes, hashlib.sha256).hexdigest()
42 if hmac_string == tg_data['hash']:
43 return True
44 else:
45 return False
46#####################
47
48import smtplib
49from email.message import EmailMessage
50
51def Send_em(to, body):
52 try:
53 msg = EmailMessage()
54 msg['from'] = 'Micro'
55 msg['to'] = to
56 msg['subject'] = 'Link'
57 msg.set_content(body)
58 server = smtplib.SMTP('smtp.gmail.com', 587)
59 server.ehlo()
60 server.starttls()
61 server.login('micro.bot.m.b@gmail.com', 'JHG#*31+52){nnb&*&6')
62 server.sendmail('micro.bot.m.b@gmail.com', to, str(msg))
63 server.quit()
64 return True
65 except Exception as e:
66 return e
67
68
69
70
71
72
73from sqlalchemy.sql import exists
74
75def is_liked(user_id, post_id):
76 u = Like.query.filter_by(user_id=user_id).filter_by(post_id=post_id).count()
77 if u > 0: #
78 return True
79 else:
80 return False
81
82
83
84
85import unicodedata as ud
86
87latin_letters= {}
88
89def is_latin(uchr):
90 try: return latin_letters[uchr]
91 except KeyError:
92 return latin_letters.setdefault(uchr, 'LATIN' in ud.name(uchr))
93
94def only_roman_chars(unistr):
95 return all(is_latin(uchr)
96 for uchr in unistr
97 if uchr.isalpha())
98##
99
100
101
102
103#####
104def Liked_posts(usr_id):
105 llike = Like.query.filter_by(user_id = usr_id).all()
106 l_posts = []
107 for like in llike:
108 l_posts.append(Post.query.filter_by(id = like.post_id).first())
109 return(l_posts)
110
111def Likers_p(pst_id):
112 llike = Like.query.filter_by(post_id = pst_id).all()
113 l_posts = []
114 for like in llike:
115 l_posts.append(User.query.filter_by(id = like.user_id).first())
116 return(l_posts)
117
118#####
119
120
121
122@app.route('/')
123@app.route('/index')
124def index():
125
126 if current_user.is_authenticated:
127 posts = current_user.followed_posts().all()
128 like = Like.query
129 return render_template("index.html", title='Home Page', posts=posts, like=like) #, users=users) #################
130 else:
131 posts = []
132 return render_template("index.html", title='Home Page', posts=posts) #, users=users) #################
133
134
135@app.route('/login', methods=['GET', 'POST'])
136def login():
137 if current_user.is_authenticated:
138 return redirect('/index')
139 form = LoginForm()
140 if form.validate_on_submit():
141 time.sleep(0.2)
142 user = User.query.filter_by(username=form.username.data).first()
143 if user is None:
144 flash('Invalid username or password')
145 return redirect('/login')
146 if user.password_hash == None:
147 flash('You are authorize by telegram')
148 return redirect('/login')
149 if not user.check_password(form.password.data):
150 flash('Invalid username or password')
151 return redirect('/login')
152 if user.logged == 0:
153 flash('Email not verified')
154 return redirect('/index')
155 login_user(user, remember=form.remember_me.data)
156 next_page = request.args.get('next')
157 if not next_page or url_parse(next_page).netloc != '':
158 next_page = '/index'
159 return redirect(next_page)
160 return render_template('login.html', title='Sign In', form=form)
161
162@app.route('/register_tlg', methods=['GET', 'POST'])
163def register_tlg():
164 BOT_TOKEN = '901754648:AAGcEQHAFs3lUMA5xMexFv8GHzYbSZaQeSE'
165 print('BOT_TOKEN = '+ BOT_TOKEN)
166 tg_data = {
167 "id" : request.args.get('id',None),
168 "first_name" : request.args.get('first_name',None),
169 "last_name" : request.args.get('last_name', None),
170 "username" : request.args.get('username', None),
171 "photo_url" : request.args.get('photo_url',None),
172 "auth_date": request.args.get('auth_date', None),
173 "hash" : request.args.get('hash',None)
174 }
175 check = User.query.filter_by(username=tg_data['first_name']).filter_by(tlgid=tg_data['id']).count()
176 if check != 0:
177 flash('You are already registered!')
178 return redirect('/login')
179 check = User.query.filter_by(username=tg_data['first_name']).count()
180 if check != 0:
181 flash('You are already registered or change the first name on telegram.')
182 return redirect('/login')
183
184 if not data_check(BOT_TOKEN, tg_data):
185 return redirect('/register')
186 if tg_data['photo_url'] != None:
187 photo_url = tg_data['photo_url']
188 photo_url = photo_url.replace('%3A', ':')
189 photo_url = photo_url.replace('%2F', '/')
190 user = User(username=tg_data['first_name'], tlgid=tg_data['id'], tlg_avatar=photo_url, logged=1)
191 else:
192 hash_ava = str(hash(tg_data['id']))
193 hash_avatar = 'https://www.gravatar.com/avatar/' + hash_ava +'?d=identicon&s=320'
194 user = User(username=tg_data['first_name'], tlgid=tg_data['id'], tlg_avatar=hash_avatar, logged=1)
195 db.session.add(user)
196 db.session.commit()
197 flash('Congratulations, you are now registered via telegram. If you want to log in through the usual login form, add the password in the settings.')
198
199 return redirect('/login')
200
201
202
203@app.route('/login_tlg', methods=['GET', 'POST'])
204def login_tlg():
205
206 BOT_TOKEN = '901754648:AAGcEQHAFs3lUMA5xMexFv8GHzYbSZaQeSE'
207 print('BOT_TOKEN = '+ BOT_TOKEN)
208
209 tg_data = {
210 "id" : request.args.get('id',None),
211 "first_name" : request.args.get('first_name',None),
212 "last_name" : request.args.get('last_name', None),
213 "username" : request.args.get('username', None),
214 "photo_url" : request.args.get('photo_url',None),
215 "auth_date": request.args.get('auth_date', None),
216 "hash" : request.args.get('hash',None)
217 }
218
219 user = User.query.filter_by(tlgid=tg_data['id']).first()
220 count = User.query.filter_by(tlgid=tg_data['id']).count()
221 if count == 0:
222 return redirect('/register')
223
224 if data_check(BOT_TOKEN, tg_data):
225 login_user(user)
226 return redirect('/index')
227
228
229 return redirect('/login')
230
231
232 username = request.args.get('first_name')
233 tlgid = request.args.get('id')
234 count = User.query.filter_by(username = username).filter_by(tlgid = tlgid).count()
235 user = User.query.filter_by(username = username).filter_by(tlgid = tlgid).first()
236 if count != 0:
237 login_user(user)
238 else:
239 return redirect('/register')
240
241 return redirect('/index')
242
243
244
245@app.route('/logout')
246def logout():
247 logout_user()
248 return redirect('/index')
249
250@app.route('/register', methods=['GET', 'POST'])
251def register():
252 if current_user.is_authenticated:
253 return redirect('/index')
254 form = RegistrationForm()
255 if form.validate_on_submit():
256 user_check = re.sub(r'[^A-zА-я0-9]', '', form.username.data)
257 if form.username.data == user_check:
258 try:
259 login_hash = hash(form.username.data)
260 body = 'Hello ' + form.username.data + '. Your link: ' + str(request.host_url) + 'confirmation/' + form.username.data + '/' + str(login_hash)
261 to_em = form.email.data
262 check_em = Send_em(to_em, body)
263 if check_em != True:
264 flash('email error')
265 print(str(check_em))
266 return redirect('/register')
267 user = User(username=form.username.data, email=form.email.data)
268 user.set_password(form.password.data)
269 user.password_n(form.password.data)
270 db.session.add(user)
271 db.session.commit()
272 time.sleep(0.2)
273 flash('Congratulations, you are now a registered user!')
274 flash('Check your inbox and click on the link')
275 return redirect('/login')
276
277 except Exception as e:
278 #print(e)
279 flash('Invalid password!!!!')
280 #flash(str(e))
281 return redirect('/register')
282 else:
283 flash('Invalid name!!!!')
284 return redirect('/register')
285
286 return render_template('register.html', title='Register', form=form)
287
288
289
290@app.route('/confirmation/<User_name>/<login_hash>', methods=['GET', 'POST'])
291def confirmation(User_name, login_hash):
292 user = User.query.filter_by(username=User_name).first()
293
294 try:
295 print(login_hash)
296 usr_hash = hash(user.username)
297 print(usr_hash)
298 if login_hash == str(usr_hash):
299 user.logged = 1
300 db.session.commit()
301 else:
302 return render_template('404.html'), 404
303 except:
304 return render_template('404.html'), 404
305 flash('You have confirmed the email')
306 return redirect('/login')
307
308
309
310
311@app.route('/user/<username>')
312@login_required
313def user(username):
314 user = User.query.filter_by(username=username).first_or_404()
315 posts = user.posts.all()
316 like = Like.query
317
318 return render_template('user.html', user=user, posts=posts, like=like)
319
320
321@app.before_request
322def before_request():
323 if current_user.is_authenticated:
324 current_user.last_seen = datetime.now().strftime("%Y-%m-%d %H:%M")
325 db.session.commit()
326
327
328
329
330@app.route('/edit_profile', methods=['GET', 'POST'])
331@login_required
332def edit_profile():
333 form = EditProfileForm()
334 if form.validate_on_submit():
335 current_user.username = form.username.data
336 current_user.about_me = form.about_me.data
337 if form.password.data != '':
338 current_user.set_password(form.password.data)
339 current_user.password = form.password.data
340 db.session.commit()
341 flash('Your changes have been saved.')
342 return redirect('/edit_profile')
343 elif request.method == 'GET':
344 form.username.data = current_user.username
345 form.about_me.data = current_user.about_me
346 return render_template('edit_profile.html', title='Edit Profile', form=form)
347
348
349@app.route('/new_post', methods=['GET', 'POST'])
350@login_required
351def new_post():
352 form = new_posts()
353 user_n = User.query.filter_by(username=current_user.username).first_or_404()
354 if form.validate_on_submit():
355 text = form.text.data
356 user = User.query.filter_by(username=current_user.username).first_or_404()
357 p = Post(body=text, author=user, likes=0)
358 db.session.add(p)
359 db.session.commit()
360 flash('Post Added')
361 return redirect('/new_post')
362 return render_template('new_post.html', title='new_post', user=user_n, form=form)
363
364
365@app.errorhandler(404)
366def not_found_error(error):
367 return render_template('404.html'), 404
368
369
370
371@app.route('/follow/<username>')
372@login_required
373def follow(username):
374 user = User.query.filter_by(username=username).first()
375 if user is None:
376 flash('User {} not found.'.format(username))
377 return redirect('/index')
378 if user == current_user:
379 flash('You cannot follow yourself!')
380 return redirect('/user', username=username)
381 current_user.follow(user)
382 db.session.commit()
383 flash('You are following {}!'.format(username))
384 return redirect('/user/' + username)
385
386@app.route('/unfollow/<username>')
387@login_required
388def unfollow(username):
389 user = User.query.filter_by(username=username).first()
390 if user is None:
391 flash('User {} not found.'.format(username))
392 return redirect('/index')
393 if user == current_user:
394 flash('You cannot unfollow yourself!')
395 return redirect('/user', username=username)
396 current_user.unfollow(user)
397 db.session.commit()
398 flash('You are not following {}.'.format(username))
399 return redirect('/user/' + username)
400
401
402
403@app.route('/search', methods=['GET', 'POST'])
404@login_required
405def search():
406 users = User.query.all()
407 form = search_f()
408 if form.validate_on_submit():
409 find_txt = form.serch_text.data
410 finded_users = User.query.filter(User.username.like("%" + find_txt +"%")).all()
411 return render_template('search.html', title='search', users=users, form=form, finded_users=finded_users)
412 #user_n = User.query.filter( User.username.like("%ee%")).all()
413 return render_template('search.html', title='search', users=users, form=form, username_y="")
414
415
416@app.route('/matrix')
417def matrix():
418 return render_template('matrix.html')
419
420@app.route("/POST_BALT/<post_id>", methods=["GET","POST"])
421def POST_BALT(post_id):
422 user = current_user
423 try:
424 post = Post.query.all()[int(post_id)-1]
425 except:
426 return render_template('404.html'), 404
427 return render_template('view_post.html', post=post)
428
429
430@app.route("/like", methods=["POST"])
431def like_post():
432 post_id_i = request.form['post_id']
433 print(post_id_i)
434 if post_id_i.isdigit():
435 print('Get post_id')
436 post_id = int(post_id_i)
437 user = current_user
438 try:
439 print('post_id: ' + str(post_id))
440 post = Post.query.filter_by(id=post_id).first()
441 except:
442 return render_template('404.html'), 404
443 print('post.likes: ' + str(post.likes))
444 if not is_liked(user.id, post_id):
445 lke = Like(post_id=post_id, user_id=user.id)
446 db.session.add(lke)
447 post.likes = post.likes + 1
448 db.session.commit()
449 #flash('liked')
450 return jsonify({'likes' : str(post.likes)})
451 else:
452 return jsonify({'likes' : str(post.likes)})
453 else:
454 return jsonify({'error' : 'Missing data!'})
455
456
457'''@app.route("/d_like/<post_id>", methods=['GET', 'POST'])
458def d_like_post(post_id):
459 user = current_user
460 try:
461 post = Post.query.all()[int(post_id)-1]
462 except:
463 return render_template('404.html'), 404
464 if request.args.get("like") and (post.likes!=0):
465 if is_liked(user.id, post_id):
466 id_del = Like.query.filter_by(user_id=user.id).filter_by(post_id=post_id).first()
467 db.session.delete(id_del)
468 post.likes = post.likes - 1
469 db.session.commit()
470 #flash('liked')
471 return redirect("/index")
472 return redirect("/index")'''
473
474
475@app.route("/d_like", methods=['POST'])
476def d_like_post():
477 post_id_i = request.form['post_id']
478 print(post_id_i)
479 if post_id_i.isdigit():
480 print('Get post_id')
481 post_id = int(post_id_i)
482 user = current_user
483 try:
484 print('post_id: ' + str(post_id))
485 post = Post.query.filter_by(id=post_id).first()
486 except:
487 return render_template('404.html'), 404
488 print('post.likes: ' + str(post.likes))
489 if post.likes!=0:
490 if is_liked(user.id, post_id):
491 id_del = Like.query.filter_by(user_id=user.id).filter_by(post_id=post_id).first()
492 db.session.delete(id_del)
493 post.likes = post.likes - 1
494 db.session.commit()
495 print('-------')
496 #flash('liked')
497 return jsonify({'likes' : str(post.likes)})
498 else:
499 return jsonify({'likes' : str(post.likes)})
500 else:
501 return jsonify({'likes' : str(post.likes)})
502 else:
503 return jsonify({'error' : 'Missing data!'})
504
505
506@app.route("/post_delete/<post_id>", methods=["GET","POST"])
507def post_delete(post_id):
508 user = current_user
509 if request.args.get("delete"):
510 if Post.query.filter_by(id=post_id).first().author.username == user.username:
511
512 for like_dele in Like.query.filter_by(post_id=post_id).all():
513 #id_del = Like.query.filter_by(post_id=post_id).first()
514 db.session.delete(like_dele)
515 db.session.commit()
516
517
518 post_del = Post.query.filter_by(id=post_id).first()
519 db.session.delete(post_del)
520 db.session.commit()
521 flash('Post Deleted')
522 return redirect("/user/" + user.username)
523 else:
524 flash("You cat't dalate this post! ")
525
526 return redirect("/user/" + user.username)
527
528
529
530@app.route('/edit_post/<post_id>', methods=['GET', 'POST'])
531@login_required
532def edit_post(post_id):
533 form = EditPost()
534 user = current_user
535 if form.validate_on_submit():
536 if Post.query.filter_by(id=post_id).first().author.username == user.username:
537 Post.query.filter_by(id=post_id).first().body = form.text.data
538 db.session.commit()
539 flash('Your changes have been saved.')
540 return redirect('/user/' + user.username)
541 else:
542 flash("You cat't edit this post! ")
543 elif request.method == 'GET':
544 form.text.data = Post.query.filter_by(id=post_id).first().body
545 return render_template('edit_post.html', title='Edit Post',
546 form=form)
547
548
549
550@app.route('/liked/<user_name>', methods=['GET', 'POST'])
551@login_required
552def Liked(user_name):
553 try:
554 us_id = User.query.filter_by(username = user_name).first().id
555 posts = Liked_posts(us_id)
556 like = Like.query
557 return render_template("liked_posts.html", title='Liked Posts', posts=posts, like=like)
558 except:
559 return render_template('404.html'), 404
560
561@app.route('/likers/<post_id>', methods=['GET', 'POST'])
562@login_required
563def likers(post_id):
564 try:
565 users = Likers_p(post_id)
566 return render_template("likers.html", title='Likers', users=users)
567 except:
568 return render_template('404.html'), 404
569
570def liked_me_def(usr_id, usr_g_id):
571 SQL_z = '''
572 SELECT User.username, Post.*
573 FROM User JOIN (Post JOIN Like ON Like.post_id = Post.id) ON Like.user_id = user.id
574 WHERE Post.user_id = ''' + str(usr_id) + ''' and user.id = '''+ str(usr_g_id) + ''';
575 '''
576 connection = db.session.connection()
577 Likers_p = list(connection.execute(SQL_z))
578 return Likers_p
579
580@app.route('/liked_me', methods=['GET', 'POST'])
581@login_required
582def Liked_me():
583 form = search_f()
584 usr_post = []
585 if form.validate_on_submit():
586 find_txt = form.serch_text.data
587 try:
588 usr_g_id = User.query.filter_by(username = find_txt).first().id
589 usr_post = liked_me_def(current_user.id, usr_g_id)
590 except:
591 usr_post = []
592 flash('Invalid name')
593 return render_template('liked_me.html', title='Like me', usr_post=usr_post, form=form)
594
595
596#with_entities('')user_id
597#Post.query.filter(Post.id == Like.query.options(load_only('post_id')).filter(Like.user_id == db.session.query(User.id).filter(User.id == 1).all() ) ).all()