from flask import Flask, request, render_template, escape, url_for, jsonify from flask import (url_for, current_app as app) from flask_limiter import Limiter from flask_limiter.util import get_remote_address import requests from termcolor import cprint, colored import colorama colorama.init() import json from bs4 import BeautifulSoup import re from werkzeug.exceptions import HTTPException # from livereload import Server from queue import Queue import random from threading import Thread import time import logging import os # for Cwd path path = os.getcwd() unlocked = [ { 'id': 1, 'title': u'UNLOCKED 1', 'description': u'description', 'done': False }, { 'id': 2, 'title': u'UNLOCKED 2', 'description': u'test description 2', 'done': False } ] locked = [ { 'id': 1, 'title': u'LOCKED 1', 'description': u'(IMEI_input)', 'done': False }, { 'id': 2, 'title': u'LOCKED 2', 'description': u'test description 2', 'done': False } ] notapple = [ { 'id': 1, 'title': u'NOT APPLE 1', 'description': u'description', 'done': False }, { 'id': 2, 'title': u'NOT APPLE 2', 'description': u'test description 2', 'done': False } ] class ThreatStackError(Exception): '''Base Threat Stack error.''' class ThreatStackRequestError(ThreatStackError): '''Threat Stack request error.''' class ThreatStackAPIError(ThreatStackError): '''Threat API Stack error.''' app = Flask(__name__) limiter = Limiter( app, key_func=get_remote_address, #default_limits=["5 per minute", "100 per hour"] # number of request per VALUE (second/minute/hour/day) ) @app.errorhandler(404) def page_not_found(e): return render_template("404.html") @app.route('/dev') def test_page(): return render_template('dev.html') @app.route('/appchecker') def test2_page(): return render_template('appchecker.html') @app.errorhandler(404) def resource_not_found(e): return jsonify(error=str(e)), 404 # @app.errorhandler(429) # def ratelimit_handle(e): # return "Too many request: limit 5 per minute" @app.route('/') #@limiter.limit("5 per day") # page refreshes per day def my_form(): #raise InvalidUsage('This view is gone', status_code=500) return render_template('/no_entry/no_entry.html', title='database') @app.route('/favicon.ico') def favicon(): return url_for('static', filename='/images/my_favicon.png') ############### @app.route('/v1/api/modelcheck/', methods=['GET', 'POST']) ##model checker att def att(imei1): url = 'https://www.att.com/msapi/saleswirelessaccountsetup/v1/activation/validateimei/{}'.format(imei1) payload={} headers = { 'Cookie': '_abck=9A8A651E8DF1B2590D34469B707FD856~-1~YAAQn5o7F9deqHOAAQAAbnJLiweaEtQhTmsU+AsJGUj4yNMhkHEavQ8scwv0DCm0MmkOF2TGTrE0zA5LEV1sTU7MizvJOO3GzLeCRvI9klrGkQsLB3JQHhgSjp3Shz/ye+hTEE1soSqGKd2xdJTr5GXsSQYLjVN5CGX/PI9avIGM5Ru6HaU01Lmes86uHJIYw2l6XBmlKd99lMKOoZIhVtmJ3mV7YokvLpPiJoSAb1svB9CUgnE+lf0QyJ2Ej5yxCDgvjYn3HW2+UyHfuWU6NJ9zwZt2tUjG3FhELJoQ2CnefjvymfMhRxufJkDw6j77qb0GvvzwibOxP5wcYp6CHC1eRt5czCfio8Za2+vhUG0FUVOwH7ZL33gTIZmuJ1A1L4Cjs+y3sUkyipaH0C2Eo/beUZfQyg==~-1~-1~-1; ak_bmsc=7513014BBB9D21A06EF0891C46B29EBC~000000000000000000000000000000~YAAQn5o7F9heqHOAAQAAbnJLiw8dVdSMbuw2UJsXKfeYCJcfxFGitfJV/9MK29iO0OPicmVwczRN8O7vovGdM6jSWqhEk3gkRUjSYLqbBMv6wkjV7/4cQ8eBDcVJP4458mfb0WzHurXss/fMu+BvbIuf+joUgYB69UX905+cITlgGEXuKvwHAscc/2VeT18VMvKj4te3RFqtSrPfil04vB42dJET8xm4JuYyD3AUJCgxmrnuwW/CSGVufvgHtjSW0f3FMhS4+ic7iRQzngmkmqQpz3Dw1Z6ZL6lUX2b+ry06aeY24VHbpdhN5SgtsO8LbOcYHrgCFWpLrnjEJXPONmd5s1NamL6RCOPqWMpck2DY8egb0bMOjQ==; bm_sz=5AC4CC15700E6C65DB96887F0CD28667~YAAQn5o7F9leqHOAAQAAbnJLiw8k7AXeP+YpNdIp/fRcU3qNwxmuR+zvALwGdOtuAg/4hJScPyJkIs66hzcNhrT2KCLCaBGiICmvYA+FnD5ncGSCyeu1TFD5yfLagLbYDprIIezWdDpcvlZdEaOWqUfZ/Ibodv6frJ5Kvq0YCM0Nd0NFCdrK7xWgY21hBdVgyFC/btTldg8vp/YCpnkW53NjaZibg4PCPf1VRcU46V+SIy4ovHf1ZwBTkwcgV2QGhfRqbUkSTMm7HYnKBJ9muG3IEVfk8a6uBLqQuEvF52E=~3618096~3683393; dtCookie=v_4_srv_5_sn_9427274E09EF544C2017BB17E3A14639_perc_100000_ol_0_mul_1_app-3Abd713399aea6d196_1; ixp=325d8734-54d8-4b07-9b04-83a0ec33bee8; UUID=625d5076-7214-a797-63de-27a6ca9f9171; attathv=012721; idpmgw=eyJjcyI6IlVuQXV0aCIsInNpZCI6IkpTNk1ibmZYVU15VXhUd2Nfb3d5MF9naV9WUGk4TlRlcVJ4blJoOVM5Y1UiLCJjc1RrIjoiS0lja2hEaHNNYWxUZHRDRkhqRUpNL0VLc2puRS9UN1l1dzl2WT0iLCJpYXQiOjE2NTE2MDQ0MTksImV4cCI6MTY1MTYwNjIxOX0.avoG5yFmfEW5iW6t0rAW3XeRznHxgu14EZmf40K1vrw; idse_stack=aldc' } #response = requests.request("GET", url, headers=headers, data=payload) response = requests.get(url, headers=headers, data=payload) #response.status_code = 200 data = response.json() # 351782460125659 error test # 355980080577731 samsung # 353282627775445 att iphone 13 try: pattern1 = data['content']['deviceDetails']['imei'] pattern2 = data['content']['deviceDetails']['make'] pattern3 = data['content']['deviceDetails']['model'] pattern4 = data['content']['deviceDetails']['eid'] #ATT? pattern5 = data['content']['deviceDetails']['serialNumber'] #ATT? mylist = [ {'results': [ {'IMEI': pattern1, 'Make': pattern2, 'Model': pattern3, 'eid': pattern4, 'Serial': pattern5} ]}] return jsonify(mylist) except (ValueError, KeyError, TypeError) as error: print(error) #return jsonify('{} Not Found 1'.format(imei1)) pass try: pattern1 = data['content']['deviceDetails']['imei'] pattern2 = data['content']['deviceDetails']['make'] pattern3 = data['content']['deviceDetails']['model'] mylist = [ {'results': [ {'IMEI': pattern1, 'Make': pattern2, 'Model': pattern3} ]}] return jsonify(mylist) except (ValueError, KeyError, TypeError) as error: print(error) return jsonify('{} Not Found 1'.format(imei1)) @app.route('/v1/api/lockcheck/', methods=['GET', 'POST']) ##simlock checker V4 def unlock(imei2): url = "https://www.koodomobile.com/my-account/device/unlock/validate?ban=AqZuij_lrjJ9pumoIkX57g&sub=mfWHlOGMrFLY_hAs-Wgdyg" payload = { 'csrf1': '48e17dbca76e5b4a6e8c02b674747f07', 'new_device': 'new', 'imei': (imei2), # locked 356554108082393 unlocked 355344089059268 'unlockReason': 'Will use for travel' } headers = { 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', #'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"', 'sec-ch-ua-mobile': '?0', 'Origin': 'https://www.koodomobile.com', 'Upgrade-Insecure-Requests': '1', 'DNT': '1', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36', 'Accept': 'application/json', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-User': '?1', 'Sec-Fetch-Dest': 'document', 'Referer': 'https://www.koodomobile.com/my-account/device/unlock?ban=AqZuij_lrjJ9pumoIkX57g&sub=mfWHlOGMrFLY_hAs-Wgdyg&INTCMP=KMNew_Lnk_DeviceUnlock', 'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7', 'Cookie': 'lang=en; prov=BC; pf_sessionid=a7ffb632-97a5-4bb5-9eac-9b9eadbf15b3; uss_session=efb792834ede98b970843487ea0adff1; uss_csrf2=48e17dbca76e5b4a6e8c02b674747f07', 'Authorization': 'Bearer eyJraWQiOiI0NDY3MzUxNy04MTc4LTJjYTMtOWU3MC1mZTZiYjg4YjU2OTIiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJqWWZQdWNkYURmMjRVYkdLNkJ1NkFZN1N4VW5OY2I3SiIsInJ0Ijoie1wic2VnbWVudGF0aW9uSWRcIjpcIlBPTEFSSVNcIn0iLCJkZWFsZXJDb2RlIjoiIiwiaXNzIjoiaHR0cHM6XC9cL2FwaS50LW1vYmlsZS5jb21cL29hdXRoMlwvdjYiLCJtYXN0ZXJEZWFsZXJDb2RlIjoiIiwiYXV0aFRpbWUiOiIxNjMxMzEyODEzMjM2Iiwic3RvcmVJZCI6IiIsInVzbiI6ImFjZjMzNzRjLTk3NzctYjBlMC01N2NlLTYyMThhMGNlZTY4MyIsImF1ZCI6ImpZZlB1Y2RhRGYyNFViR0s2QnU2QVk3U3hVbk5jYjdKIiwic2VuZGVySWQiOiIiLCJuYmYiOjE2MzEzMTI4MTMsInNjb3BlIjoiIiwiYXBwbGljYXRpb25JZCI6IiIsImV4cCI6MTYzMTkxNzYxMywiaWF0IjoxNjMxMzEyODEzLCJjaGFubmVsSWQiOiIiLCJqdGkiOiIwOTc4ZGI1NC1jMzljLTYyYzUtODczYi04NTk1N2MyMGIzMmYifQ.aa5PEcjkfb9RQ6bMEo1C1r2NiqCzxKNZ5DwUYdJeD5pA9cH3akpVv12guLFWIa2-FPnfCjOfJIDf-x4XayyJ-OShxt_CXXEflHNMgCrLlg4TQn3fovNWm6BkmM-sp8vPdpeK4Vema57ru5YJiLVq41Sd3CcPhscLAswxQngjSB9sEvKOql_OyYa6gKBWGLFZOqC6-67O91sJlqWirYDc7nlNoGkTuv8faognk1sDfY7QJHn3aWhcwDR3gSRHvAX79GzbRcDzYojOk7D3jVDtWJjG-Zj5Q4fKKbo2heUxbw2N7J8qK0wzmS_c_N-mbsQNJCGU7SMwtgg8ak75naE7SA' } response1 = requests.request("POST", url, headers=headers, data=payload) ##response3 = requests.request("GET", url3, headers=headers) # att #data1 = response1.json() #print(response1.content) #print(data1) try: # n = random.randint(1, 1) # q.put(n) # time.sleep(n) # Finding a pattern(certain text) pattern = 'Your phone has already been unlocked.' soup1 = BeautifulSoup(response1.content, 'html.parser') if soup1.find_all('h1', text=pattern): cprint('{} Unlocked 1'.format(imei2), 'green', attrs=['bold', 'dark']) return jsonify('{} Unlocked'.format(imei2)) else: pass except IndexError: pass except TypeError: pass except KeyError: pass except requests.exceptions.ConnectionError: print('broken') return jsonify('Connection timeout request') try: # Finding a pattern(certain text) pattern2 = 'Apple is still processing your request.' soup = BeautifulSoup(response1.content, 'html.parser') if soup.find_all('h1', text=pattern2): cprint('{} Unlocked 2'.format(imei2), 'green', attrs=['bold', 'dark']) return jsonify('{} Unlocked'.format(imei2)) else: pass except IndexError: pass except TypeError: pass except KeyError: pass ############################################################# Network Locked try: # Finding a pattern(certain text) pattern3 = "Oops! We're unable to unlock your phone." soup = BeautifulSoup(response1.content, 'html.parser') if soup.find_all('h1', text=pattern3): cprint('{} Network Locked 1'.format(imei2), 'red', attrs=['bold', 'dark']) return jsonify('{} Network Locked'.format(imei2)) #return ('Network Locked') else: pass except IndexError: pass except TypeError: pass except KeyError: pass try: ##new add invalid response for iphone 353803082639501 357284098928038 # Finding a pattern(certain text) patternerror = "An error has occurred." soup = BeautifulSoup(response1.content, 'html.parser') # if soup.find('offerTitle', text = patterncus): if soup.findAll("div", {"class": "page-header"}): cprint('{} RETRY TIMED OUT'.format(imei2), 'red', attrs=['bold', 'dark']) return ('{} RETRY'.format(imei2)) else: # results = soup.find("div", {"class": "test"}) return jsonify('{} Not Found'.format(imei2)) except (ValueError, KeyError, TypeError) as error: print(error) return jsonify('{} Not Found'.format(imei2)) ############### #@app.route('/v1/api/blacklistcheck/', methods=['GET', 'POST']) ##retail check api def mod5(imei3): #imei3 = request.form['variable1'] url = "https://api.mymobileaccount.com/phone/byod/lifeline/validate" payload = '{{"serial": "{}"}}'.format(imei3) headers = { 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7', 'Authorization': 'Bearer null', 'Connection': 'keep-alive', 'Content-Type': 'application/json; charset=UTF-8', 'DNT': '1', 'Origin': 'https://qlinkwireless.com', 'Referer': 'https://qlinkwireless.com/byop.aspx', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'cross-site', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', 'sec-ch-ua': '".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"' } #response1 = requests.request("POST", url, headers=headers, data=payload) response4 = requests.request("POST", url, headers=headers, data=payload) ##response3 = requests.request("GET", url3, headers=headers) # att #data1 = response1.json() #print(response1.content) #print(data1) data = (response4.json()) # correct one #soup1 = BeautifulSoup(response4.content, 'html.parser') #print(imei3) # try: # manufdata = data['Manufacturer'] # print('Manufacturer: {} '.format(colored(manufdata, 'white', attrs=['bold']))) # return jsonify('{}'.format(imei3), manufdata) # except KeyError: # pass # # try: # marketdata = data['MarketingName'] # print('Model: {} '.format(colored(marketdata, 'cyan', attrs=['bold']))) # return jsonify(marketdata) # except KeyError: # pass # # try: # modeldata = data['Model'] # print('IMEI: {} '.format(colored(modeldata, 'white', attrs=['bold', 'dark']))) # return jsonify(modeldata) # except KeyError: # pass # # try: # unlockdata = data['LockStatus'] # if data['LockStatus'] == "PERMANENTLY UNLOCKED": #358408872226660 Locked 353410577322690 Unlocked # cprint("Unlocked", 'green', attrs=['bold', 'dark']) # elif data['LockStatus'] == "LOCKED": # 358408872226660 Locked 353410577322690 Unlocked # cprint("Network Locked", 'red', attrs=['bold', 'dark']) # except KeyError: # pass try: blockdata = data['BlackListed'] #350962379559567 blacklisted blockdata2 = data['Message'] if data['BlackListed'] == True: #cprint("Blacklisted", 'red', attrs=['bold', 'dark']) #print(data['Message']) return jsonify('{}'.format(imei3), 'Status: ' 'Blacklisted', blockdata2) else: cprint("Clean", 'green', attrs=['bold']) return jsonify('{}'.format(imei3), 'Status: ' 'Clean') except KeyError: pass ############### @app.route('/v1/api/lockappcheck/', methods=['POST', 'GET']) ##retail check api **WORKING ON THIS ONE WIP def send(imei4): #imei4 = request.form['variable1'] # try: # numbers = [int(i) for i in imei4] # if len(numbers) == 15: # numbers = numbers[:15] # # else: # print('Invalid entry!') # return('Invalid entry!') # sys_exit() # except ValueError: # print('Invalid entry! Not Numbers!') # return('INVALID IMEI OR NOT 15 DIGITS!') # sys_exit() url = "https://api.mymobileaccount.com/phone/byod/lifeline/validate" payload = '{{"serial": "{}"}}'.format(imei4) headers = { 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7', 'Authorization': 'Bearer null', 'Connection': 'keep-alive', 'Content-Type': 'application/json; charset=UTF-8', 'DNT': '1', 'Origin': 'https://qlinkwireless.com', 'Referer': 'https://qlinkwireless.com/byop.aspx', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'cross-site', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', 'sec-ch-ua': '".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"' } response5 = requests.request("POST", url, headers=headers, data=payload) data = (response5.json()) # correct one try: makedata = data['Manufacturer'] marketdata = data['MarketingName'] modeldata = data['Model'] lockdata = data['LockStatus'] isgsmdata = data['IsGSM'] #gsm esimdata = data['eSIMCompatible'] #esim blackdata = data['BlackListed'] messdata = data['Message'] mylist = [{'Manufacturer': makedata, 'Retail Item': marketdata, 'Model': modeldata, 'GSM': isgsmdata, 'eSIM': esimdata, 'ESN Status': blackdata, 'name': messdata, 'Lock Status': lockdata} ] mylist2 = [{'Manufacturer': makedata, 'Retail Item': marketdata, 'Model': modeldata, 'GSM': isgsmdata, 'eSIM': esimdata, 'ESN Status': blackdata, 'name': messdata, 'Lock Status': lockdata} ] # elif data['LockStatus'] == "LOCKED": # 358408872226660 Locked 353410577322690 Unlocked # cprint("Network Locked", 'red', attrs=['bold', 'dark']) print(mylist) return jsonify(*mylist) except KeyError: pass # try: # marketdata = data['MarketingName'] # print('Model: {} '.format(colored(marketdata, 'cyan', attrs=['bold']))) # return jsonify(marketdata) # except KeyError: # pass # try: # modeldata = data['Model'] # print('IMEI: {} '.format(colored(modeldata, 'white', attrs=['bold', 'dark']))) # return jsonify(modeldata) # except KeyError: # pass # # try: # unlockdata = data['LockStatus'] # if data['LockStatus'] == "PERMANENTLY UNLOCKED": #358408872226660 Locked 353410577322690 Unlocked # cprint("Unlocked", 'green', attrs=['bold', 'dark']) # return jsonify(unlockdata) # # elif data['LockStatus'] == "LOCKED": # 358408872226660 Locked 353410577322690 Unlocked # cprint("Network Locked", 'red', attrs=['bold', 'dark']) # return jsonify(unlockdata) # except KeyError: # pass # try: # blockdata = data['BlackListed'] #350962379559567 blacklisted # blockdata2 = data['Message'] # if data['BlackListed'] == True: # #cprint("Blacklisted", 'red', attrs=['bold', 'dark']) # #print(data['Message']) # return jsonify('{}'.format(imei3), 'Status: ' 'Blacklisted', blockdata2) # else: # cprint("Clean", 'green', attrs=['bold']) # return jsonify('{}'.format(imei3), 'Status: ' 'Clean') # except KeyError: # pass ############### @app.route('/', methods=['POST', 'GET']) ##TESTGROUND WIP @limiter.limit("1/second;15 per minute;400 per day") # page refreshes per day def send444(): n = random.randint(1, 3) q.put(n) time.sleep(n) #return ('critical error %s\n xF4E0905') IMEI_input = request.form['variable3'] try: numbers = [int(i) for i in IMEI_input] if len(numbers) == 15: numbers = numbers[:15] else: print('Invalid entry!') return('Invalid entry!') sys_exit() except ValueError: print('Invalid entry! Not Numbers!') return('Invalid entry! Not Numbers!') sys_exit() # number_length = len(IMEI_input) # try: # assert number_length == 15 # except AssertionError: # print("Invalid entry") # return("Invalid entry") # sys_exit() # except ValueError: # print("Invalid entry!") # return("Invalid entry") # sys_exit() #IMEI_input = request.form['variable1'] url = "https://api.mymobileaccount.com/phone/byod/lifeline/validate" payload = '{{"serial": "{}"}}'.format(IMEI_input) headers = { 'Accept': 'application/json, text/javascript, */*; q=0.01', 'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7', 'Authorization': 'Bearer null', 'Connection': 'keep-alive', 'Content-Type': 'application/json; charset=UTF-8', 'DNT': '1', 'Origin': 'https://qlinkwireless.com', 'Referer': 'https://qlinkwireless.com/byop.aspx', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'cross-site', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36', 'sec-ch-ua': '".Not/A)Brand";v="99", "Google Chrome";v="103", "Chromium";v="103"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"' } response5 = requests.request("POST", url, headers=headers, data=payload) data = (response5.json()) # correct one try: makedata = data['Manufacturer'] marketdata = data['MarketingName'] modeldata = data['Model'] lockdata = data['LockStatus'] isgsmdata = data['IsGSM'] #gsm esimdata = data['eSIMCompatible'] #esim blackdata = data['BlackListed'] messdata = data['Message'] mylist = [ {'results': [ {'IMEI': IMEI_input}, {'Manufacturer': makedata, 'Retail Item': marketdata, 'Model': modeldata, 'GSM': isgsmdata, 'eSIM': esimdata, 'ESN Status': blackdata, 'Block Reason': messdata, 'Lock Status': lockdata} ]}] print (IMEI_input, makedata, marketdata, modeldata, lockdata, blackdata, messdata) return jsonify(IMEI_input, makedata, marketdata, modeldata, lockdata, blackdata, messdata) except KeyError: pass # response1 = requests.request("POST", url, headers=headers, data=payload) # # try: # # Finding a pattern(certain text) # pattern = 'Your phone has already been unlocked.' # # soup1 = BeautifulSoup(response1.content, 'html.parser') # # if soup1.find_all('h1', text=pattern): # cprint('{} Unlocked 1'.format(IMEI_input), 'green', attrs=['bold', 'dark']) # # return ('{} Unlocked'.format(IMEI_input)) # else: # pass # except IndexError: # pass # except TypeError: # pass # except KeyError: # pass # except requests.exceptions.ConnectionError: # return ('connection timeout request') # # try: # # Finding a pattern(certain text) # pattern2 = 'Apple is still processing your request.' # # soup = BeautifulSoup(response1.content, 'html.parser') # # if soup.find_all('h1', text=pattern2): # cprint('{} Unlocked 2'.format(IMEI_input), 'green', attrs=['bold', 'dark']) # return ('{} Unlocked'.format(IMEI_input)) # else: # pass # except IndexError: # pass # except TypeError: # pass # except KeyError: # pass # # ############################################################# Network Locked # try: # # Finding a pattern(certain text) # pattern3 = "Oops! We're unable to unlock your phone." # # soup = BeautifulSoup(response1.content, 'html.parser') # # if soup.find_all('h1', text=pattern3): # cprint('{} Network Locked 1'.format(IMEI_input), 'red', attrs=['bold', 'dark']) # return ('{} Network Locked'.format(IMEI_input)) # else: # pass # except IndexError: # pass # except TypeError: # pass # except KeyError: # pass # # try: ##new add invalid response for iphone 353803082639501 357284098928038 # # Finding a pattern(certain text) # patternerror = "An error has occurred." # # soup = BeautifulSoup(response1.content, 'html.parser') # # # if soup.find('offerTitle', text = patterncus): # if soup.findAll("div", {"class": "page-header"}): # cprint('{} RETRY TIMED OUT'.format(IMEI_input), 'red', attrs=['bold', 'dark']) # return ('{} Network Locked RETRY'.format(IMEI_input)) # else: # # results = soup.find("div", {"class": "test"}) # pass # except IndexError: # print error on this to troubleshoot # pass # except KeyError: # pass # except TypeError: # pass # # ############################################################## Non-Apple # try: # # Finding a pattern(certain text) # pattern4 = "header__locale" # # soup = BeautifulSoup(response1.content, 'html.parser') # # # if soup.find('offerTitle', text = patterncus): # if soup.find_all("div", {"class": pattern4}): # cprint('{} Not iPhone 1'.format(IMEI_input), 'grey', attrs=['bold', 'dark']) # return ('{} Not iPhone'.format(IMEI_input)) # else: # # results = soup.find("div", {"class": "test"}) # pass # except IndexError: # print error on this to troubleshoot # pass # except KeyError: # pass # except TypeError: # pass # # try: # # Finding a pattern(certain text) # pattern5 = "Oops! We’re unable to unlock this phone." # # soup = BeautifulSoup(response1.content, 'html.parser') # # if soup.find_all('h1', text=pattern5): # cprint('{} Not iPhone 2'.format(IMEI_input), 'black', attrs=['bold', 'dark']) # return ('{} Not iPhone'.format(IMEI_input)) # else: # # results = soup.find("div", {"class": "test"}) # pass # except IndexError: # print error on this to troubleshoot # pass # except KeyError: # pass # except TypeError: # pass # # try: # # Finding a pattern(certain text) # patternUC = "panel unlock-code" # # soup = BeautifulSoup(response1.content, 'html.parser') # label = soup.find("div", {"class": "panel unlock-code"}) # # if soup.find_all("div", {"class": patternUC}): # if soup.find("div", {"class": patternUC}): # # data = label.next_sibling.next_sibling.text # print(IMEI_input, "Code:", remove_html_markup(label.text.replace('\n', ""))) # return ('{} Not iPhone'.format(IMEI_input)) # else: # # results = soup.find("div", {"class": "test"}) # return ('{} Not iPhone'.format(IMEI_input)) # except IndexError: # print error on this to troubleshoot # pass # except KeyError: # pass # except TypeError: # pass def worker(): while True: item = q.get() if item is None: break print('Processing %s' % item) # do the work e.g. update database time.sleep(1) q.task_done() #### @app.route('/closed', methods=['POST', 'GET']) ##for html staff page #ORIGINAL @limiter.limit("1/second;15 per minute;400 per day") # page refreshes per day def send2(): n = random.randint(1, 2) q.put(n) time.sleep(n) #return ('critical error %s\n xF4E0905') IMEI_input = request.form['variable1'] try: numbers = [int(i) for i in IMEI_input] if len(numbers) == 15: numbers = numbers[:15] else: print('Invalid entry!') return('Invalid entry!') sys_exit() except ValueError: print('Invalid entry! Not Numbers!') return('Invalid entry! Not Numbers!') sys_exit() # number_length = len(IMEI_input) # try: # assert number_length == 15 # except AssertionError: # print("Invalid entry") # return("Invalid entry") # sys_exit() # except ValueError: # print("Invalid entry!") # return("Invalid entry") # sys_exit() #IMEI_input = request.form['variable1'] url = "https://www.koodomobile.com/my-account/device/unlock/validate?ban=AqZuij_lrjJ9pumoIkX57g&sub=mfWHlOGMrFLY_hAs-Wgdyg" payload = { 'csrf1': '504d3f1770a93b95a5ab36e98718ccab', 'new_device': 'new', 'imei': (IMEI_input), # locked 356554108082393 unlocked 355344089059268 'unlockReason': 'Will use for travel' } headers = { 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', #'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"', 'sec-ch-ua-mobile': '?0', 'Origin': 'https://www.koodomobile.com', 'Upgrade-Insecure-Requests': '1', 'DNT': '1', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36', 'Accept': 'application/json', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-User': '?1', 'Sec-Fetch-Dest': 'document', 'Referer': 'https://www.koodomobile.com/my-account/device/unlock?ban=AqZuij_lrjJ9pumoIkX57g&sub=mfWHlOGMrFLY_hAs-Wgdyg&INTCMP=KMNew_Lnk_DeviceUnlock', 'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7', 'Cookie': 'lang=en; prov=BC; pf_sessionid=7d43e121-2588-4c43-99a5-68b573704acf; uss_session=a0735177e6a427137b2d8f9832998496; uss_csrf2=504d3f1770a93b95a5ab36e98718ccab', 'Authorization': 'Bearer eyJraWQiOiI0NDY3MzUxNy04MTc4LTJjYTMtOWU3MC1mZTZiYjg4YjU2OTIiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJqWWZQdWNkYURmMjRVYkdLNkJ1NkFZN1N4VW5OY2I3SiIsInJ0Ijoie1wic2VnbWVudGF0aW9uSWRcIjpcIlBPTEFSSVNcIn0iLCJkZWFsZXJDb2RlIjoiIiwiaXNzIjoiaHR0cHM6XC9cL2FwaS50LW1vYmlsZS5jb21cL29hdXRoMlwvdjYiLCJtYXN0ZXJEZWFsZXJDb2RlIjoiIiwiYXV0aFRpbWUiOiIxNjMxMzEyODEzMjM2Iiwic3RvcmVJZCI6IiIsInVzbiI6ImFjZjMzNzRjLTk3NzctYjBlMC01N2NlLTYyMThhMGNlZTY4MyIsImF1ZCI6ImpZZlB1Y2RhRGYyNFViR0s2QnU2QVk3U3hVbk5jYjdKIiwic2VuZGVySWQiOiIiLCJuYmYiOjE2MzEzMTI4MTMsInNjb3BlIjoiIiwiYXBwbGljYXRpb25JZCI6IiIsImV4cCI6MTYzMTkxNzYxMywiaWF0IjoxNjMxMzEyODEzLCJjaGFubmVsSWQiOiIiLCJqdGkiOiIwOTc4ZGI1NC1jMzljLTYyYzUtODczYi04NTk1N2MyMGIzMmYifQ.aa5PEcjkfb9RQ6bMEo1C1r2NiqCzxKNZ5DwUYdJeD5pA9cH3akpVv12guLFWIa2-FPnfCjOfJIDf-x4XayyJ-OShxt_CXXEflHNMgCrLlg4TQn3fovNWm6BkmM-sp8vPdpeK4Vema57ru5YJiLVq41Sd3CcPhscLAswxQngjSB9sEvKOql_OyYa6gKBWGLFZOqC6-67O91sJlqWirYDc7nlNoGkTuv8faognk1sDfY7QJHn3aWhcwDR3gSRHvAX79GzbRcDzYojOk7D3jVDtWJjG-Zj5Q4fKKbo2heUxbw2N7J8qK0wzmS_c_N-mbsQNJCGU7SMwtgg8ak75naE7SA' } response1 = requests.request("POST", url, headers=headers, data=payload) def remove_html_markup(s): tag = False quote = False out = "" for c in s: if c == '<' and not quote: tag = True elif c == '>' and not quote: tag = False elif (c == '"' or c == "'") and tag: quote = not quote elif not tag: out = out + c return out ############################################################## Unlocked try: # Finding a pattern(certain text) pattern = 'Your phone has already been unlocked.' soup1 = BeautifulSoup(response1.content, 'html.parser') if soup1.find_all('h1', text=pattern): cprint('{} Unlocked 1'.format(IMEI_input), 'green', attrs=['bold', 'dark']) return ('{} Unlocked'.format(IMEI_input)) else: pass except IndexError: pass except TypeError: pass except KeyError: pass except requests.exceptions.ConnectionError: return ('connection timeout request') try: # Finding a pattern(certain text) pattern2 = 'Apple is still processing your request.' soup = BeautifulSoup(response1.content, 'html.parser') if soup.find_all('h1', text=pattern2): cprint('{} Unlocked 2'.format(IMEI_input), 'green', attrs=['bold', 'dark']) return ('{} Unlocked'.format(IMEI_input)) else: pass except IndexError: pass except TypeError: pass except KeyError: pass ############################################################# Network Locked try: # Finding a pattern(certain text) pattern3 = "Oops! We're unable to unlock your phone." soup = BeautifulSoup(response1.content, 'html.parser') if soup.find_all('h1', text=pattern3): cprint('{} Network Locked 1'.format(IMEI_input), 'red', attrs=['bold', 'dark']) return ('{} Network Locked'.format(IMEI_input)) else: pass except IndexError: pass except TypeError: pass except KeyError: pass try: ##new add invalid response for iphone 353803082639501 357284098928038 # Finding a pattern(certain text) patternerror = "An error has occurred." soup = BeautifulSoup(response1.content, 'html.parser') # if soup.find('offerTitle', text = patterncus): if soup.findAll("div", {"class": "page-header"}): cprint('{} RETRY TIMED OUT'.format(IMEI_input), 'red', attrs=['bold', 'dark']) return ('{} Network Locked RETRY'.format(IMEI_input)) else: # results = soup.find("div", {"class": "test"}) pass except IndexError: # print error on this to troubleshoot pass except KeyError: pass except TypeError: pass ############################################################## Non-Apple try: # Finding a pattern(certain text) pattern4 = "header__locale" soup = BeautifulSoup(response1.content, 'html.parser') # if soup.find('offerTitle', text = patterncus): if soup.find_all("div", {"class": pattern4}): cprint('{} Not iPhone 1'.format(IMEI_input), 'grey', attrs=['bold', 'dark']) return ('{} Not iPhone'.format(IMEI_input)) else: # results = soup.find("div", {"class": "test"}) pass except IndexError: # print error on this to troubleshoot pass except KeyError: pass except TypeError: pass try: # Finding a pattern(certain text) pattern5 = "Oops! We’re unable to unlock this phone." soup = BeautifulSoup(response1.content, 'html.parser') if soup.find_all('h1', text=pattern5): cprint('{} Not iPhone 2'.format(IMEI_input), 'black', attrs=['bold', 'dark']) return ('{} Not iPhone'.format(IMEI_input)) else: # results = soup.find("div", {"class": "test"}) pass except IndexError: # print error on this to troubleshoot pass except KeyError: pass except TypeError: pass try: # Finding a pattern(certain text) patternUC = "panel unlock-code" soup = BeautifulSoup(response1.content, 'html.parser') label = soup.find("div", {"class": "panel unlock-code"}) # if soup.find_all("div", {"class": patternUC}): if soup.find("div", {"class": patternUC}): # data = label.next_sibling.next_sibling.text print(IMEI_input, "Code:", remove_html_markup(label.text.replace('\n', ""))) return ('{} Not iPhone'.format(IMEI_input)) else: # results = soup.find("div", {"class": "test"}) return ('{} Not iPhone'.format(IMEI_input)) except IndexError: # print error on this to troubleshoot pass except KeyError: pass except TypeError: pass def worker(): while True: item = q.get() if item is None: break print('Processing %s' % item) # do the work e.g. update database time.sleep(1) q.task_done() #### @app.route('/devwip', methods=['POST', 'GET']) ##for html staff page @limiter.limit("1/second;15 per minute;400 per day") # page refreshes per day def send4(): n = random.randint(1, 4) q.put(n) time.sleep(n) #return ('critical error %s\n xF4E0905') IMEI_input = request.form['variable1'] try: numbers = [int(i) for i in IMEI_input] if len(numbers) == 15: numbers = numbers[:15] else: print('Invalid entry!') return('Invalid entry!') sys_exit() except ValueError: print('Invalid entry! Not Numbers!') return('Invalid entry! Not Numbers!') sys_exit() # number_length = len(IMEI_input) # try: # assert number_length == 15 # except AssertionError: # print("Invalid entry") # return("Invalid entry") # sys_exit() # except ValueError: # print("Invalid entry!") # return("Invalid entry") # sys_exit() #IMEI_input = request.form['variable1'] url = "https://www.koodomobile.com/my-account/device/unlock/validate?ban=AqZuij_lrjJ9pumoIkX57g&sub=mfWHlOGMrFLY_hAs-Wgdyg" payload = { 'csrf1': 'd781a3a88090b628d38e91a9d1822e06', 'new_device': 'new', 'imei': (IMEI_input), # locked 356554108082393 unlocked 355344089059268 'unlockReason': 'Will use for travel' } headers = { 'Connection': 'keep-alive', 'Pragma': 'no-cache', 'Cache-Control': 'no-cache', #'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="101", "Google Chrome";v="101"', 'sec-ch-ua-mobile': '?0', 'Origin': 'https://www.koodomobile.com', 'Upgrade-Insecure-Requests': '1', 'DNT': '1', 'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36', 'Accept': 'application/json', 'Sec-Fetch-Site': 'same-origin', 'Sec-Fetch-Mode': 'navigate', 'Sec-Fetch-User': '?1', 'Sec-Fetch-Dest': 'document', 'Referer': 'https://www.koodomobile.com/my-account/device/unlock?ban=AqZuij_lrjJ9pumoIkX57g&sub=mfWHlOGMrFLY_hAs-Wgdyg&INTCMP=KMNew_Lnk_DeviceUnlock', 'Accept-Language': 'en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7', 'Cookie': 'lang=en; prov=BC; pf_sessionid=654a4260-d6ac-4efc-a730-99814398e0b1; uss_session=f511f01b4c17d81cb825508cfe28f1be; uss_csrf2=d781a3a88090b628d38e91a9d1822e06', 'Authorization': 'Bearer eyJraWQiOiI0NDY3MzUxNy04MTc4LTJjYTMtOWU3MC1mZTZiYjg4YjU2OTIiLCJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJqWWZQdWNkYURmMjRVYkdLNkJ1NkFZN1N4VW5OY2I3SiIsInJ0Ijoie1wic2VnbWVudGF0aW9uSWRcIjpcIlBPTEFSSVNcIn0iLCJkZWFsZXJDb2RlIjoiIiwiaXNzIjoiaHR0cHM6XC9cL2FwaS50LW1vYmlsZS5jb21cL29hdXRoMlwvdjYiLCJtYXN0ZXJEZWFsZXJDb2RlIjoiIiwiYXV0aFRpbWUiOiIxNjMxMzEyODEzMjM2Iiwic3RvcmVJZCI6IiIsInVzbiI6ImFjZjMzNzRjLTk3NzctYjBlMC01N2NlLTYyMThhMGNlZTY4MyIsImF1ZCI6ImpZZlB1Y2RhRGYyNFViR0s2QnU2QVk3U3hVbk5jYjdKIiwic2VuZGVySWQiOiIiLCJuYmYiOjE2MzEzMTI4MTMsInNjb3BlIjoiIiwiYXBwbGljYXRpb25JZCI6IiIsImV4cCI6MTYzMTkxNzYxMywiaWF0IjoxNjMxMzEyODEzLCJjaGFubmVsSWQiOiIiLCJqdGkiOiIwOTc4ZGI1NC1jMzljLTYyYzUtODczYi04NTk1N2MyMGIzMmYifQ.aa5PEcjkfb9RQ6bMEo1C1r2NiqCzxKNZ5DwUYdJeD5pA9cH3akpVv12guLFWIa2-FPnfCjOfJIDf-x4XayyJ-OShxt_CXXEflHNMgCrLlg4TQn3fovNWm6BkmM-sp8vPdpeK4Vema57ru5YJiLVq41Sd3CcPhscLAswxQngjSB9sEvKOql_OyYa6gKBWGLFZOqC6-67O91sJlqWirYDc7nlNoGkTuv8faognk1sDfY7QJHn3aWhcwDR3gSRHvAX79GzbRcDzYojOk7D3jVDtWJjG-Zj5Q4fKKbo2heUxbw2N7J8qK0wzmS_c_N-mbsQNJCGU7SMwtgg8ak75naE7SA' } response1 = requests.request("POST", url, headers=headers, data=payload) def remove_html_markup(s): tag = False quote = False out = "" for c in s: if c == '<' and not quote: tag = True elif c == '>' and not quote: tag = False elif (c == '"' or c == "'") and tag: quote = not quote elif not tag: out = out + c return out ############################################################## Unlocked try: # Finding a pattern(certain text) pattern = 'Your phone has already been unlocked.' soup1 = BeautifulSoup(response1.content, 'html.parser') if soup1.find_all('h1', text=pattern): cprint('{} Unlocked 1'.format(IMEI_input), 'green', attrs=['bold', 'dark']) return ('{} Unlocked'.format(IMEI_input)) else: pass except IndexError: pass except TypeError: pass except KeyError: pass except requests.exceptions.ConnectionError: return ('connection timeout request') try: # Finding a pattern(certain text) pattern2 = 'Apple is still processing your request.' soup = BeautifulSoup(response1.content, 'html.parser') if soup.find_all('h1', text=pattern2): cprint('{} Unlocked 2'.format(IMEI_input), 'green', attrs=['bold', 'dark']) return ('{} Unlocked'.format(IMEI_input)) else: pass except IndexError: pass except TypeError: pass except KeyError: pass ############################################################# Network Locked try: # Finding a pattern(certain text) pattern3 = "Oops! We're unable to unlock your phone." soup = BeautifulSoup(response1.content, 'html.parser') if soup.find_all('h1', text=pattern3): cprint('{} Network Locked 1'.format(IMEI_input), 'red', attrs=['bold', 'dark']) return ('{} Network Locked'.format(IMEI_input)) else: pass except IndexError: pass except TypeError: pass except KeyError: pass try: ##new add invalid response for iphone 353803082639501 357284098928038 # Finding a pattern(certain text) patternerror = "An error has occurred." soup = BeautifulSoup(response1.content, 'html.parser') # if soup.find('offerTitle', text = patterncus): if soup.findAll("div", {"class": "page-header"}): cprint('{} RETRY TIMED OUT'.format(IMEI_input), 'red', attrs=['bold', 'dark']) return ('{} Network Locked RETRY'.format(IMEI_input)) else: # results = soup.find("div", {"class": "test"}) pass except IndexError: # print error on this to troubleshoot pass except KeyError: pass except TypeError: pass ############################################################## Non-Apple try: # Finding a pattern(certain text) pattern4 = "header__locale" soup = BeautifulSoup(response1.content, 'html.parser') # if soup.find('offerTitle', text = patterncus): if soup.find_all("div", {"class": pattern4}): cprint('{} Not iPhone 1'.format(IMEI_input), 'grey', attrs=['bold', 'dark']) return ('{} Not iPhone'.format(IMEI_input)) else: # results = soup.find("div", {"class": "test"}) pass except IndexError: # print error on this to troubleshoot pass except KeyError: pass except TypeError: pass try: # Finding a pattern(certain text) pattern5 = "Oops! We’re unable to unlock this phone." soup = BeautifulSoup(response1.content, 'html.parser') if soup.find_all('h1', text=pattern5): cprint('{} Not iPhone 2'.format(IMEI_input), 'black', attrs=['bold', 'dark']) return ('{} Not iPhone'.format(IMEI_input)) else: # results = soup.find("div", {"class": "test"}) pass except IndexError: # print error on this to troubleshoot pass except KeyError: pass except TypeError: pass try: # Finding a pattern(certain text) patternUC = "panel unlock-code" soup = BeautifulSoup(response1.content, 'html.parser') label = soup.find("div", {"class": "panel unlock-code"}) # if soup.find_all("div", {"class": patternUC}): if soup.find("div", {"class": patternUC}): # data = label.next_sibling.next_sibling.text print(IMEI_input, "Code:", remove_html_markup(label.text.replace('\n', ""))) return ('{} Not iPhone'.format(IMEI_input)) else: # results = soup.find("div", {"class": "test"}) return ('{} Not iPhone'.format(IMEI_input)) except IndexError: # print error on this to troubleshoot pass except KeyError: pass except TypeError: pass ######################################################################################################################## # needed else breaks @app.route('/') def index(): return 'index' def custom_print(message_to_print, log_file='output.txt'): print(message_to_print) with open(log_file, 'a') as of: of.write(message_to_print + '\n') if __name__ == '__main__': # logFormatStr = '%(asctime)s %(levelname)s - %(message)s' # logging.basicConfig(filename=path + '\logOne.log', format=logFormatStr, level=logging.DEBUG), logging.info('default message') q = Queue() t = Thread(target=worker) t.start() server = Server(app.wsgi_app) server.serve(port=80, host='0.0.0.0') #app.run(debug=True, host='0.0.0.0', port=80) q.join() q.put(None) t.join()