From 3fb33ccf6b8122267299d4323810062c8058f59f Mon Sep 17 00:00:00 2001 From: ahdoawhfo Date: Mon, 19 Aug 2024 14:00:28 +0800 Subject: [PATCH] =?UTF-8?q?ACTIONS=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/daily_domain_check.yml | 9 +- DICT | 728 +----------------------- DICTS | 676 ++++++++++++++++++++++ DOMAIN | 12 + domain_check.py | 4 +- single_domain_check.py | 141 +++++ 6 files changed, 861 insertions(+), 709 deletions(-) create mode 100644 DICTS create mode 100644 DOMAIN create mode 100644 single_domain_check.py diff --git a/.gitea/workflows/daily_domain_check.yml b/.gitea/workflows/daily_domain_check.yml index 63619d3..d2d327e 100644 --- a/.gitea/workflows/daily_domain_check.yml +++ b/.gitea/workflows/daily_domain_check.yml @@ -20,10 +20,8 @@ jobs: with: python-version: '3.12.5' - - name: Install dependencies - run: | - python -m pip install --upgrade pip - # Add any other dependencies your script needs here + - name: Run single domain check + run: python single_domain_check.py - name: Run domain check run: python domain_check.py @@ -32,10 +30,11 @@ jobs: run: | today=$(date +%Y-%m-%d) mv domain.txt "domain_$today.txt" + mv domains.txt "domains_$today.txt" - name: Create release and upload result run: | today=$(date +%Y-%m-%d) - gitea release create --title "Domain Check $today" --assets "domain_$today.txt" + gitea release create --title "Single Domain Check $today" --assets "domain_$today.txt" --assets "domains_$today.txt" env: TOKEN: ${{ secrets.TOKEN }} diff --git a/DICT b/DICT index 62e37e0..0edb856 100644 --- a/DICT +++ b/DICT @@ -1,702 +1,26 @@ -# a -# b -# c -# d -# e -# f -# g -# h -# i -# j -# k -# l -# m -# n -# o -# p -# q -# r -# s -# t -# u -# v -# w -# x -# y -# z -aa -ab -ac -ad -ae -af -ag -ah -ai -aj -ak -al -am -an -ao -ap -aq -ar -as -at -au -av -aw -ax -ay -az -ba -bb -bc -bd -be -bf -bg -bh -bi -bj -bk -bl -bm -bn -bo -bp -bq -br -bs -bt -bu -bv -bw -bx -by -bz -ca -cb -cc -cd -ce -cf -cg -ch -ci -cj -ck -cl -cm -cn -co -cp -cq -cr -cs -ct -cu -cv -cw -cx -cy -cz -da -db -dc -dd -de -df -dg -dh -di -dj -dk -dl -dm -dn -do -dp -dq -dr -ds -dt -du -dv -dw -dx -dy -dz -ea -eb -ec -ed -ee -ef -eg -eh -ei -ej -ek -el -em -en -eo -ep -eq -er -es -et -eu -ev -ew -ex -ey -ez -fa -fb -fc -fd -fe -ff -fg -fh -fi -fj -fk -fl -fm -fn -fo -fp -fq -fr -fs -ft -fu -fv -fw -fx -fy -fz -ga -gb -gc -gd -ge -gf -gg -gh -gi -gj -gk -gl -gm -gn -go -gp -gq -gr -gs -gt -gu -gv -gw -gx -gy -gz -ha -hb -hc -hd -he -hf -hg -hh -hi -hj -hk -hl -hm -hn -ho -hp -hq -hr -hs -ht -hu -hv -hw -hx -hy -hz -ia -ib -ic -id -ie -if -ig -ih -ii -ij -ik -il -im -in -io -ip -iq -ir -is -it -iu -iv -iw -ix -iy -iz -ja -jb -jc -jd -je -jf -jg -jh -ji -jj -jk -jl -jm -jn -jo -jp -jq -jr -js -jt -ju -jv -jw -jx -jy -jz -ka -kb -kc -kd -ke -kf -kg -kh -ki -kj -kk -kl -km -kn -ko -kp -kq -kr -ks -kt -ku -kv -kw -kx -ky -kz -la -lb -lc -ld -le -lf -lg -lh -li -lj -lk -ll -lm -ln -lo -lp -lq -lr -ls -lt -lu -lv -lw -lx -ly -lz -ma -mb -mc -md -me -mf -mg -mh -mi -mj -mk -ml -mm -mn -mo -mp -mq -mr -ms -mt -mu -mv -mw -mx -my -mz -na -nb -nc -nd -ne -nf -ng -nh -ni -nj -nk -nl -nm -nn -no -np -nq -nr -ns -nt -nu -nv -nw -nx -ny -nz -oa -ob -oc -od -oe -of -og -oh -oi -oj -ok -ol -om -on -oo -op -oq -or -os -ot -ou -ov -ow -ox -oy -oz -pa -pb -pc -pd -pe -pf -pg -ph -pi -pj -pk -pl -pm -pn -po -pp -pq -pr -ps -pt -pu -pv -pw -px -py -pz -qa -qb -qc -qd -qe -qf -qg -qh -qi -qj -qk -ql -qm -qn -qo -qp -qq -qr -qs -qt -qu -qv -qw -qx -qy -qz -ra -rb -rc -rd -re -rf -rg -rh -ri -rj -rk -rl -rm -rn -ro -rp -rq -rr -rs -rt -ru -rv -rw -rx -ry -rz -sa -sb -sc -sd -se -sf -sg -sh -si -sj -sk -sl -sm -sn -so -sp -sq -sr -ss -st -su -sv -sw -sx -sy -sz -ta -tb -tc -td -te -tf -tg -th -ti -tj -tk -tl -tm -tn -to -tp -tq -tr -ts -tt -tu -tv -tw -tx -ty -tz -ua -ub -uc -ud -ue -uf -ug -uh -ui -uj -uk -ul -um -un -uo -up -uq -ur -us -ut -uu -uv -uw -ux -uy -uz -va -vb -vc -vd -ve -vf -vg -vh -vi -vj -vk -vl -vm -vn -vo -vp -vq -vr -vs -vt -vu -vv -vw -vx -vy -vz -wa -wb -wc -wd -we -wf -wg -wh -wi -wj -wk -wl -wm -wn -wo -wp -wq -wr -ws -wt -wu -wv -ww -wx -wy -wz -xa -xb -xc -xd -xe -xf -xg -xh -xi -xj -xk -xl -xm -xn -xo -xp -xq -xr -xs -xt -xu -xv -xw -xx -xy -xz -ya -yb -yc -yd -ye -yf -yg -yh -yi -yj -yk -yl -ym -yn -yo -yp -yq -yr -ys -yt -yu -yv -yw -yx -yy -yz -za -zb -zc -zd -ze -zf -zg -zh -zi -zj -zk -zl -zm -zn -zo -zp -zq -zr -zs -zt -zu -zv -zw -zx -zy -zz \ No newline at end of file +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +p +q +r +s +t +u +v +w +x +y +z diff --git a/DICTS b/DICTS new file mode 100644 index 0000000..eb22e51 --- /dev/null +++ b/DICTS @@ -0,0 +1,676 @@ +aa +ab +ac +ad +ae +af +ag +ah +ai +aj +ak +al +am +an +ao +ap +aq +ar +as +at +au +av +aw +ax +ay +az +ba +bb +bc +bd +be +bf +bg +bh +bi +bj +bk +bl +bm +bn +bo +bp +bq +br +bs +bt +bu +bv +bw +bx +by +bz +ca +cb +cc +cd +ce +cf +cg +ch +ci +cj +ck +cl +cm +cn +co +cp +cq +cr +cs +ct +cu +cv +cw +cx +cy +cz +da +db +dc +dd +de +df +dg +dh +di +dj +dk +dl +dm +dn +do +dp +dq +dr +ds +dt +du +dv +dw +dx +dy +dz +ea +eb +ec +ed +ee +ef +eg +eh +ei +ej +ek +el +em +en +eo +ep +eq +er +es +et +eu +ev +ew +ex +ey +ez +fa +fb +fc +fd +fe +ff +fg +fh +fi +fj +fk +fl +fm +fn +fo +fp +fq +fr +fs +ft +fu +fv +fw +fx +fy +fz +ga +gb +gc +gd +ge +gf +gg +gh +gi +gj +gk +gl +gm +gn +go +gp +gq +gr +gs +gt +gu +gv +gw +gx +gy +gz +ha +hb +hc +hd +he +hf +hg +hh +hi +hj +hk +hl +hm +hn +ho +hp +hq +hr +hs +ht +hu +hv +hw +hx +hy +hz +ia +ib +ic +id +ie +if +ig +ih +ii +ij +ik +il +im +in +io +ip +iq +ir +is +it +iu +iv +iw +ix +iy +iz +ja +jb +jc +jd +je +jf +jg +jh +ji +jj +jk +jl +jm +jn +jo +jp +jq +jr +js +jt +ju +jv +jw +jx +jy +jz +ka +kb +kc +kd +ke +kf +kg +kh +ki +kj +kk +kl +km +kn +ko +kp +kq +kr +ks +kt +ku +kv +kw +kx +ky +kz +la +lb +lc +ld +le +lf +lg +lh +li +lj +lk +ll +lm +ln +lo +lp +lq +lr +ls +lt +lu +lv +lw +lx +ly +lz +ma +mb +mc +md +me +mf +mg +mh +mi +mj +mk +ml +mm +mn +mo +mp +mq +mr +ms +mt +mu +mv +mw +mx +my +mz +na +nb +nc +nd +ne +nf +ng +nh +ni +nj +nk +nl +nm +nn +no +np +nq +nr +ns +nt +nu +nv +nw +nx +ny +nz +oa +ob +oc +od +oe +of +og +oh +oi +oj +ok +ol +om +on +oo +op +oq +or +os +ot +ou +ov +ow +ox +oy +oz +pa +pb +pc +pd +pe +pf +pg +ph +pi +pj +pk +pl +pm +pn +po +pp +pq +pr +ps +pt +pu +pv +pw +px +py +pz +qa +qb +qc +qd +qe +qf +qg +qh +qi +qj +qk +ql +qm +qn +qo +qp +qq +qr +qs +qt +qu +qv +qw +qx +qy +qz +ra +rb +rc +rd +re +rf +rg +rh +ri +rj +rk +rl +rm +rn +ro +rp +rq +rr +rs +rt +ru +rv +rw +rx +ry +rz +sa +sb +sc +sd +se +sf +sg +sh +si +sj +sk +sl +sm +sn +so +sp +sq +sr +ss +st +su +sv +sw +sx +sy +sz +ta +tb +tc +td +te +tf +tg +th +ti +tj +tk +tl +tm +tn +to +tp +tq +tr +ts +tt +tu +tv +tw +tx +ty +tz +ua +ub +uc +ud +ue +uf +ug +uh +ui +uj +uk +ul +um +un +uo +up +uq +ur +us +ut +uu +uv +uw +ux +uy +uz +va +vb +vc +vd +ve +vf +vg +vh +vi +vj +vk +vl +vm +vn +vo +vp +vq +vr +vs +vt +vu +vv +vw +vx +vy +vz +wa +wb +wc +wd +we +wf +wg +wh +wi +wj +wk +wl +wm +wn +wo +wp +wq +wr +ws +wt +wu +wv +ww +wx +wy +wz +xa +xb +xc +xd +xe +xf +xg +xh +xi +xj +xk +xl +xm +xn +xo +xp +xq +xr +xs +xt +xu +xv +xw +xx +xy +xz +ya +yb +yc +yd +ye +yf +yg +yh +yi +yj +yk +yl +ym +yn +yo +yp +yq +yr +ys +yt +yu +yv +yw +yx +yy +yz +za +zb +zc +zd +ze +zf +zg +zh +zi +zj +zk +zl +zm +zn +zo +zp +zq +zr +zs +zt +zu +zv +zw +zx +zy +zz \ No newline at end of file diff --git a/DOMAIN b/DOMAIN new file mode 100644 index 0000000..623e119 --- /dev/null +++ b/DOMAIN @@ -0,0 +1,12 @@ +am +im +at +cx +cz +de +gs +lc +lu +mk +nu +st \ No newline at end of file diff --git a/domain_check.py b/domain_check.py index ae4270c..0c88e36 100644 --- a/domain_check.py +++ b/domain_check.py @@ -99,13 +99,13 @@ def main(): # Automatically read the dictionary from the DICT file try: - with open("DICT", "r") as fp_dict: + with open("DICTS", "r") as fp_dict: dictionary = fp_dict.readlines() except FileNotFoundError: print("DICTIONARY FILE NOT FOUND!") sys.exit(3) - with open("domain.txt", "w") as fp_result: + with open("domains.txt", "w") as fp_result: fp_result.write( "AVAILABLE DOMAIN NAME LIST:\n" "---------------------------------\n" ) diff --git a/single_domain_check.py b/single_domain_check.py new file mode 100644 index 0000000..244423a --- /dev/null +++ b/single_domain_check.py @@ -0,0 +1,141 @@ +import os +import socket +import sys +import concurrent.futures +import time +import random + + +def domain_megabot(domain, no_match_pattern, whois_server): + retry_count = 0 + while True: + response = whois_query(whois_server, domain) + if response: + if no_match_pattern in response: + print(f"{domain} AVAILABLE FOR REGISTRATION!") + with open("domain.txt", "a") as f: + f.write(f"{domain}\n") + else: + print(f"{domain} NOT AVAILABLE.") + # Add random delay to avoid triggering rate limits + time.sleep(random.uniform(1, 5)) + break + else: + retry_count += 1 + sleep_time = min(60, 2**retry_count + random.uniform(0, 1)) + print(f"Retrying query for {domain} in {sleep_time:.2f} seconds...") + time.sleep(sleep_time) + + +def whois_query(server, query): + ip = hostname_to_ip(server) + if not ip: + print("FAILED TO RESOLVE HOSTNAME") + return "" + + try: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.settimeout(10) + s.connect((ip, 43)) + s.sendall(f"{query}\r\n".encode()) + response = b"" + while True: + data = s.recv(4096) + if not data: + break + response += data + return response.decode() + except socket.error as err: + print(f"Error during WHOIS query: {err}") + return None + + +def hostname_to_ip(hostname): + try: + return socket.gethostbyname(hostname) + except socket.error as err: + print(f"Error resolving hostname: {err}") + return None + + +def str_split(s, delimiter): + return s.split(delimiter) + + +def str_conn(s1, s2): + return f"{s1}{s2}" + + +def main(): + # Automatically read TLDs from the TLD_DATA file in the current directory + try: + with open("TLD_DATA", "r") as fp: + tld_data = fp.readlines() + except FileNotFoundError: + print("TLD DATABASE NOT FOUND!") + sys.exit(1) + + # Automatically read domain extensions (TLDs) from the DOMAINS file + try: + with open("DOMAIN", "r") as fp: + exts = [line.strip() for line in fp.readlines() if line.strip()] + except FileNotFoundError: + print("DOMAINS FILE NOT FOUND!") + sys.exit(1) + + # Load TLD information + tld_info = {} + for line in tld_data: + arr = str_split(line.strip(), "=") + if arr[0] in exts: + tld_info[arr[0]] = { + "whois_server": arr[1], + "no_match_pattern": arr[2], + } + + if not tld_info: + print("NO VALID TLDs FOUND IN DOMAINS FILE!") + sys.exit(2) + + # Automatically read the dictionary from the DICT file + try: + with open("DICT", "r") as fp_dict: + dictionary = fp_dict.readlines() + except FileNotFoundError: + print("DICTIONARY FILE NOT FOUND!") + sys.exit(3) + + with open("domain.txt", "w") as fp_result: + fp_result.write( + "AVAILABLE DOMAIN NAME LIST:\n" "---------------------------------\n" + ) + + # Prepare domain names to check + domains = [] + for line in dictionary: + domain_prefix = line.strip() + if domain_prefix: + for ext in exts: + domain = str_conn(str_conn(domain_prefix, "."), ext) + domains.append( + ( + domain, + tld_info[ext]["no_match_pattern"], + tld_info[ext]["whois_server"], + ) + ) + + # Use a thread pool to check multiple domains concurrently + with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor: + futures = [ + executor.submit(domain_megabot, domain, pattern, server) + for domain, pattern, server in domains + ] + for future in concurrent.futures.as_completed(futures): + future.result() # Handle any exceptions in threads + + print("TASK FINISHED! RESULTS SAVED TO domain.txt") + + +if __name__ == "__main__": + main()