├── run.bat ├── .gitattributes ├── requirements.txt ├── saved ├── database.db ├── accounts.txt └── tokens.txt ├── install.bat ├── .gitignore ├── LICENSE ├── modules ├── __version__.py ├── faker.py ├── username_creator.py ├── emailnator.py ├── mail_service.py └── console.py ├── README.md ├── data └── config.json └── creator.py /run.bat: -------------------------------------------------------------------------------- 1 | echo @off 2 | python creator.py 3 | PAUSE -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | httpx==0.23.0 2 | colorama==0.4.6 3 | pystyle==2.9 4 | cursor==1.3.5 -------------------------------------------------------------------------------- /saved/database.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Connor9994/Spotify-Account-Creator/HEAD/saved/database.db -------------------------------------------------------------------------------- /install.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | title Installing Modules... 3 | python -m pip install -r requirements.txt 4 | color b 5 | cls 6 | echo Downloaded All Modules! 7 | PAUSE -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | modules/__pycache__/console.cpython-311.pyc 2 | modules/__pycache__/console.cpython-312.pyc 3 | modules/__pycache__/emailnator.cpython-311.pyc 4 | modules/__pycache__/emailnator.cpython-312.pyc 5 | modules/__pycache__/faker.cpython-311.pyc 6 | modules/__pycache__/faker.cpython-312.pyc 7 | modules/__pycache__/mail_service.cpython-311.pyc 8 | modules/__pycache__/mail_service.cpython-312.pyc 9 | modules/__pycache__/username_creator.cpython-311.pyc 10 | modules/__pycache__/username_creator.cpython-312.pyc 11 | data/proxies_mine 12 | data/proxies.txt 13 | data/usernames.txt 14 | data/avatars/temp_image.png 15 | data/proxies.txt 16 | data/usernames.txt 17 | creator.py 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2022 Deniz 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /modules/__version__.py: -------------------------------------------------------------------------------- 1 | # ▄████████ ▄████████ ▄████████ ▄████████ ▄▄▄▄███▄▄▄▄ ▄████████ ▄████████ ▄█ █▄ 2 | # ███ ███ ███ ███ ███ ███ ███ ███ ▄██▀▀▀███▀▀▀██▄ ███ ███ ███ ███ ███ ███ 3 | # ███ █▀ ███ █▀ ███ ███ ███ █▀ ███ ███ ███ ███ ███ ███ █▀ ███ ███ 4 | # ███ ▄███▄▄▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ▄███▄▄▄▄███▄▄ 5 | # ▀███████████ ▀▀███▀▀▀ ▀███████████ ▀███████████ ███ ███ ███ ▀███████████ ▀███████████ ▀▀███▀▀▀▀███▀ 6 | # ███ ███ █▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ 7 | # ▄█ ███ ███ ███ ███ ███ ▄█ ███ ███ ███ ███ ███ ███ ▄█ ███ ███ ███ 8 | # ▄████████▀ ██████████ ███ █▀ ▄████████▀ ▀█ ███ █▀ ███ █▀ ▄████████▀ ███ █▀ 9 | 10 | __title__ = "Spotify-Account-Creator" 11 | __description__ = "Spotify Account Creator + Follower Bot + Auto changing pfp (avatar)" 12 | __version__ = "2.0.2" 13 | __author__ = "seadhy" 14 | __license__ = "MIT" 15 | -------------------------------------------------------------------------------- /saved/accounts.txt: -------------------------------------------------------------------------------- 1 | Enihiled_24:4vxrl0xabvuk@fastsearcher.com:h0rvveKdBpci 2 | Yzeyujudyq:z1dof0bjtzjk@fastsearcher.com:2ryN6CtVfebV 3 | Ezetal45:cyqtta7e9owp@fastsearcher.com:uhqfU1V3AGiA 4 | Etuzon:e2di041p1407@fastsearcher.com:d51pcLsIW345 5 | Saber_Ebiwadug62:3pwesr9avulx@fastsearcher.com:2DOf2pbhfCzh 6 | Soulfly_Apysofyhil:g2m02lz26n15@fastsearcher.com:ydONhA2561jk 7 | BuckIxehyvux:ja.me.sc.kelley9.2.3@gmail.com:bdVD5P5XqPRR 8 | Apiyodev51:mageerauld+3efqf@gmail.com:0nRufot1Zo3r 9 | RabbiYladybalag:rea.nesca.eko.rd.i@gmail.com:S8tn6bq61n6G 10 | Ozumuxyqof:t0gn6ub8mbua@fastsearcher.com:VuSF74GGINYq 11 | Boss_Ihobuwyv_9:combtmp+czab4@gmail.com:wRtaeiGo4J6S 12 | JustWatch_Opihiw:j6uvtt9e9j7x@fastsearcher.com:KejuG58KqRpC 13 | TeddyAxobujyr36:gec7xkqmlpud@fastsearcher.com:nBtQ95B1bwSd 14 | Aguwisazup:hnqw3mon5ihw@fastsearcher.com:JWybr4zkwjkx 15 | AbbotYburys:jv9jqpv3punm@fastsearcher.com:snGlZPEl3VNq 16 | Yvazil:sr24asiubh2w@fastsearcher.com:ZKGLlGYieJ1p 17 | Arixod:v4x91uujbvln@fastsearcher.com:18hSEgcknftR 18 | MarineYyeqefib:u9cytunwmkep@fastsearcher.com:2sIEomJbSmKj 19 | Yyygapaw:5csvboxbexcx@fastsearcher.com:8rwSMZXI772j 20 | Yzanyqyc:cl.aire.patel.6.28@gmail.com:jIpj5K7exyoY 21 | TeddyIcadymur:n62rfx0wy7sv@fastsearcher.com:SdjwTpBnuV8M 22 | Ogacowoj:dkdnd3egyefm@fastsearcher.com:UgEu29nuIgKo 23 | JulietIsagatoc_5:o.liv.eagu.ilar4.1.2@gmail.com:5tE4H737AqaU 24 | Hawk_Imakuz_77:3cd0w6m5bxt0@fastsearcher.com:CtVOm2RZclmr 25 | Uriweq:ni.t.y.aa.nantha.raman.1.87@gmail.com:lboXIOPjaI38 26 | Hawk_Ozoqucyt:ni.na.apo.rt.ia.n@gmail.com:Nw4dl3PvNTjB 27 | PokerAcukenar64:ann.ieabe.r.nat.hy.4@gmail.com:7SQ6EH4zOwPa 28 | Oxibasipiv75:jhnbsomers+komm8@gmail.com:oS9T4XjtvR70 29 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Spotify Account Creator + Follower 2 | 3 | ![GitHub stars](https://img.shields.io/github/stars/Connor9994/Spotify-Account-Creator?style=social) ![GitHub forks](https://img.shields.io/github/forks/Connor9994/Spotify-Account-Creator?style=social) ![GitHub issues](https://img.shields.io/github/issues/Connor9994/Spotify-Account-Creator) 4 | 5 | Spotify Account Creator + Follow account or playlist with fully httpx request based. If an error occurs, please report it via [issues](https://github.com/seadhy/Spotify-Account-Creator/issues/new). 6 | 7 | ## 💻 Preview 8 | 9 | https://user-images.githubusercontent.com/82868382/210181254-28da72a7-52c9-4bb1-9614-734174d78262.mp4 10 | 11 | ## 👾 Features 12 | - Fully request based creator 13 | - Auto Mail verify 14 | - Auto Playlist or Profile or Artist follow 15 | - Auto change avatars (pfps) 16 | - Auto scrape username & pfps 17 | - Save accounts SQLite database or text file 18 | - HTTP&HTTPS proxy support 19 | - Multi-Threading support 20 | 21 | ## 🌟 Stars to Unlock 22 | 23 | - ✅ 25 Stars | Follow artist account 24 | 25 | - ✅ 50 Stars | Add more optional choices 26 | 27 | - ✅ 150 Stars | Verify mail 28 | 29 | - ✅ 250 Stars | Fixed all issue, added bypassing challenge 30 | 31 | 32 | ## ✍️ Usage 33 | 1. Run `install.bat` 34 | 35 | 2. Edit the `config.json` file 36 | 37 | 3. (Optional) Add proxy in `proxies.txt` file in ip:port or username:password@hostname:port format 38 | 39 | 4. Run `run.bat` 40 | 41 | ### Or 42 | 43 | 1. Click and watch the [video](https://streamable.com/v4ooti). 44 | 45 | 2. And do the same as in the video. 46 | 47 | ## ⚠️ DISCLAIMER 48 | This github repo is for EDUCATIONAL PURPOSES ONLY. I am NOT under any responsibility if a problem occurs. 49 | -------------------------------------------------------------------------------- /modules/faker.py: -------------------------------------------------------------------------------- 1 | import httpx 2 | from string import ascii_letters, digits, ascii_lowercase 3 | from random import choices, choice, randint 4 | from os import listdir 5 | from modules.username_creator import getUsername 6 | 7 | 8 | class Faker: 9 | def __init__(self) -> None: 10 | self.usernames = open('data/usernames.txt', 'r', encoding='utf-8').read().splitlines() 11 | self.avatars = listdir('data/avatars') 12 | 13 | def getPassword(self, len_pass: int) -> str: 14 | return "".join(choices(ascii_letters + digits, k=len_pass)) 15 | 16 | def getMail(self, len_email: int) -> str: 17 | return "".join(choices(ascii_lowercase + digits, k=len_email)) + choice(['@gmail.com', '@yahoo.com', '@outlook.com', '@hotmail.com', '@protonmail.com']) 18 | 19 | def getUsername(self, create_ai: str) -> str: 20 | if create_ai == 'n': return choice(self.usernames) 21 | return getUsername() 22 | 23 | def getAvatar(self, with_ai: str) -> bytes: 24 | if with_ai.lower() == 'y': 25 | api = 'https://picsum.photos/512/512' 26 | r = httpx.get(url=api) 27 | img_url = (r.headers['location']) 28 | 29 | response = httpx.get(url=img_url) 30 | 31 | if response.status_code == 200: 32 | with open('data/avatars/temp_image.png', 'wb') as f: 33 | f.write(response.content) 34 | with open('data/avatars/temp_image.png', 'rb') as f: 35 | return f.read() 36 | image = open('data/avatars/' + choice(self.avatars), 'rb').read() 37 | return image 38 | 39 | def getBirthday(self) -> str: 40 | day = str(randint(1, 28)) 41 | month = str(randint(1, 12)) 42 | 43 | if int(month) < 10: month = "0" + month 44 | if int(day) < 10: day = "0" + day 45 | 46 | birthday = "-".join([str(randint(1910, 2004)), month, day]) 47 | return birthday 48 | -------------------------------------------------------------------------------- /modules/username_creator.py: -------------------------------------------------------------------------------- 1 | # thank you github.com/6accOnThe6locc 2 | 3 | from random import randint, choice, choices 4 | 5 | 6 | def getUsername() -> str: 7 | nick = list() 8 | prefix = str() 9 | under_score = str() 10 | under_score2 = str() 11 | rnd_number = str() 12 | rnd_vowels = choices(('a', 'e', 'i', 'o', 'u', 'y'), k=randint(3, 5)) 13 | rnd_consonant = choices(('b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z'), k=randint(4, 6)) 14 | 15 | nick = [f"{x}{y}" for x, y in list(zip(rnd_vowels, rnd_consonant))] 16 | if choice((True, False)): 17 | if choice((True, False)): 18 | under_score = "_" 19 | 20 | prefix = choice(('Mr', 'Ms', 'Sir', 'Doctor', 'Lord', 'Lady', 'Rabbi', 'General', 'Captain', 'Glide', 'Deedee', 21 | 'Dazzle', 'Daydream', 'Micro', 'Lion', 'Punch', 'Hawk', 'Sandy', 'Hound', 'Rusty', 'Tigress', 22 | 'Commando', 'Abbot', 'Invincible', 'SepuLtura', 'Detective', 'Vanguard', 'Storm', 'Soulfly', 23 | 'Marine', 'Saber', 'Parachute', '4Justice', 'StrongHold', 'Thunder', 'Discoverer', 'Explorer', 24 | 'Cardinal', 'Winner', 'Bee', 'Coach', 'Munchkin', 'Teddy', 'Scout', ' Smarty', 'Dolly', 25 | 'Princess', 'Pumpkin', 'Sunshine', 'Tinkerbell', 'Bestie', 'Sugar', 'Juliet', 'Magician', 26 | 'Mule', 'Stretch', 'Missile', 'Alpha', 'Grace', 'Buck', 'King', 'Chief', 'Oldie', 'Poker', 27 | 'Bustier', 'Adonis', 'Squirt', 'Ace', 'Mortal', 'Speedy', 'Bug', 'Senior', 'Bear', 'Rifle', 28 | 'Insomnia', 'JustWatch', 'Thanatos', 'Creature', 'Miracle', 'SuperHero', 'WhoAmI', 'Handyman', 29 | 'TheTalent', 'Boss', 'Meow', 'Ms.Congeniality', 'Rapunzel', 'Dolly', 'Sunshine', 'Eirene', 30 | 'Drum')) 31 | 32 | if choice((True, False)): 33 | if choice((True, False)): 34 | under_score2 = "_" 35 | rnd_number = f'{under_score2}{randint(1, 99)}' 36 | 37 | nick = prefix + under_score + "".join(nick).capitalize() + rnd_number 38 | return nick 39 | -------------------------------------------------------------------------------- /modules/emailnator.py: -------------------------------------------------------------------------------- 1 | import httpx 2 | import re 3 | 4 | 5 | class Emailnator: 6 | def __init__(self): 7 | self.base_url = 'https://www.emailnator.com/' 8 | self.session = httpx.Client() 9 | 10 | self.session.headers = { 11 | 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 12 | 'Accept-Encoding': 'gzip, deflate', 13 | 'Accept-Language': 'en-US,en;q=0.5', 14 | 'Connection': 'keep-alive', 15 | 'Host': 'www.emailnator.com', 16 | 'Sec-Fetch-Dest': 'document', 17 | 'Sec-Fetch-Mode': 'navigate', 18 | 'Sec-Fetch-Site': 'none', 19 | 'Sec-Fetch-User': '?1', 20 | 'Upgrade-Insecure-Requests': '1', 21 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0' 22 | } 23 | 24 | self.session.get(self.base_url) 25 | 26 | del self.session.headers['Sec-Fetch-User'] 27 | del self.session.headers['Upgrade-Insecure-Requests'] 28 | 29 | self.session.headers['Accept'] = 'application/json, text/plain, */*' 30 | self.session.headers['Content-Type'] = 'application/json' 31 | self.session.headers['Origin'] = self.base_url.rstrip('/') 32 | self.session.headers['Referer'] = self.base_url 33 | self.session.headers['Sec-Fetch-Dest'] = 'empty' 34 | self.session.headers['Sec-Fetch-Mode'] = 'cors' 35 | self.session.headers['Sec-Fetch-Site'] = 'same-origin' 36 | self.session.headers['TE'] = 'trailers' 37 | self.session.headers['X-KL-kfa-Ajax-Request'] = 'Ajax_Request' 38 | self.session.headers['X-Requested-With'] = 'XMLHttpRequest' 39 | self.session.headers['X-XSRF-TOKEN'] = str(self.session.cookies['XSRF-TOKEN']).replace('%3D', '=') 40 | 41 | def generate_mail(self, mail_type: list = None): 42 | mail_json = {'email': ['dotGmail', 'plusGmail'] if mail_type is None else mail_type} 43 | mail = self.session.post(self.base_url + 'generate-email', json=mail_json).json()['email'][0] 44 | return mail 45 | 46 | def get_verification_link(self, mail: str): 47 | while True: 48 | response = self.session.post(self.base_url + 'message-list', json={'email': mail}) 49 | messges_id = response.json()['messageData'] 50 | total_messeges = len(messges_id) 51 | 52 | for i in range(total_messeges): 53 | if len(str(messges_id[i]['messageID'])) > 12: 54 | messges_id_base = messges_id[i]['messageID'] 55 | url_email = 'https://www.emailnator.com/message-list' 56 | 57 | payload = { 58 | 'email': mail, 59 | 'messageID': messges_id_base 60 | } 61 | 62 | message = self.session.post(url_email, json=payload) 63 | if "https://wl.spotify.com/" in message.text: 64 | pattern = re.compile(r'https?://wl\.spotify\.com/ls/click\?.*') 65 | verification_url = re.findall(pattern, message.text)[0].split('"')[0] 66 | return verification_url 67 | else: 68 | continue 69 | -------------------------------------------------------------------------------- /data/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "settings": { 3 | "Threads": 64, 4 | "Create_Username": "y", 5 | "Create_Avatar": "y", 6 | "Change_Avatar": "y", 7 | "Use_Proxy": "y", 8 | "Remove_Bad_Proxies": "n", 9 | "Debug_Mode": "n" 10 | }, 11 | 12 | "verification_settings": { 13 | "Verify_Mail": "y", 14 | "Services": { 15 | "Use_MailTM": "y", 16 | "Use_Emailnator": "y" 17 | } 18 | }, 19 | 20 | "target_settings": { 21 | "Use_Target": "n", 22 | "Target_To": 10 23 | }, 24 | 25 | "follow_ids": { 26 | "Account_IDs": ["account id1", "account id2", "account id 3 (u can put as many as you want)"], 27 | "Playlist_IDs": ["37i9dQZF1DX8uc99HoZBLU","37i9dQZF1DX4OzrY981I1W","37i9dQZF1DWWvvyNmW9V9a","37i9dQZF1DX4mWCZw6qYIw","37i9dQZF1DWTyiBJ6yEqeu","37i9dQZF1DXdwmD5Q7Gxah","37i9dQZF1DWYPhtvsbr1Fn","37i9dQZF1DX66m4icL86Ru","37i9dQZF1DX6MAQN3OnFEl","37i9dQZF1DWW1XLSH8Oafp","37i9dQZF1DX0h2LvJ7ZJ15","37i9dQZF1DXdl6IPOySdX4","37i9dQZF1DX3R7OWWGN4gH","37i9dQZF1DX0mWZXNs0ArA","37i9dQZF1DX4dyzvuaRJ0n","37i9dQZF1DX8tZsk68tuDw","37i9dQZF1DXa8NOEUWPn9W","37i9dQZF1DX91oIci4su1D","37i9dQZF1DX6VdMW310YC7","37i9dQZF1DX9gPDOAK0Yqv","37i9dQZF1DWVY4eLfA3XFQ","37i9dQZF1DXaXB8fQg7xif","37i9dQZF1DWSvfPiFfb8Mi","37i9dQZF1DXajwQAxzrT4Q","37i9dQZF1DXcZDD7cfEKhW","37i9dQZF1DXa1pcUVlBhYz","37i9dQZF1DX1OIMC8iDi74","37i9dQZF1DX3jWba5xiDhV","37i9dQZEVXbMDoHDwVN2tF","37i9dQZEVXbLRQDuF5jeBp","7i9dQZF1DXdwmD5Q7Gxah","7i9dQZF1DWWBHeXOYZf74","7i9dQZF1DX8Yh4s5ZlkHg","7i9dQZF1DX30HHrCAl4ZG","7i9dQZF1DXaPleDxjpDoo","7i9dQZF1DX1tuUiirhaT3","7i9dQZF1DX2DjEOgyULQF","7i9dQZF1DX4Oe8zprVH3z","7i9dQZF1DWSGaMpjluQpy","7i9dQZF1DX7NeseHaSkSz","7i9dQZF1DXbcPC6Vvqudd","7i9dQZF1DX8ymr6UES7vc","7i9dQZF1DX4aYNO8X5RpR","7i9dQZF1DWXKbJeFbii64","7i9dQZF1DWZqyWCBK6QTt","7i9dQZF1DWT69BWwm9goV","7i9dQZF1DWTUm9HjVUKnL","7i9dQZF1DXdFhiq9L31be","7i9dQZF1DWXMetQrUYhar","7i9dQZF1DXdXh4ecan7Hh","7i9dQZF1DWZMDiBV8toZi"], 28 | "Artist_IDs": ["2YZyLoL8N0Wb9xBt1NhZWg","22HH0b5ZPy0TwAbwUDhOfX","5KOGM68sGbRdgyDW8jUA7b","4ckwfFtT6fecO9hJAIGbdC","6nxWCVXbOlEVRexSbLsTer","5a2w2tgpLwv26BYJf2qYwu","2y246nnP9pQT0E6v3ZMMOO","1VPmR4DJC1PlOtd0IADAO0","7c0XG5cIJTrrAgEC3ULPiq","6nB0iY1cjSY1KyhYyuIIKH","5he5w2lnU9x7JFhnwcekXX","5K4W6rqBFWDnAN6FQUkS6x","6TQj5BFPooTa08A7pk8AQ1","4MsN3qOc4IOaUmmBOyiFxz","4iMO20EPodreIaEl8qW66y","68ousdyH7lBXYu9U7SX2ys","3YQKmKGau1PzlVlkL1iodx","5aRRt9zSKDEQdWghFvkiEi","6DIS6PRrLS3wbnZsf7vYic","20DZAfCuP1TKZl5KcY7z3Q","11gWrKZMBsGQWmobv3oNfW","4AA8eXtzqh5ykxtafLaPOi","2FmzVitXZjIkFolH8HXd4j","25fqWEebq6PoiGQIHIrdtv","5eIbEEQnDM8yuDVB0bimSP","76M2Ekj8bG8W7X2nbx2CpF","3NJ94iuAmmMjbszODYT6pO","67qogtRNI0GjUr8PlaG6Zh","1N9n8MSxrr4Emhb566493b","4YLQaW1UU3mrVetC8gNkg5","4uRYpUQZrNrY5t8tAv3XrD","5FWi1mowu6uiU2ZHwr1rby","5INjqkS1o8h1imAzPqGZBb","1bs7HoMkSyQwcobCpE9KpN","70cRZdQywnSFp9pnc2WTCE","74ASZWbe4lXaubB36ztrGX","4x1nvY2FN8jxqAFA0DA02H","6beUvFUlKliUYJdLOXNj9c","3WrFJ7ztbogyGnTHbHJFl2","163tK9Wjr9P9DmM0AVK7lm","2xe8IXgCTpwHE3eA9hTs4n","4NHQUGzhtTLFvgF5SZesLK","26VFTg2z8YR0cCuwLzESi2","63yrD80RY3RNEM2YDpUpO8","6qqNVTkY8uBg9cP3Jd7DAH","1anyVhU62p31KFi8MEzkbf","2h93pZq0e7k5yf4dywlkpM","73sIBHcqh3Z3NyqHKZ7FOL","3uwAm6vQy7kWPS2bciKWx9","66sBc6GNWSPnD1NrE46LGI","74KM79TiuVKeVCqs8QtB0B","2tIP7SsRs7vjIcLrU85W8J","5H4yInM5zmHqpKIoMNAx4r","5p9HO3XC5P3BLxJs5Mtrhm"] 29 | }, 30 | 31 | "follow_types": { 32 | "Profile": "n", 33 | "Playlist": "y", 34 | "Artist": "y" 35 | }, 36 | 37 | "save_methods": { 38 | "SQLite": "y", 39 | "Text_File": "y" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /modules/mail_service.py: -------------------------------------------------------------------------------- 1 | import httpx 2 | import json 3 | import re 4 | from time import sleep 5 | from random import choices 6 | from string import ascii_lowercase, digits, ascii_letters 7 | from modules.console import Console 8 | 9 | 10 | class Mail: 11 | def __init__(self) -> None: 12 | self.console = Console() 13 | 14 | self.generate_url = 'https://api.mail.tm/accounts' 15 | self.token_url = 'https://api.mail.tm/token' 16 | self.messages_url = 'https://api.mail.tm/messages' 17 | 18 | headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0', 'Accept': 'application/ld+json', 'Accept-Language': 'tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3', 'Accept-Encoding': 'gzip, deflate, br', 'Referer': 'https://api.mail.tm/domains', 'X-KL-saas-Ajax-Request': 'Ajax_Request', 'Connection': 'keep-alive', 'Sec-Fetch-Dest': 'empty', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Site': 'same-origin', 'If-None-Match': '5dea09b3c8649bf068660601a9ef0f1e', 'TE': 'trailers'} 19 | 20 | try: 21 | self.domain = httpx.get('https://api.mail.tm/domains?page=1', headers=headers, timeout=10).json()['hydra:member'][0]['domain'] 22 | except Exception: 23 | self.domain = 'exelica.com' 24 | 25 | def generateMail(self, proxies = None) -> tuple: 26 | while True: 27 | try: 28 | mail_text = ''.join(choices(ascii_lowercase + digits, k=12)) 29 | mail = f'{mail_text}@{self.domain}' 30 | password = mail_text 31 | 32 | headers = { 33 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0', 34 | 'Accept': 'application/json, text/plain, */*', 35 | 'Accept-Language': 'tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3', 36 | 'Accept-Encoding': 'gzip, deflate, br', 37 | 'Content-Type': 'application/json', 38 | 'Referer': 'https://mail.tm/', 39 | 'Origin': 'https://mail.tm', 40 | 'Sec-Fetch-Dest': 'empty', 41 | 'Sec-Fetch-Mode': 'cors', 42 | 'Sec-Fetch-Site': 'same-site', 43 | 'Connection': 'keep-alive', 44 | 'TE': 'trailers', 45 | } 46 | 47 | payload = { 48 | "address": mail, 49 | "password": password 50 | } 51 | 52 | r = httpx.post(url=self.generate_url, headers=headers, json=payload, proxies=proxies, timeout=30) 53 | if r.status_code == 201: 54 | try: 55 | auth_token = httpx.post(url=self.token_url, json=payload, proxies=proxies, timeout=30).json() 56 | 57 | return mail, password, auth_token['token'] 58 | except json.decoder.JSONDecodeError: 59 | sleep(3) 60 | continue 61 | elif r.status_code == 422: 62 | self.console.printe('Generation Error: already used mail address.') 63 | except Exception as e: 64 | self.console.printe('Generation Error: ' + str(e).capitalize() + '.') 65 | continue 66 | 67 | def getVerificationLink(self, token: str, proxies = None) -> str: 68 | while True: 69 | try: 70 | headers = { 71 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/110.0', 72 | 'Accept': 'application/json, text/plain, */*', 73 | 'Accept-Language': 'tr-TR,tr;q=0.8,en-US;q=0.5,en;q=0.3', 74 | 'Accept-Encoding': 'gzip, deflate, br', 75 | 'Referer': 'https://mail.tm/', 76 | 'Origin': 'https://mail.tm', 77 | 'Sec-Fetch-Dest': 'empty', 78 | 'Sec-Fetch-Mode': 'cors', 79 | 'Sec-Fetch-Site': 'same-site', 80 | 'Authorization': f"Bearer {token}", 81 | 'Connection': 'keep-alive', 82 | 'TE': 'trailers', 83 | } 84 | 85 | r = httpx.get('https://api.mail.tm/messages', headers=headers, proxies=proxies, timeout=30) 86 | 87 | if r.json()['hydra:totalItems'] > 0: 88 | r = httpx.get('https://api.mail.tm/messages/' + r.json()['hydra:member'][0]['id'], headers=headers) 89 | verification_link = re.search('https://wl.spotify.com/ls/click\?upn=.*', r.json()['text'])[0].rstrip(' )') 90 | 91 | return verification_link 92 | 93 | sleep(1) 94 | except IndexError: 95 | sleep(1) 96 | continue 97 | except json.decoder.JSONDecodeError: 98 | sleep(3) 99 | continue 100 | except Exception as e: 101 | self.console.printe('Verification Error: ' + str(e).capitalize() + '.') 102 | continue 103 | -------------------------------------------------------------------------------- /modules/console.py: -------------------------------------------------------------------------------- 1 | import threading 2 | from colorama import Fore 3 | from threading import Lock, active_count 4 | from time import sleep, perf_counter 5 | from datetime import datetime 6 | from pystyle import Center, Colors, Colorate 7 | import sys 8 | 9 | lock = Lock() 10 | 11 | if sys.platform.startswith('win'): 12 | from ctypes import windll 13 | 14 | 15 | class Console: 16 | created = 0 17 | 18 | @staticmethod 19 | def printsc(content: str): 20 | lock.acquire() 21 | print( 22 | f"{Fore.LIGHTBLACK_EX}[{Fore.LIGHTWHITE_EX}{datetime.strftime(datetime.now(), '%X').replace(':', f'{Fore.LIGHTBLACK_EX}:{Fore.LIGHTWHITE_EX}')}{Fore.LIGHTBLACK_EX}] {Fore.LIGHTBLACK_EX}[{Fore.LIGHTGREEN_EX}Account Created{Fore.LIGHTBLACK_EX}]{Fore.LIGHTWHITE_EX} > {content}") 23 | lock.release() 24 | 25 | @staticmethod 26 | def printe(content: str): 27 | lock.acquire() 28 | print( 29 | f"{Fore.LIGHTBLACK_EX}[{Fore.LIGHTWHITE_EX}{datetime.strftime(datetime.now(), '%X').replace(':', f'{Fore.LIGHTBLACK_EX}:{Fore.LIGHTWHITE_EX}')}{Fore.LIGHTBLACK_EX}] {Fore.LIGHTBLACK_EX}[{Fore.LIGHTRED_EX}Error Occurred{Fore.LIGHTBLACK_EX}]{Fore.LIGHTWHITE_EX} > {content}") 30 | lock.release() 31 | 32 | @staticmethod 33 | def printi(content: str): 34 | lock.acquire() 35 | print( 36 | f"{Fore.LIGHTBLACK_EX}[{Fore.LIGHTWHITE_EX}{datetime.strftime(datetime.now(), '%X').replace(':', f'{Fore.LIGHTBLACK_EX}:{Fore.LIGHTWHITE_EX}')}{Fore.LIGHTBLACK_EX}] {Fore.LIGHTBLACK_EX}[{Fore.LIGHTYELLOW_EX}Info{Fore.LIGHTBLACK_EX}]{Fore.LIGHTWHITE_EX} > {content}") 37 | lock.release() 38 | 39 | @staticmethod 40 | def printmf(content: str): 41 | lock.acquire() 42 | print( 43 | f"{Fore.LIGHTBLACK_EX}[{Fore.LIGHTWHITE_EX}{datetime.strftime(datetime.now(), '%X').replace(':', f'{Fore.LIGHTBLACK_EX}:{Fore.LIGHTWHITE_EX}')}{Fore.LIGHTBLACK_EX}] {Fore.LIGHTBLACK_EX}[{Fore.LIGHTBLUE_EX}Mail Verified{Fore.LIGHTBLACK_EX}]{Fore.LIGHTWHITE_EX} > {content}") 44 | lock.release() 45 | 46 | @staticmethod 47 | def printhc(content: str): 48 | lock.acquire() 49 | print( 50 | f"{Fore.LIGHTBLACK_EX}[{Fore.LIGHTWHITE_EX}{datetime.strftime(datetime.now(), '%X').replace(':', f'{Fore.LIGHTBLACK_EX}:{Fore.LIGHTWHITE_EX}')}{Fore.LIGHTBLACK_EX}] {Fore.LIGHTBLACK_EX}[{Fore.LIGHTMAGENTA_EX}Humanization Completed{Fore.LIGHTBLACK_EX}]{Fore.LIGHTWHITE_EX} > {content}") 51 | lock.release() 52 | 53 | @staticmethod 54 | def printtc(content: str): 55 | lock.acquire() 56 | print( 57 | f"{Fore.LIGHTBLACK_EX}[{Fore.LIGHTWHITE_EX}{datetime.strftime(datetime.now(), '%X').replace(':', f'{Fore.LIGHTBLACK_EX}:{Fore.LIGHTWHITE_EX}')}{Fore.LIGHTBLACK_EX}] {Fore.LIGHTBLACK_EX}[{Fore.LIGHTCYAN_EX}Thread Closed{Fore.LIGHTBLACK_EX}]{Fore.LIGHTWHITE_EX} > {content}") 58 | lock.release() 59 | 60 | 61 | class Tools: 62 | 63 | @staticmethod 64 | def set_terminal_title(title: str): 65 | if sys.platform.startswith('win'): 66 | windll.kernel32.SetConsoleTitleW(title) 67 | else: 68 | sys.stdout.write(f"\x1b]2;{title}\x07") 69 | sys.stdout.flush() 70 | 71 | @staticmethod 72 | def titleChanger(use_target: str, target_to: int): 73 | Tools.set_terminal_title('Initializing...') 74 | 75 | starting_time = perf_counter() 76 | while True: 77 | sleep(0.1) 78 | created_min = round(Console.created / ((perf_counter() - starting_time) / 60), 1) 79 | if use_target == 'y': 80 | remaining = target_to - Console.created 81 | if remaining > 0: 82 | Tools.set_terminal_title( 83 | f"Seasmash Spotify Creator | Threads: {active_count() - 2} | Created: {Console.created} | Speed: {created_min}/m | Remaining: {remaining} | Elapsed: {round(perf_counter() - starting_time, 1)}s | Made by github.com/seadhy") 84 | else: 85 | Tools.set_terminal_title( 86 | f"Seasmash Spotify Creator | Threads: {active_count() - 2} | Created: {Console.created} | Speed: {created_min}/m | Remaining: {remaining} | Elapsed: {round(perf_counter() - starting_time, 1)}s | Made by github.com/seadhy") 87 | sleep(5) 88 | Console.printtc( 89 | threading.current_thread().name + " is closed. The program will close itself in 3 seconds...") 90 | sleep(3) 91 | exit() 92 | else: 93 | Tools.set_terminal_title( 94 | f"Seasmash Spotify Creator | Threads: {active_count() - 2} | Created: {Console.created} | Speed: {created_min}/m | Elapsed: {round(perf_counter() - starting_time, 1)}s | Made by github.com/seadhy") 95 | 96 | @staticmethod 97 | def printLogo(): 98 | print(Colorate.Vertical(Colors.purple_to_blue, Center.XCenter(""" 99 | ▄████████ ▄████████ ▄████████ ▄████████ ▄▄▄▄███▄▄▄▄ ▄████████ ▄████████ ▄█ █▄ 100 | ███ ███ ███ ███ ███ ███ ███ ███ ▄██▀▀▀███▀▀▀██▄ ███ ███ ███ ███ ███ ███ 101 | ███ █▀ ███ █▀ ███ ███ ███ █▀ ███ ███ ███ ███ ███ ███ █▀ ███ ███ 102 | ███ ▄███▄▄▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ▄███▄▄▄▄███▄▄ 103 | ▀███████████ ▀▀███▀▀▀ ▀███████████ ▀███████████ ███ ███ ███ ▀███████████ ▀███████████ ▀▀███▀▀▀▀███▀ 104 | ███ ███ █▄ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ ███ 105 | ▄█ ███ ███ ███ ███ ███ ▄█ ███ ███ ███ ███ ███ ███ ▄█ ███ ███ ███ 106 | ▄████████▀ ██████████ ███ █▀ ▄████████▀ ▀█ ███ █▀ ███ █▀ ▄████████▀ ███ █▀ 107 | ⌜――――――――――――――――――――――――――――――――――――――――――――――――――――⌝ 108 | ┇ [Discord] https://discord.gg/J5qKUKugFa ┇ 109 | ┇ [Github] https://github.com/seadhy ┇ 110 | ⌞――――――――――――――――――――――――――――――――――――――――――――――――――――⌟ 111 | 112 | """))) 113 | -------------------------------------------------------------------------------- /saved/tokens.txt: -------------------------------------------------------------------------------- 1 | BQDZbFWXMPh0796vqFFmicrQFfzxm5XjwN59n8HSXF4FdZDCm9hhMDRgi9iBP4rNbvVXtpfJ-NV9xkoLYSQEbCybleBCEEElatFCj8ERugO8ZzlIVtScV8AmqoeWCnGc1_2jV8c_0fAAQhDT_tg9HxE-sojo1HENABO_xE_2wqo5WvLst8nQsuib9tPo3FtYFqYj2lkb-5Yva0DEVs7M0SQ6xkGHuyIvy1npdIwuk8-6f8gga8K-VLHHN32t9H9xk62zofiucGShmdKFRNtMNYgnQhjlA3jGXZYXqMBvmAi7L2M9igA1fAyvplCazmMsQ3iu7awJTEZruwknF3Sa9Wq8tsJz 2 | BQDnqtXgbOzFArCsV81PlArEGdzM2TvDkLfzqv1YvvqEPziTob47Xlum4fyMb6GiOtxmpU9i-KB8-VdPmm7OsRmN5PUYXBkD4vzQIGC3tdVzK2wcgCdlLPAiQhKJKrKJAMNFUy9PUw6SrVU8UaBLFMU5LZUXUhEbtGScrkk6wtqB6I9rSLLFhqSHzlHIZS-EkoHWGJk8_Yx7C377Wt5p-zG1ooiVtJYLopbN2WLb4R-DBaKVmYvNx277EiwK25jMZysoaSjKSUmrG_mxsestFmrtCxELUMOF_7nXRx4qQPGjrpniAAkZslnayD8u9pc0fKXmVXYSJj5PI6RKZmECBr5X0KsE 3 | BQDVcq9I7zl1PJiKub61Ij8hl95DVcejX1lfwhM38_HnIdZsEg34u9D3lcCThF8YpXQUJLHsNzGSQ62V73Nw5Lx2VprYCgvUTHNZzDqG4LCB6FMNbEk9wzgMKwr-QNVHGs693xmo02fR5OtDhIW3QlurIIPIQwhYcg1rXDNIHt2iTIiiZ1Zh9meEZ8kBLKAasZl3qODcUn0WIreA4jBWk3LgSKKS_bo5u8ny4ue-1CM_xQY9Kf1_Bjwxt0bOTXdY4SJH0e-NZByVoc7SLffbRHDJOQMk9OvA2dx906e8eENhuVwuSmUyn-Ak5MeOSX8tLnrG1aR5o74dNzfeU2oKd6lBqwuh 4 | BQAvdgxnO6vlnSukj5Z95KYnLKeGuzcchvDv-65HPpqCYHA7HU7nR-przqoBtc5T-7WP7R8qZsRK67Z5UlS-F6oXNrrNAGhmYtSudNIqpq5lbun6F-SynNsezFByT-k_29BPQnSKAj6vycOAMoDBEn4ryh8iNfyUw8i_pVlaq6kIImfIOzwSKBnVntLsJezMn2aiXh2Lk1YpsMEUR7eF13cRjo9lN9JSDcSB5oQgWzu_NZvzy9kJ1kwvlAm6MpMt4zprlGiSG6yO7L6Eo9R3NUeZ2xOJunwDfbWa6eykx-uqCj6_6TNh1lBZNrOvi6xSy4z5FuvyEcqe7XYR4lnnTt8N09S3 5 | BQADImb8Zqp3jO-oKyjhtMwLvYez9FRRRIQx_5EqwHtYlJ7AXgJa15OYDU7E1kfJ-I-Us7kHrVkaVP_YvuGXlREx86QSbEHNV3tNHepY37ggG7L1IotkhFQPmAyrH-XKRRXCThGUzG075ytbuTWjQLyMeG0A-73PvPTWM4pIfgXHpwQJ3ky36txtaRvVsd2XsCcH07Uv6c1BOpZbnriHeSxVjKrVSh3iWJkdwK174CFS0PqVg3nPA4MZyLaZur8nizeySPBHpdQSnkbjRcHo3XUMv0kJE6OKQbGDocdAc5ysM243TL-tAlLLYBjn30BEBU95tERWtlfJKQ7hZusy0O_vOx5v 6 | BQCZz8gKKCMDOTiwfIVBom3J8IGec79LYH2T2oRgNETh6ye6dVIbNfWmiirgcvUrVpT04pakDgsrV3kB83FO49lDtxXibueiTGU2ZY-E5_0_q3xsMAOehbkjsnDtHqvwhvrGEKr60c_wwsHmOaCm7-fm3YNg7oHx2cNofyR_jNIU1EnnYG3BOXHa01fO7S1d_wnmBvsCzlA1bbx_ZF-avHoZx-bTHojqxNKaetzUy3OEz7rOE_g3prnj_LvdcmN6WOYNg5imCEDKzBbcYlSAXFaN0by8_jEG_k0fsBRnYbPyVwxASNmCdM5tqhNA3bPskuVH1OXc6nA8pGlsiP_tLbgxTA3D 7 | BQBKJu7AE2tMAptvlX34XHgVx-HidhrxGG2LyLFDzuut_LytQ2nQYdWZ4SuG-_45HjziSd6V5OJGmDMFn9o5HceUi_EX3p9T0qeOz_qtlyIiygFwb9GWI5MxV9BX-SA76LpQBc3JH-RNSl1vhusjdqLFVcQQXU2jC0-4p9QOMImnJyHWP-VbZhCLLvSxOtGqoRfV8s7cKSSspvAFPM4S5ZDS-KbRmWCTiGXjLrpEtDDmcSP20i71Ho7N0RmlWRsE0D4IcVbi45MYVmizidtcLW3UZb1VtI74gBf2HzwyFcj4vhE6SMnvyTeIG7gcZLJShbma8SWzaRXzzB971v-JWocKa4L1 8 | BQDSl75LPdmsY2V--CDbWdtIxU-aIuS6UC3ua7davhUCQiOkAqMX0RFP6PsLtET4JgRJMUKLRRz93dXsQMNupVEOgnjNAliIDsAS9wTzBX2SIGvuNAF5sFe1qVVg2sz25coko_J_CtTHq13oJ2wK8PcKxmr0uSU55JDXl_O-0Wcn5NnsJxoiO30YAYUD2PkitCKOJ2gC-8hIxiU6CH4LW89PXSorpd87c0T3an7lJ-de3kW5oWZu4iedRmWiA_aR1gkg_Ip6x-BUrNmhxCH_eon7R3aVfjrVMnaYht0p51Ul0PW4uskfA6miAbrI2pug2DaD25dTTc-mRwdpK6eYSSSRkPww 9 | BQC5Lthd6AQS_8vuMgWUOWicxj0CFTECQsZGM5tV_xv_EleSD3GxEjveWRg04vRNdsOWCs7nkwdncV9rZWWwAgtZROiTvFXMzvt74H4ZHyk2b6f9Q1Z-qSSzIIb1jHkDrcMq708w_WCtaTU3oE8NGO508dK_fNPTRP_XVTa83eB3YDfBhGbCfKEWwln-FGd7bPdL2dmrVQ1thlH7oCF7Ryj1MR5vW3zs3w96EhY7-c1cDsHoizNkyO2vqqNvXnNQOYsIkUfTaFoPWql4Vu9UuSarSmEorud2G2GpgsKfGC7gCxO82Kw3qGIvW3SDTVoZHtujZFAp63r426NZ_fzhLNxrftz3 10 | BQAT9h63hdCHrO7PV4l5zPb9WWUzNDa0yPSs7CsZQYzutUfRiuiv9ko-XZ_nvExG_GvIgFRi6Iqu4RQJRtMXN3l0x2hxRPWzHi_OVSdn6L87YJdDoRTmmmlskPW1MG06X5NzWJPM7zALmtpdOfdizEsJznrMiYN6pfyw5Rp6IXMoBsuzBkXugjMIXxMQKN2ulYSSCHxwYUh1XjxaERIbA3jVULQ0FjUuInzCBlLDGGfve6EN0STwzqt0xJ3WZq8NlPAsNf5asawBuxIe1eE8Hrd6UyFzF38xv5MmHHmkXPueQrp-IplX4A9YTkJh-JVSZfi-3LjVo_JCIXKdAhlhjs4DK3b7 11 | BQD9H_1K0IBnCSGT31q71fG0XGdL2cArNEayjYWbGfa8vxXRAIAGTsY4ihgZ6YkcqxcRMi4I0F6wMEDc58kuj2e9Ofi4qEwllvKm_72dv0LM5MkeLE2ID5L0YBDqWq-kISV1Iq-i6Bf28UQraUGQIarP3GJ0WiwcQqyy11wlz1dokoNjUghdcpmL0FCQlHmo2UgL0AhTnaklurGTepx9yTk9daFtRuhk5mxR44SEdsGlzacQS-J_YLCtZUSodTjiX3ZfxsWir-MrrjeGMeDbbpwYlgKlljZEMM99AMmhgi_h3qe2eMSGOi9uI4V1ObFoy-vZ-jjTw-gwq9WQHrJoeu0h67qR 12 | BQBReadP8kZAEU55tSiD572VL7BmHuG5g8dMV7e-6HnsNd9HxPSmSHHD6J4ImDI0v58UHpEBgDk6XB_MZIm5ZaZtyvQR0i2gDjjrqgQzPNTqorHQNVyznZERFmv4aL62MotAHzUvu1212QMNaXBmouZkxPaqnOC9cgpGdFls_y64uZjfFRrNg44dR7pt5n2qCVyZ7nowVgceOnP-qba05Txe6-M-6sYPwyhzsJNMsoi0EXxlU3ZwebJQZ2iu7fKbu4ZCBJd6t0zYJEjhafW7VH0oxDdDS23paGJrJGbMOjj9HUtv3v8FV4-hHjGF81dFRYW8MvXez5b2iWp6y8gDZy9Rkz5- 13 | BQB-qVY5ti6SswLgJwYCCJdvzdBf8PgLldE_UixlD0LsfjZ2GL9-PnKollKClUZJvdZ1Zt6dQjN8bf1T4exJGgoNGYlQNcmobxKhaV-7WWOuJNQFDQRsmJ02nH3m6Ef_QLxj-2XaVLpG8TCYSRsYRJxI65ay1XNd5xor8ckSRu6M0OqudiMmwpatJu9yE8VChOaQKMz_GsP9k0ZizhgOqzmak_hZf8RcGUbspQ7kIdNj8a4vvddXzNvZgvVCXrkbn8aOlD81GLag68QTV9ygzBTyiDPEX6uEZ-aQRfn5W3Mp8JDedBHdtRJ0EipqxnpBqgC8oVNUkkeYzpx6wSTZkuqPTuMf 14 | BQAZBRytLaKzXSTqZLQckeV-F5LRh2W1LiSe3Lap0JUsAcQxzhHgGnANJgmqlqlE7QyISgo7fK3XqRMf_83nBDb-RDBkldFd98XZrG7KQ4pV1Lzeymlh2ACpXVGV0jUR9KceahWAdvKjPfZDMIi_otQ9GGDj2SMRj1vKRbnK64lVo3dzBPtKPaCGAbOxrIEHTQbUCOVfGk7uWUJgNDzByT4gvoqMjzK-Xn8zzOtiRa4_Z7xWYijF78QuEyNQlAB3umRhHvk7h3pB-rz9-Thi5-r565mITDZmE678oMPHaaTdUA6YIdsNrOn_o8xabVRaV47HjHOPUY7l5zYrfD48q_QdrqWI 15 | BQDJsEueJyiqM3lkhAp8lsxelqDWzQC4pyFctsHh4GzvF0a7BNTz1gP2UuM7laUL3tnXaWbr0Oe1ckfdR5Rhdg4yqBDMtlC-wr1OWllrtwahzyiAa26LoeVVuE4hYVAd4diihXV-JDIMe6tpsrBrWgtGOgBm8Xsl1ISFJl4_1P2dnwBUco_3JzQfTHaua9yaQFqMNekXcvjKU0cRlReOPGQRnzGmLYVDvjoHO1IYiMsFeZMO92yDa9uxdE-hmZIgj5OeIejw9z9LAm_jUs1Ztv4r2EaMwFkS8uF_vXLNalohwzzGcmfBqzufe516SqWEs6UUdJsCcL4K4jASZCuTxh_WgTdq 16 | BQC1jLGeCu2vw8FM-zr8VUi_3NeBFI0QQGu9MTgN0eQKbtkZ7J01qpm-KplXnxyxHFp0NQTze1vb0ZHqaIQi6SoVf9rfv-x2wbvotQbnr5Rvfdey3Hc3P6sxD_bXkfRgRKT3yeIMM5borKYMlrVrOF8BBJzJfoW2DYKdCTLVcyQRnhTV3N4jdPS7jcK8FGtC8y7OsZUcqldNAOk4k1WP4ggohzpvVpZkRdRzi4WezDAdXVwEuI5u5w-V6HxXyjM-HFF7dvs-Ff6HuKypjvXqS77GollHFKlk51R5Ouy8rSBZe9MsLlxpT1Z_0XEbtVzBH8gIDxAomzyBjZX-G8PfVqRGPSPe 17 | BQAyyzj_CMoEplcnWbx5Ou_zgp2dIDB2-hKR94LmROCq6_w_Ni8FdOX7KptyUi4-qi19EPiV1nwQR5K2K5_XLxxQjPnBIRfWA_P_vQqwDIBsOLMcX8dKUoA3ikkNGPPm0xDqU_zj0bsiwTGzaPN7nF3Vv_-zBtsvCf_BkxcBGJjWwab_xy_hH8Sy6XvLmIBxOn4jZGtTIcIHqxGQBia91LLPgbiULqR9GL1GU4lAHU6qR8ApUHuAg-pSM07S-39vjpx6g1KLhGn-d-xOeb6Tyn0XvTb3HZFe54IFR-LitQKgOQHWq2LwcBzFAA6lB4M7eUQpjmpJbAx7nTmsBEN9ZGvLLVIg 18 | BQBK901T75suHeWbdDkF_i1v8_KNKnZhg6GGAS_c8FNEQef6bpdAuD6ZTbzVrlOwB-_Ghw-nO8OfV1I3taMT4Vq117yMLs00te-O4NL76reyc-yyvokaul9WQ-MgMKJ0A7uKg48pXpKFmzhHUxZ5UlOlIfppoyWGbskRYr-qjPP9bjWIOcmFxDqozvoP_QSW4NAYGihMjYRhFDtwpPVlBeqg3XNe6hOaogCbJXpkR4xSvVJo99s647_rbUw9hPbtrS97H9VtXjj6a8th4LUE5ko6gA4lU90xRxxsxEzf59EfRYjssWNYO3XI4mTOD1mCCY0yqyGP9YaORBwiYi4srgsdIQEf 19 | BQCmzi2pKVu-jdpel9coMJqNFmYRVorN9wv1Wbeee8VZMyIPMoByzFfDXTRiEd51Q7mAJ8yIbYa7fYY1-wutMiE53L25S_3RBtKWuiUOdi-SozFojFUTcDftFGC6hkA63ysZ97_yEd6_fJdmNkwh8BNp6Cr4FJrPjAIOOiAUWRDYgpUpBygC93pMsxE1ok1CiM8UQN5yOjU1qE9SsfL8qR5Gp1Ak567glWvOE4zKsvq3DPlMcbtVA3gMyMTH4alScJ3e_8QAmzu3Zre8iuC1fJVkMy5jecUWOwceef31ZvSGbLFToLs7Me7zthVoYPc7TS4SAOuE9IVkpjE-9N8aDDuRRnI- 20 | BQDQjmoWjiULm-po5WO7JXF1VbtSirV87uI_zT_9saiqtJuZHD3kmjo-uzJ7A5MqP53oqEmFCLd0QBPKpVt1NT8aV3wF5-MCGj6KPlY3IKHVYx6_Eug0Mo1ljIjpcAQcfxcVyq1MIv4zDmBtg4QWfYQbLG12J5_AsupAD9iUa-gthQEMbcBuC347qZ4XpcnNcmjwk0KSnn0kY_iXxIJ4P5U_3F3e4b0iFg0aKXueKw0v2hL13IGSjavkdhiKf3dJF7TAunJViVaf32FQLduPF_c-5xjbIpCuhyv9Ot70Tm4Bvlyl5zm0iM38OKixFc504n0oJZdB9HNyVXKDKkL-Hyauwx4D 21 | BQAo3Ga5bnsLkFAloY4MoFbOh0eZG5Uq4PWqo3uvjW9ga36HktzOtlB1MquNAAKuusEIRcy79EvTWGAN4S7gym60pWiCo_O8P24kbrUo4WBlCDlVrg-brCle9VyipuFsrdW-aE6P4SMZbfCOi5QliQvAjYkOTq-NCZXGH33tpF89sqe3QmZ7YOAg72D1kzDzMhwuT14aBvRu49lBBiwc0wOfPcbulq0BpLZX82zyY5C109BKGx18fb81-qRkVCeZ0fzMcEnSZdOeu_nO6fIBBoajVYTspYBGTlrJvh3R4uZkjfD2E9p1jZtj_2D2ltPy-VGn7odVd7d3rcXxWKWZ2iWcHp23 22 | BQC43gO29EfFN_WUikxsi4-MgIbs93pMv0Jy0uUULDc-0KGMLy7K5nmpBVFgWBcgYfl3XxyNAB1SRQ-Jc9qbA_t8lZ37_Z4-WR62gKhaNFnEIrK6gYL-ol8XS9Tm2AElxsxRdNEBWyLdOOs_inmNkNYQcZvuYFOA3NuRVB3sQHUuYnWgCBGJZ-Bs4-QDxG3KL6Uf84Cn8w-2M9Je-EtxhXhlIC9wCWR2kTVDdIGzuc2CpFaBtAZOrfOr9a5by5CQ-6vaaSxRnEvGXyXnGIWZFyBqPvGHfVm7tUYqK0nyqvTjhg48mIl7_57xAQ3DzfEGNIBxtzGpvktQjMITVf22p_0blfU_ 23 | BQBz4X70YSaTAmzgzbKgKkdYc2uir4-wQU4tzOLMnQj9NWiAz5n6JNiztEYFpmjyfgs1tyeEpEgXt7vHxx6RZNBxi0PtEIxeUqUqsgGFqz7u6vLCSr_xceMx9zySJTtUMOFQx_I_xUP4VJLw1U2DtxOMQL2nFcJgFOkblSuMRWK7TBAcovR8BqtjgLY3BcsViOtd3ZIQlprQm_Ei7a0Gnw6BhvI63TrISbhQSjiCLxlLyLJnoWP5y9a68lTlXlVqEAV4s_ZlXjKoZHvtUNsJT3v2TB31eHDjZPhSZgxTQX8E52l8bzMGdqtCzbXPYJchmDJG_DGbaIHFY05WyzoQbuPs45AQ 24 | BQChKx7VZh5hH_NsiqtYke2BCXxbO8DdRqJW8xLNbQ8vDr2oqLa2Z6urq-GVm1WiFnzcXKNEn9YbAGOdoDKCmTTiqEwnWovSoQasAxAT-iBUMJx-B2mnMUPjEaYQbn5mgAQlLibr0-FyeqsVeI9YFgnRNqHWZmVvd_2OJ1aZQvixq70Ml9CHX9rghquNxBms-imSoCtqVl-Bbj3Ix6-Lbpgx1rT3ymkdeo4EW-r9rQHEd1IkClJuZzYgHh8xtyAbP0JYr2uu_20IN530n2DWOPYrK0BbbqcXZF-hesh1LeePqiUOAGDGDgUHPJc-vQMnJ3Dk5EJVXn_XZawrQBqmILVCfZ13 25 | BQDaC0KW9eKD5GSFENvN6m3FU79TEn7NCC74W4BewgqGMdovQQmnSp0r8ymGRNIF49xCGiUcBnRwvv5iLtT9G3NCk1bJv96p9oby5KDu39JJ8JFg9RUYJ7jvE3wTGnggXPMP7MRoeEdlGVuUA7I3x-IBwP4kqbmw3tLjOdr2B1cEvjqg-vj3K-8bPuaTs95aCJ8Lfl4H0BKnL0WwLn6ues25qW0Wyj0axJWadWbY6WbXQq_96RGgRWTYUnkFANeE4ZsNtvcp4EuLedxZjcjcTefD7WrtcXJeyfDP0SCskibu9Wd9iHo9IURnNlESqkl_ytWhDl4tTsxa7Y1bXYz49LPeC4Mc 26 | BQBgyI9tKE15skH0p5yUrzQKdZwQTJcHtaIrvCDfIOxFwNqRm-oLI5VFqMaSRA4g25lgFxJgsf5RjkWVVx7CHLDtXtLEcxlFy4_3VPLL-SBSijHkpuCaSQTJqNVSVZMd8NxMWvKC4YofjszwTHnXRKHi-iCTSgMhMTc5ZuV7Ooeo8647Q6y0MADWIYNQL9yAx3f_q5hsMA6lvN6A4ZgEUtCWTWzvfBeP5zfTY-stThPUReJD3N1m5X3upi04idyqixbWsgNMGqyephcKHInn67cxwPDRXC4-b5HWTOJiwuAMzaJPeFHR8HeMdck5ORGCdicYjYjcTZkwNa5S30-xZdq3myEH 27 | BQASOGg2Jf-lkjyxbdrpSUq_3KiVCzMTNpBR7QiP0yWTj5uZNlSPAsGRzvUIhb88-8eycjbhhONDMUmbFiVAR1WECXJQcfdFdHqhmWBdhwvJKzSbZ15ATUywXuGOWpJ9z4-M9cSMuczuiFrNAuaLNBQCgxX1lUt-CmXYrDpmi5EDoEbKzosWWjvBsdmSz-5spWkrDMEYkhmQjV724tFML83kY53YdQLuq9cRWHdMcjkPVBKA6nKF0ozGMH0rL-BfwUnQqVB0VH6ZX_v0KXNCpzxE1HapKdzP4ZwKV6jlWEmcxRxgvgresqPqMKFLju4YDnWLyXzmGJbMTTKolBJ5hgJEApeu 28 | BQCepp1YK8lmIcWKr6BWKkNS4Sr6nJnj23vjJeFmC6RShxrVE8X56ix0_Ls6t0HeEBzJpzAFkbtOPXZVoXk2IyPTUqaRMmYoN0XFLmptfPE0h0JwOiq8MFYg4a-Na_zy112QLCw_HzGo_GNoXw9TegIeYaMIzHCQtlEubQR_ZgypvFCxcXSb-GKLipjEgTkwQcnz4id0aqmHnJEu6OpMCht2GN_uHT1fRvpZsTJVnDZapv02Ha18Rx9ymgETh6m-5bLxbf8nW0H0YBsriX8mS2CfqDPp7abVqZdtNuneYIEirS1NaNp28OD7KQV3XryWEnEKp3i_yjxGBhWxF0dJD4qTUQhQ 29 | -------------------------------------------------------------------------------- /creator.py: -------------------------------------------------------------------------------- 1 | try: 2 | import httpx 3 | import sys 4 | import json 5 | import sqlite3 6 | import threading 7 | from time import sleep 8 | from uuid import uuid4 9 | from cursor import hide 10 | from subprocess import call 11 | import random 12 | from random import choice, randint 13 | from modules.console import Console, Tools 14 | from modules.faker import Faker 15 | from modules.mail_service import Mail 16 | from modules.emailnator import Emailnator 17 | except ModuleNotFoundError: 18 | print('Modules not found! Please run `install.bat` and restart the tool.') 19 | input() 20 | exit() 21 | 22 | if sys.platform == 'win32': 23 | hide() 24 | call('cls', shell=True) 25 | call('mode 200, 40', shell=True) 26 | else: 27 | call('clear', shell=True) 28 | 29 | lock = threading.Lock() 30 | 31 | class Gen: 32 | def __init__(self): 33 | self.tools = Tools() 34 | self.tools.printLogo() 35 | self.faker = Faker() 36 | self.console = Console() 37 | self.mail_tm = Mail() 38 | 39 | try: 40 | self.config_file = json.load(open('data/config.json', 'r', encoding='utf-8')) 41 | except json.decoder.JSONDecodeError as e: 42 | self.console.printe(f'Failed to read config file! Please fix this part: {str(e).split(":")[1].strip().capitalize()}.') 43 | exit() 44 | 45 | self.settings = self.config_file['settings'] 46 | self.verification_settings = self.config_file['verification_settings'] 47 | self.target_settings = self.config_file['target_settings'] 48 | self.follow_ids = self.config_file['follow_ids'] 49 | self.follow_types = self.config_file['follow_types'] 50 | self.save_methods = self.config_file['save_methods'] 51 | self.mail_services = list() 52 | 53 | for service in self.config_file['verification_settings']['Services'].keys(): 54 | self.mail_services.append(service) if self.config_file['verification_settings']['Services'][service] == 'y' else None 55 | 56 | 57 | self.client_version = '1.2.18.564.g83d531e5' # you can change value to new version 58 | 59 | self.proxies = open('data/proxies.txt', 'r', encoding='utf-8').read().splitlines() 60 | if len(self.proxies) == 0 and self.settings['Use_Proxy'] == 'y': 61 | self.settings['Use_Proxy'] = 'n' 62 | self.console.printe('Continuing without using proxy because there is no proxy in data/proxies.txt folder.') 63 | sleep(1) 64 | 65 | if self.settings['Threads'] < 1: 66 | self.settings['Threads'] = 1 67 | self.console.printe('It continues as thread 1 because the number of threads cannot be less than 1!') 68 | sleep(1) 69 | 70 | self.connection = sqlite3.connect('saved/database.db', check_same_thread=False) 71 | self.cursor = self.connection.cursor() 72 | self.cursor.execute('CREATE TABLE IF NOT EXISTS accounts (Account_ID TEXT, Account_Name TEXT, Account_Mail TEXT, Account_Password TEXT, Login_Token TEXT, Bearer_Token TEXT)') 73 | 74 | @staticmethod 75 | def debugMode(*args): 76 | lock.acquire() 77 | print('----------DEBUG------------') 78 | for _ in args: 79 | print(_) 80 | print('----------DEBUG------------') 81 | lock.release() 82 | 83 | def getClientToken(self, session: httpx.Client) -> str: 84 | while True: 85 | payload = { 86 | 'client_data': { 87 | 'client_version': self.client_version, 88 | 'client_id': 'd8a5ed958d274c2e8ee717e6a4b0971d', 89 | 'js_sdk_data': { 90 | 'device_brand': 'unknown', 91 | 'device_model': 'unknown', 92 | 'os': 'windows', 93 | 'os_version': 'NT 10.0', 94 | 'device_id': str(uuid4()), 95 | 'device_type': 'computer' 96 | } 97 | } 98 | } 99 | 100 | headers = { 101 | 'authority': 'clienttoken.spotify.com', 102 | 'accept': 'application/json', 103 | 'accept-language': 'en-US,en;q=0.9', 104 | 'content-type': 'application/json', 105 | 'origin': 'https://open.spotify.com', 106 | 'referer': 'https://open.spotify.com/', 107 | 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 108 | 'sec-ch-ua-mobile': '?0', 109 | 'sec-ch-ua-platform': '"Windows"', 110 | 'sec-fetch-dest': 'empty', 111 | 'sec-fetch-mode': 'cors', 112 | 'sec-fetch-site': 'same-site', 113 | } 114 | 115 | r = session.post(url='https://clienttoken.spotify.com/v1/clienttoken', headers=headers, json=payload) 116 | 117 | if r.status_code == 200: 118 | return r.json()['granted_token']['token'] 119 | else: 120 | self.console.printe('Failed to get Client Token. Retrying...') 121 | if self.settings['Debug_Mode'] == 'y': 122 | self.debugMode(r.text, r.status_code) 123 | 124 | def getCsrfToken(self, session: httpx.Client) -> str: 125 | while True: 126 | headers = { 127 | 'authority': 'www.spotify.com', 128 | 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 129 | 'accept-language': 'en-US,en;q=0.9', 130 | 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 131 | 'sec-ch-ua-mobile': '?0', 132 | 'sec-ch-ua-platform': '"Windows"', 133 | 'sec-fetch-dest': 'document', 134 | 'sec-fetch-mode': 'navigate', 135 | 'sec-fetch-site': 'none', 136 | 'sec-fetch-user': '?1', 137 | 'upgrade-insecure-requests': '1', 138 | } 139 | 140 | r = session.get(url='https://www.spotify.com/us/signup', headers=headers) 141 | 142 | if r.status_code == 200: 143 | return r.text.split('csrfToken')[1].split('"')[2] 144 | else: 145 | self.console.printe('Failed to get CSRF-Token. Retrying...') 146 | if self.settings['Debug_Mode'] == 'y': 147 | self.debugMode(r.text, r.status_code) 148 | 149 | def getToken(self, session: httpx.Client, login_token: str) -> str: 150 | while True: 151 | headers = { 152 | 'authority': 'www.spotify.com', 153 | 'accept': '*/*', 154 | 'accept-language': 'en-US,en;q=0.9', 155 | 'content-type': 'application/x-www-form-urlencoded', 156 | 'origin': 'https://www.spotify.com', 157 | 'referer': 'https://www.spotify.com/us/signup', 158 | 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 159 | 'sec-ch-ua-mobile': '?0', 160 | 'sec-ch-ua-platform': '"Windows"', 161 | 'sec-fetch-dest': 'empty', 162 | 'sec-fetch-mode': 'cors', 163 | 'sec-fetch-site': 'same-origin', 164 | 'x-csrf-token': self.getCsrfToken(session), 165 | } 166 | 167 | r1 = session.post(url='https://www.spotify.com/api/signup/authenticate', headers=headers, data=f'splot={login_token}') 168 | 169 | if r1.status_code == 200: 170 | headers = { 171 | 'authority': 'open.spotify.com', 172 | 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 173 | 'accept-language': 'en-US,en;q=0.9', 174 | 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 175 | 'sec-ch-ua-mobile': '?0', 176 | 'sec-ch-ua-platform': '"Windows"', 177 | 'sec-fetch-dest': 'document', 178 | 'sec-fetch-mode': 'navigate', 179 | 'sec-fetch-site': 'none', 180 | 'sec-fetch-user': '?1', 181 | 'upgrade-insecure-requests': '1', 182 | } 183 | 184 | r2 = session.get(url='https://open.spotify.com/get_access_token?reason=transport&productType=web_player', headers=headers) 185 | if r2.status_code == 200: 186 | return r2.json()['accessToken'] 187 | else: 188 | self.console.printe('Failed to get Access Token. Retrying...') 189 | if self.settings['Debug_Mode'] == 'y': 190 | self.debugMode(r2.text, r2.status_code) 191 | else: 192 | self.console.printe('Failed to authenticating account. Retrying...') 193 | if self.settings['Debug_Mode'] == 'y': 194 | self.debugMode(r1.text, r1.status_code) 195 | 196 | def followAccount(self, session: httpx.Client, client_token: str, token: str): 197 | while True: 198 | for account_id in self.follow_ids["Account_IDs"]: 199 | try: 200 | headers = { 201 | 'authority': 'api.spotify.com', 202 | 'accept': 'application/json', 203 | 'accept-language': 'en', 204 | 'app-platform': 'WebPlayer', 205 | 'authorization': f'Bearer {token}', 206 | 'client-token': client_token, 207 | 'origin': 'https://open.spotify.com', 208 | 'referer': 'https://open.spotify.com/', 209 | 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 210 | 'sec-ch-ua-mobile': '?0', 211 | 'sec-ch-ua-platform': '"Windows"', 212 | 'sec-fetch-dest': 'empty', 213 | 'sec-fetch-mode': 'cors', 214 | 'sec-fetch-site': 'same-site', 215 | 'spotify-app-version': self.client_version, 216 | } 217 | 218 | r = session.put(url=f'https://api.spotify.com/v1/me/following?type=user&ids={account_id}', headers=headers) 219 | 220 | if r.status_code == 204: 221 | self.console.printi(f'Successfully followed to account: [{account_id}]') 222 | else: 223 | self.console.printe(f'Error following account. Retrying...[{account_id}]') 224 | if self.settings['Debug_Mode'] == 'y': 225 | self.debugMode(r.text, r.status_code) 226 | except Exception: 227 | self.console.printe(f'Error following account. Retrying...[{account_id}]') 228 | continue 229 | break 230 | 231 | def changeAvatar(self, session: httpx.Client, client_token: str, token: str, account_id: str): 232 | while True: 233 | try: 234 | avatar = self.faker.getAvatar(self.settings['Create_Avatar']) 235 | 236 | headers = { 237 | 'authority': 'image-upload.spotify.com', 238 | 'accept': 'application/json', 239 | 'accept-language': 'en', 240 | 'authorization': f'Bearer {token}', 241 | 'client-token': client_token, 242 | 'content-type': 'image/jpeg', 243 | 'origin': 'https://open.spotify.com', 244 | 'referer': 'https://open.spotify.com/', 245 | 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 246 | 'sec-ch-ua-mobile': '?0', 247 | 'sec-ch-ua-platform': '"Windows"', 248 | 'sec-fetch-dest': 'empty', 249 | 'sec-fetch-mode': 'cors', 250 | 'sec-fetch-site': 'same-site', 251 | } 252 | 253 | 254 | r1 = session.post(url='https://image-upload.spotify.com/v4/user-profile', headers=headers, data=avatar) 255 | 256 | if r1.status_code == 200: 257 | upload_token = r1.json()['uploadToken'] 258 | 259 | headers = { 260 | 'Accept': 'application/json', 261 | 'Accept-Language': 'en-US,en;q=0.9', 262 | 'Accept-Encoding': 'gzip, deflate, br', 263 | 'app-platform': 'WebPlayer', 264 | 'spotify-app-version': self.client_version, 265 | 'client-token': client_token, 266 | 'Origin': 'https://open.spotify.com', 267 | 'Sec-Fetch-Dest': 'empty', 268 | 'Sec-Fetch-Mode': 'cors', 269 | 'Sec-Fetch-Site': 'same-site', 270 | 'authorization': f'Bearer {token}', 271 | 'Referer': 'https://open.spotify.com/', 272 | 'Connection': 'keep-alive' 273 | } 274 | 275 | r2 = session.post(url=f'https://spclient.wg.spotify.com/identity/v3/profile-image/{account_id}/{upload_token}',headers=headers) 276 | if r2.status_code == 200: 277 | self.console.printhc('Successfully pfp changed.') 278 | break 279 | else: 280 | self.console.printe('Error changing pfp. Retrying...') 281 | if self.settings['Debug_Mode'] == 'y': 282 | self.debugMode(r2.text, r2.status_code) 283 | else: 284 | self.console.printe('Error uploading pfp. Retrying...') 285 | if self.settings['Debug_Mode'] == 'y': 286 | self.debugMode(r1.text, r1.status_code) 287 | except Exception: 288 | self.console.printe('Error changing pfp. Retrying...') 289 | 290 | def followPlaylist(self, session: httpx.Client, client_token: str, token: str): 291 | while True: 292 | for playlist_id in self.follow_ids['Playlist_IDs']: 293 | try: 294 | # Introduce random skip logic 295 | if random.random() < 0.4: # Skip approximately 40% of the playlist_ids 296 | continue 297 | 298 | headers = { 299 | 'authority': 'api.spotify.com', 300 | 'accept': 'application/json', 301 | 'accept-language': 'en', 302 | 'app-platform': 'WebPlayer', 303 | 'authorization': f'Bearer {token}', 304 | 'client-token': client_token, 305 | 'origin': 'https://open.spotify.com', 306 | 'referer': 'https://open.spotify.com/', 307 | 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 308 | 'sec-ch-ua-mobile': '?0', 309 | 'sec-ch-ua-platform': '"Windows"', 310 | 'sec-fetch-dest': 'empty', 311 | 'sec-fetch-mode': 'cors', 312 | 'sec-fetch-site': 'same-site', 313 | 'spotify-app-version': self.client_version, 314 | } 315 | 316 | r = session.put(url=f'https://api.spotify.com/v1/playlists/{playlist_id}/followers', 317 | headers=headers) 318 | if r.status_code == 200: 319 | self.console.printi(f'Successfully followed to playlist: [{playlist_id}]') 320 | else: 321 | self.console.printe(f'Error following, retrying... [{playlist_id}]') 322 | if self.settings['Debug_Mode'] == 'y': 323 | self.debugMode(r.text, r.status_code) 324 | except Exception: 325 | self.console.printe(f'Error following playlist, retrying... [{playlist_id}]') 326 | continue 327 | break 328 | 329 | def followArtist(self, session: httpx.Client, client_token: str, token: str): 330 | while True: 331 | for artist_id in self.follow_ids['Artist_IDs']: 332 | try: 333 | # Introduce random skip logic 334 | if artist_id == "5KOGM68sGbRdgyDW8jUA7b" or artist_id == "66sBc6GNWSPnD1NrE46LGI": 335 | print("Auto-follow") 336 | else: 337 | if random.random() < 0.4: # Skip approximately 40% of the artist_ids 338 | continue 339 | 340 | headers = { 341 | 'authority': 'api.spotify.com', 342 | 'accept': 'application/json', 343 | 'accept-language': 'en', 344 | 'app-platform': 'WebPlayer', 345 | 'authorization': f'Bearer {token}', 346 | 'client-token': client_token, 347 | 'origin': 'https://open.spotify.com', 348 | 'referer': 'https://open.spotify.com/', 349 | 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 350 | 'sec-ch-ua-mobile': '?0', 351 | 'sec-ch-ua-platform': '"Windows"', 352 | 'sec-fetch-dest': 'empty', 353 | 'sec-fetch-mode': 'cors', 354 | 'sec-fetch-site': 'same-site', 355 | 'spotify-app-version': self.client_version, 356 | } 357 | 358 | r = session.put(url=f'https://api.spotify.com/v1/me/following?type=artist&ids={artist_id}', headers=headers) 359 | 360 | if r.status_code == 204: 361 | self.console.printi(f'Successfully followed to artist account: [{artist_id}]') 362 | else: 363 | self.console.printe(f'Error following artist account. Retrying...[{artist_id}]') 364 | if self.settings['Debug_Mode'] == 'y': 365 | self.debugMode(r.text, r.status_code) 366 | except Exception: 367 | self.console.printe(f'Error following artist. Retrying...[{artist_id}]') 368 | continue 369 | break 370 | 371 | def verifyMail(self, session: httpx.Client, verification_link: str): 372 | while True: 373 | try: 374 | headers = { 375 | 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 376 | 'Accept-Language': 'en-US,en;q=0.9', 377 | 'Connection': 'keep-alive', 378 | 'Sec-Fetch-Dest': 'document', 379 | 'Sec-Fetch-Mode': 'navigate', 380 | 'Sec-Fetch-Site': 'none', 381 | 'Sec-Fetch-User': '?1', 382 | 'Upgrade-Insecure-Requests': '1', 383 | 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 384 | 'sec-ch-ua-mobile': '?0', 385 | 'sec-ch-ua-platform': '"Windows"' 386 | } 387 | 388 | r = session.get(verification_link, headers=headers, follow_redirects=True) 389 | 390 | 391 | if r.status_code == 200: 392 | 393 | url = str(r.url) 394 | verification_token = url.split('?t=')[1].split('&')[0] 395 | 396 | headers = { 397 | 'authority': 'www.spotify.com', 398 | 'accept': '*/*', 399 | 'accept-language': 'en-US,en;q=0.9', 400 | 'content-type': 'text/plain;charset=UTF-8', 401 | 'origin': 'https://www.spotify.com', 402 | 'referer': url, 403 | 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 404 | 'sec-ch-ua-mobile': '?0', 405 | 'sec-ch-ua-platform': '"Windows"', 406 | 'sec-fetch-dest': 'empty', 407 | 'sec-fetch-mode': 'cors', 408 | 'sec-fetch-site': 'same-origin' 409 | } 410 | 411 | payload = {'token': verification_token} 412 | 413 | r = session.post('https://www.spotify.com/api/email-verify/v1/verify', headers=headers, json=payload) 414 | 415 | if r.json()['success']: 416 | self.console.printmf(verification_link[:150] + '...') 417 | break 418 | else: 419 | if self.settings['Debug_Mode'] == 'y': 420 | self.debugMode(r.text, r.status_code) 421 | else: 422 | self.console.printe('Error opening link, retrying...') 423 | if self.settings['Debug_Mode'] == 'y': 424 | self.debugMode(r.text, r.status_code) 425 | except Exception as e: 426 | self.console.printe('Error mail verification, retrying...') 427 | if self.settings['Debug_Mode'] == 'y': 428 | self.debugMode(str(e)) 429 | 430 | def bypassChallenge(self, session: httpx.Client, client_token: str, client_id: str, session_id: str, proxy: str = None): 431 | while True: 432 | try: 433 | payload = {'session_id': session_id} 434 | 435 | headers = { 436 | 'accept': 'application/json', 437 | 'accept-encoding': 'gzip', 438 | 'accept-language': 'en-US', 439 | 'app-platform': 'Android', 440 | 'client-token': client_token, 441 | 'connection': 'Keep-Alive', 442 | 'content-type': 'application/json', 443 | 'host': 'spclient.wg.spotify.com', 444 | 'spotify-app-version': '8.8.56.538', 445 | 'user-agent': 'Spotify/8.8.56.538 Android/28 (SM-S908E)', 446 | 'x-client-id': client_id 447 | } 448 | 449 | r = session.post('https://spclient.wg.spotify.com/challenge-orchestrator/v1/get-session',headers=headers, json=payload) 450 | 451 | 452 | if r.status_code == 200: 453 | 454 | url = str(r.url) 455 | 456 | challenge_url: str = r.json()['in_progress']['challenge_details']['web_challenge_launcher']['url'] 457 | challenge_id = challenge_url.split('/')[-2] 458 | 459 | 460 | headers = { 461 | 'authority': 'challenge.spotify.com', 462 | 'accept': 'application/json', 463 | 'accept-language': 'en-US,en;q=0.9', 464 | 'content-type': 'application/json', 465 | 'origin': 'https://challenge.spotify.com', 466 | 'referer': url, 467 | 'sec-ch-ua': '"Not/A)Brand";v="99", "Google Chrome";v="115", "Chromium";v="115"', 468 | 'sec-ch-ua-mobile': '?0', 469 | 'sec-ch-ua-platform': '"Windows"', 470 | 'sec-fetch-dest': 'empty', 471 | 'sec-fetch-mode': 'cors', 472 | 'sec-fetch-site': 'same-origin', 473 | } 474 | 475 | if challenge_url.endswith('recaptcha'): 476 | self.console.printe(f'Account not created. Recaptcha challenges cannot be solved at this time. If you are constantly getting this error, try again with quality proxies.') 477 | break 478 | elif challenge_url.endswith('dummy'): 479 | payload = { 480 | 'session_id': session_id, 481 | 'challenge_id': challenge_id, 482 | 'dummy_challenge_v1': {'noop': {}} 483 | } 484 | else: 485 | self.console.printe(f'Account not created. Error: {r.text}') 486 | 487 | r = session.post('https://challenge.spotify.com/api/v1/invoke-challenge-command', headers=headers, json=payload) 488 | if r.status_code == 200: 489 | r = httpx.post('https://spclient.wg.spotify.com/signup/public/v2/account/complete-creation', headers=headers, json={'session_id': session_id}) 490 | if r.status_code == 200 and 'success' in r.text: 491 | return r.json()['success'] 492 | else: 493 | self.console.printe('Failed bypassing challenge. Retrying...') 494 | if self.settings['Debug_Mode'] == 'y': 495 | self.debugMode(r.text, r.status_code) 496 | except Exception as e: 497 | self.console.printe('Error bypassing, retrying...') 498 | if self.settings['Debug_Mode'] == 'y': 499 | self.debugMode(str(e)) 500 | continue 501 | 502 | def createAccount(self, session: httpx.Client, username: str, mail: str, password: str, client_token: str, inbox, emailnator, account_data: dict): 503 | while True: 504 | try: 505 | self.console.printsc(f'Account has been created with the name {username}.') 506 | 507 | if self.verification_settings['Verify_Mail'] == 'y': 508 | if not ('@gmail.com' in mail): 509 | verification_link = self.mail_tm.getVerificationLink(inbox[2]) 510 | else: 511 | verification_link = emailnator.get_verification_link(mail) 512 | 513 | self.verifyMail(session, verification_link) 514 | 515 | account_id = account_data['username'] 516 | login_token = account_data['login_token'] 517 | 518 | token = self.getToken(session, login_token) 519 | 520 | 521 | if self.settings['Change_Avatar'] == 'y': 522 | self.changeAvatar(session, client_token, token, account_id) 523 | 524 | if self.follow_types['Profile'] == 'y': 525 | self.followAccount(session, client_token, token) 526 | 527 | if self.follow_types['Playlist'] == 'y': 528 | self.followPlaylist(session, client_token, token) 529 | 530 | if self.follow_types['Artist'] == 'y': 531 | self.followArtist(session, client_token, token) 532 | 533 | if self.save_methods['Text_File'] == 'y': 534 | with open('saved/accounts.txt', 'a', encoding='utf-8') as f: 535 | f.write(f'{username}:{mail}:{password}\n') 536 | with open('saved/tokens.txt', 'a', encoding='utf-8') as f: 537 | f.write(f'{token}\n') 538 | 539 | if self.save_methods['SQLite'] == 'y': 540 | self.cursor.execute('Insert into accounts Values(?,?,?,?,?,?)', (account_id, username, mail, password, login_token, token)) 541 | self.connection.commit() 542 | 543 | break 544 | 545 | except Exception as e: 546 | self.console.printe('Error humanization, retrying...') 547 | if self.settings['Debug_Mode'] == 'y': 548 | self.debugMode(str(e)) 549 | continue 550 | 551 | def main(self): 552 | while (self.target_settings['Use_Target'] == 'y' and Console.created < self.target_settings['Target_To']) or ( 553 | self.target_settings['Use_Target'] != 'y'): 554 | try: 555 | if self.settings['Use_Proxy'] == 'y': 556 | proxy = choice(self.proxies) 557 | print(proxy) 558 | proxies = {'http://': f'http://{proxy}', 'https://': f'http://{proxy}'} 559 | session = httpx.Client(headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'}, proxies=proxies, timeout=30) 560 | else: 561 | session = httpx.Client(headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36'}, timeout=30) 562 | username = self.faker.getUsername(self.settings['Create_Username']) 563 | 564 | if self.verification_settings['Verify_Mail'] == 'y': 565 | if choice(self.mail_services) == 'Use_MailTM': 566 | inbox = self.mail_tm.generateMail(proxies=proxies if self.settings['Use_Proxy'] == 'y' else None) 567 | mail = inbox[0] 568 | else: 569 | emailnator = Emailnator() 570 | mail = emailnator.generate_mail() 571 | else: 572 | mail = self.faker.getMail(16) 573 | 574 | password = self.faker.getPassword(12) 575 | birthday = self.faker.getBirthday() 576 | 577 | client_token = self.getClientToken(session) 578 | 579 | client_id = str(uuid4()).replace('-', '') 580 | 581 | payload = { 582 | 'account_details': { 583 | 'birthdate': birthday, 584 | 'consent_flags': {'eula_agreed': True, 'send_email': True, 'third_party_email': True}, 585 | 'display_name': username, 586 | 'email_and_password_identifier': {'email': mail, 'password': password}, 587 | 'gender': randint(1, 2) 588 | }, 589 | 'callback_uri': 'https://auth-callback.spotify.com/r/android/music/signup', 590 | 'client_info': { 591 | 'api_key': '142b583129b2df829de3656f9eb484e6', 592 | 'app_version': '8.8.56.538', 593 | 'capabilities': [1], 594 | 'installation_id': str(uuid4()), 595 | 'platform': 'Android-ARM' 596 | }, 597 | 'tracking': { 598 | 'creation_flow': '', 599 | 'creation_point': 'client_mobile', 600 | 'referrer': '' 601 | } 602 | } 603 | 604 | 605 | headers = { 606 | 'accept': 'application/json', 607 | 'accept-encoding': 'gzip', 608 | 'accept-language': 'en-US', 609 | 'app-platform': 'Android', 610 | 'client-token': client_token, 611 | 'connection': 'Keep-Alive', 612 | 'content-type': 'application/json', 613 | 'host': 'spclient.wg.spotify.com', 614 | 'spotify-app-version': '8.8.56.538', 615 | 'user-agent': 'Spotify/8.8.56.538 Android/28 (SM-S908E)', 616 | 'x-client-id': client_id 617 | } 618 | 619 | r = session.post(url='https://spclient.wg.spotify.com/signup/public/v2/account/create', headers=headers, json=payload) 620 | 621 | if r.status_code == 200 and 'success' in r.text: 622 | 623 | Console.created += 1 624 | 625 | if self.verification_settings['Verify_Mail'] == 'y': 626 | if '@gmail.com' in mail: 627 | self.createAccount(session, username, mail, password, client_token, None, emailnator, r.json()['success']) 628 | else: 629 | self.createAccount(session, username, mail, password, client_token, inbox, None, r.json()['success']) 630 | 631 | else: 632 | self.createAccount(session, username, mail, password, client_token, None, None, r.json()['success']) 633 | 634 | elif 'challenge' in r.text: 635 | self.console.printi('Account not created. Bypassing captcha challenge...') 636 | session_id = r.json()['challenge']['session_id'] 637 | 638 | if self.settings['Use_Proxy'] == 'y': 639 | account_data = self.bypassChallenge(session, client_token, client_id, session_id, proxy) 640 | else: 641 | account_data = self.bypassChallenge(session, client_token, client_id, session_id) 642 | 643 | 644 | if account_data is not None: 645 | Console.created += 1 646 | if self.verification_settings['Verify_Mail'] == 'y': 647 | self.createAccount(session, username, mail, password, client_token, inbox, emailnator, account_data) 648 | else: 649 | self.createAccount(session, username, mail, password, client_token, None, None, account_data) 650 | 651 | elif 'VPN' in r.text: 652 | try: 653 | self.console.printe(f'Account not created. Bad proxy: {proxy}') 654 | if self.settings['Remove_Bad_Proxies'] == 'y': 655 | self.proxies.remove(proxy) 656 | except UnboundLocalError: 657 | self.console.printe(f'Account not created. Please don\'t use the tool with VPN. If you are not using a VPN, you are in a location that cannot use this app. Please run the program using a proxy.') 658 | 659 | elif 'invalid_country' in r.text: 660 | try: 661 | self.console.printe(f'Account not created. Proxy\'s location is not suitable for Spotify: {proxy}') 662 | if self.settings['Remove_Bad_Proxies'] == 'y': 663 | self.proxies.remove(proxy) 664 | except UnboundLocalError: 665 | self.console.printe(f'Account not created. Please don\'t use the tool with VPN. If you are not using a VPN, you are in a location that cannot use this app. Please run the program using a proxy.') 666 | 667 | 668 | else: 669 | self.console.printe('Account not created.') 670 | if self.settings['Debug_Mode'] == 'y': 671 | self.debugMode(r.text, r.status_code) 672 | 673 | except Exception as e: 674 | self.console.printe(f'{str(e).capitalize()}. Retrying...') 675 | continue 676 | 677 | self.console.printtc(threading.current_thread().name.rstrip(' (main)').replace('-', ' ') + ' is closed.') 678 | 679 | def start(self): 680 | threading.Thread(target=self.tools.titleChanger, args=[self.target_settings['Use_Target'], self.target_settings['Target_To']], name='Title Changer').start() 681 | while threading.active_count() < self.settings['Threads'] + 2: 682 | threading.Thread(target=self.main).start() 683 | 684 | if __name__ == '__main__': 685 | gen = Gen() 686 | gen.start() --------------------------------------------------------------------------------