Guest User

skrypt

a guest
Jul 20th, 2024
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 18.89 KB | None | 0 0
  1. '''
  2. TESTOWANY NA WINDOWS 10 I ŁOJARZU (nie działa na waylandzie)
  3.  
  4. CO TEN SKRYPT POTRAFI:
  5. 1. wybiera załącznik (losowy)
  6. 2. dosrywa do niego bajty, aby uniknąć duplikatów
  7. 3. wkleja wiadomość, losową lub jedną konkretną.
  8. 4. może do niej dokleić emotkę z biblii (np "JEBAĆ MODERACJĘ :-)")
  9. 5. omija słowofiltry używając unicodów (jak mode się połapie to dojebie słowofiltry
  10. 6. zapamiętuje i bumpuje własne tematy (traci je przy ponownym uruchomieniu)
  11. 7. wykrywa bana (tylko przy wyłączonym javascripcie, bo wtedy zostaje przekierowany do banned.php)
  12.  
  13. URUCHOMIENIE PO RAZ PIERWSZY (10-15min):
  14. 1. zacznij od instalacji Pycharm Community Edition, ok. 3min
  15. 2. po otwarciu nowego projektu wklej ten skrypt, możliwe, że będziesz musiał
  16.   dodać nowy plik do projektu, wtedy:
  17.   - prawy przycisk na główny folder projektu (po lewo, zapewne pythonProject1)
  18.   - New -> Python file -> nazwa: 'main.py' -> <enter>
  19. 3. odnajdź zakładkę 'terminal'. w starszej wersji UI jest na dole, w nowej (nieopisana, poza małym symbolem) po lewo,
  20.   też gdzieś u dołu
  21. 4. wpisz w terminalu 'pip install pynput pyautogui', poczekaj na zakończenie instalacji
  22.  
  23. WAŻNE: zwróć teraz uwagę na sekcję 'USTAWIENIA', znajduje się ona ok. 160 linijki.
  24.       masz w niej wyjaśnione czego dotyczy każda zmienna. najlepiej zapoznaj się z nią teraz
  25.  
  26. 5. teraz otwórz kara. zauważ, że gdy wejdziesz w istniejący już temat to formularz do postowania znajdzie się
  27.   nieco niżej niż przy lurkowaniu samej deski. musisz usunąć ublockiem elementy za to odpowiedzialne, manualnie albo
  28.   po prostu wklej te filtry:
  29.   karachan.org##.postingMode
  30.   karachan.org##body > .navLinks
  31.   skrypt polega na wskazanych współrzędnych na ekranie, jeden raz - przy starcie. ich zmiana wszystko rozjebie
  32. 6. po feralnym uruchomieniu skryptu musisz już tylko wskazać miejsce w którym znajdują się:
  33.    - pasek adresu
  34.    - pole wiadomości
  35.    - przycisk do załączenia pliku (zamknij okno eksploratora plików klikając esc)
  36.    - przycisk do wysłania posta (okno z błędem 'brak pliku' zamknij myszką)
  37.  
  38.   ale poczekaj
  39.  
  40. 7. skrypt nie ma pojęcia co się dzieje na ekranie. wszystko opiera się na oszacowanym czasie oczekiwania potrzebnym do wykonania
  41.   każdej akcji, przed zasrywaniem przetestuj podany przez siebie 'wait_factor' (zmienna odpowiedzialna za określenie
  42.   czasu oczekiwania po wykonaniu każdej akcji np czas uśpienia po przesłaniu posta jest jego dwukrotnością w sekundach,
  43.   dla innych akcji jest jakimś tam ułamkiem). test powinien przebiegać tak:
  44.    - upewnij się, że jesteś na samej górze strony, co do piksela
  45.    - sprawdź czy formularz odpowiedzi po otwarciu istniejącego tematu (ten u góry)
  46.      jest otwarty (to ustawienie jest zapamiętywane)
  47.    - jeżeli podpowiedzi do paska adresu całkowicie zasłaniają pole wiadomości - oddal lub przybliż widok
  48.    - wskaż poprawnie wszystkie współrzędne poza tą dla wysyłania - nie chcesz raidować
  49.      nie mając pewności, że skrypt działa poprawnie
  50.    - zostaw na chwilę, obserwuj czy nie popełnia błędów
  51. 8. uruchom skrypt we właściwy sposób:
  52.    - upewnij się, że jesteś na samej górze strony, co do piksela
  53.    - sprawdź czy formularz odpowiedzi w istniejących tematach jest otwarty
  54.    - jeżeli podpowiedzi do paska adresu całkowicie zakrywają pole wiadomości - oddal lub przybliż widok
  55.    - wskaż poprawnie wszystkie współrzędne
  56.    - zacznie działać
  57.    - teraz upewnij się tylko że 'wait_factor' jest wystarczający również dla czasu potrzebnego do wysłania posta
  58.      ^ nie jest to konieczne gdy podana wartość została już przetestowana
  59.  
  60. Przy pierwszym raidzie obserwuj zachowanie skryptu
  61. '''
  62.  
  63. import os
  64. import pyautogui
  65. from pynput import mouse
  66. import pyperclip
  67. import platform
  68. import random
  69. import time
  70. from math import floor
  71.  
  72.  
  73.  
  74. biblia = ["xd","xD",";d",":D",";D",":O",":s",":)",":(",";)","8D","8)",":3",";3","^^","XD",":-)",":P",";p",";P",":p",":-P",":-("]
  75.  
  76.  
  77. hipis = [
  78.     'no ja to po prostu naprawdę nie wiem jak można mnie kurwa nie kochać',
  79.     'pevaćemo igraćemo napićemo se',
  80.     'noo kolego stare baby są moje',
  81.     'mode pedał z karachuja zobaczył putasa nic mu kundel nie mógł zrobić possał mu kutasa',
  82.     'jebana przygłupia kurwa zza konsolety',
  83.     'do budy i morda kurwo wulkaniarska',
  84.     'no to by trzeba twoją matkę spytać',
  85.     'no i do budy pędzlata kurwo przecwelona',
  86.     'nie chciałbym nikogo martwić ani denerwować ale podobno na tej marnej nędznej parodii czana ukrywa się hipis',
  87.     'nawet fajne te hipisy daję okejkę i soga',
  88.     'karaczana lurkować chciałem ale nie z modem z diskorda pedałem',
  89.     'karaczan kurwa raczej rakaczan srakaczan',
  90.     'noo twoją matkę w szczególności',
  91.     'do trzech razy sztuka gdy się wam starą puka',
  92.     'wulkan kurwa przecwelona spermę wyjada z kondoma',
  93.     'do budy',
  94.     'hipisław czana zbaw',
  95.     'zawsze i wszędzie hipis najlepszy będzie',
  96.     'hipis grasuje hipis grasuje głupie diskurwy on reguluje',
  97.     'kundel niech spierdala',
  98.     'diskurwy chuja mogą jak zwykle zresztą',
  99.     'wulkan ty cwelu jebany',
  100.     'zawsze i wszędzie moderatorska kurwa jebana będzie',
  101.     'do budy diskurwy',
  102.     'na chuj wy kundle żyjecie',
  103.     'popłacz się kundlu jebany',
  104.     'ale chujnia na tej parodii czana',
  105.     'moderatorskiej kurwie zawsze chuj do mordy',
  106.     'obawiam się że tu gdzieś hipis grasuje',
  107.     'a ja na kara sram',
  108.     'do budy kurwo moderatorska przecwelona',
  109.     'Jakub Putowski jest dla mnie najlepszy',
  110. ]
  111.  
  112.  
  113.  
  114. odmety = [
  115.     'and your ban expires on 05/03/2137',
  116.     'A JA NA KARA SRAM',
  117.     'ZAWSZE I WSZĘDZIE MODERATORSKA KURWA JEBANA BĘDZIE',
  118.     'MODERATORSKIEJ KURWIE ZAWSZE CHUJ DO MORDY',
  119.     'and your ban expires [b]never[/b].',
  120.     'forsorak',
  121.     'hipis',
  122.     '[b]NIEDOGODNOŚĆ?[/b]',
  123.     'You have been [b]permamently[/b] banned from [b]all[/b] boards',
  124.     'rak',
  125.     'atencja; dawanie atencji',
  126.     'WULKAN KURWA PRZECWELONA SPERMĘ WYJADA Z KONDOMA',
  127.     'You are banned ;_;',
  128.     '[b]*Range ban[/b] - to oznacza, ty pierdolony idioto, że NIE otrzymałeś bana personalnie ty jako ty, tylko cały zakres twojej sieci. Innymi słowy raczyć mógł ktokolwiek, z kim dzielisz zakres numerów IP.',
  129.     'na twoim zakresie grasuje hipis',
  130.     'forsowanie',
  131.     '[b]UBOLEWANIE?[/b]',
  132.     'Powód:',
  133.     'Zostałeś zbanowany!',
  134.     'You may not appeal your ban.',
  135.     'MODE PEDAŁ Z KARACHUJA ZOBACZYŁ PUTASA NIC MU KUNDEL NIE MÓGŁ ZROBIĆ POSSAŁ MU KUTASA',
  136.     'RAKACZAN SRAKACZAN',
  137.     '[b]ZGRYZOTA?[/b]',
  138.     'OBAWIAM SIĘ ŻE TU GDZIEŚ HIPIS GRASUJE',
  139.     'DO BUDY KURWO MODERATORSKA PRZECWELONA',
  140.     'There are more than one bans placed on your IP',
  141.     'raid',
  142.     'which is 72 days from now.',
  143.     'You have been [b]permamently range*-[/b]banned',
  144.     'hipis',
  145. ]
  146.  
  147.  
  148.  
  149.  
  150.  
  151. # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  152.  
  153. '''
  154.  
  155.  
  156. To są twoje USTAWIENIA - jedyne parametry, które należy zmienić
  157.  
  158. apply_bible     -   dokleja do wiadomości biblijne emotki (True, False)
  159. shutdown        -   zamknąć system po zasrywaniu? (windows albo systemd)
  160. obfuscate       -   użyje unicodów to ominięcia słowofiltrów, mode może przyjebać również słowofiltr
  161.                    na unicody, wtedy = False i nie używaj już biblii oraz moich list (ew popraw je)
  162. board           -   obecnie zasrywana deska, ważne (np = 'karachan.org/trv')
  163. path            -   np /home/user/hipis dla Linuxa, na windowsie np C:\Users\Anon\hipis, może prowadzić tylko
  164.                    do folderu, nie bezpośrednio do pliku
  165. start_time      -   godzina o której zacznie zasrywać np '01:37', przy ustawieniu 'teraz' nie będzie czekać wcale
  166. message_source  -   wybrana wiadomość, zwykły tekst (= "mode kundel") lub cała lista
  167. cooldown        -   opcjonalny cooldown w sekundach
  168. target_size_mb  -   określa docelową wagę pliku, pośrednio liczbę załączonych bajtów. uwzględnij szybkość swojego łącza
  169.                    oraz rozmiar swoich plików - za mało doklejonych bajtów oznacza prawdopodobieństwo otrzymania duplikatu.
  170. wait_factor     -   niektóre komputery działają wolniej, chujowe łącze też nie pomaga. podana wartość pozwala określić
  171.                    czas oczekiwania na wykonanie każdej akcji (kliknięcie, przesłanie, wklejenie itd.)
  172.                    ^ (WAŻNE: przetestuj to ustawienie przed faktycznym użyciem, wypełnij polecenia z INSTRUKCJI)
  173. '''
  174. apply_bible = True
  175. shutdown = False
  176. obfuscate = False
  177. board = 'karachan.org/b' #ważne
  178. path = f'C:/home/users/User/twoj folder' # koniecznie folder, nie plik. pamiętaj: to 'f' musi tam być
  179. start_time = 'teraz' # 'teraz' zaczyna natychmiast, a np = '1:37' poczeka
  180. message_source = hipis # lub np = "JEBAĆ MODERACJĘ" albo jedna z list powyżej: hipis, odmety
  181. cooldown = 0 # a jak ci zależy to np: random.choice(range(0, 20)) albo po prostu jakaś wartość
  182. target_size_mb = 10 # nie może przekroczyć 11.9
  183. wait_factor = 10 # testowane dla łącza 1gb/s i mocniejszego kompa przy target_size_mb = 11.9
  184.  
  185.  
  186.  
  187. # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
  188.  
  189. allowed_extensions = ('.png', '.jpg', '.gif', '.mp4', '.webm') #'.png', '.jpg', '.gif', '.mp4', '.webm'
  190. my_threads = []
  191. banned, sent = False, False
  192. prev_message = ''
  193. post_count, bump_count, i = 0, 0, 0
  194.  
  195.  
  196. def get_click_position():
  197.     coordinates = []
  198.  
  199.     def on_click(x, y, button, pressed):
  200.         if button == mouse.Button.left and pressed:
  201.             coordinates.append((x, y))
  202.             return False  # kills the listener
  203.  
  204.     with mouse.Listener(on_click=on_click) as listener:
  205.         listener.join()  # catch the moment when the listener stops
  206.  
  207.     x, y = coordinates[0]
  208.     print(f"{x}, {y}")
  209.     return x, y
  210.  
  211. def sytem_shutdown ():
  212.     if platform.system() == 'Linux':
  213.         os.system('shutdown now') #systemd
  214.     elif platform.system() == 'Windows':
  215.         os.system('shutdown /s /f /t 0')
  216.     else: print('spierdalaj')
  217.  
  218. def where_to_click ():
  219.     print('\npole adresowe')
  220.     address = get_click_position()
  221.     print('\npole wiadomości')
  222.     message = get_click_position()
  223.     print('\n"wybierz plik"')
  224.     file = get_click_position()
  225.     print('\nwyslij wiadomosc')
  226.     send = get_click_position()
  227.     print('\nok\n')
  228.  
  229.     return address, message, file, send
  230.  
  231. def wait(target_time_str):
  232.     if target_time_str == 'teraz': return
  233.  
  234.     target_hour, target_minute = map(int, target_time_str.split(":"))
  235.  
  236.     current_time = time.localtime()
  237.     current_hour = current_time.tm_hour
  238.     current_minute = current_time.tm_min
  239.     current_second = current_time.tm_sec
  240.  
  241.     current_total_seconds = current_hour * 3600 + current_minute * 60 + current_second
  242.     target_total_seconds = target_hour * 3600 + target_minute * 60
  243.  
  244.     if target_total_seconds <= current_total_seconds:
  245.         target_total_seconds += 24 * 3600  # skip to the next day
  246.  
  247.     wait_time = target_total_seconds - current_total_seconds
  248.  
  249.     wait_time_hours = str(round(wait_time/3600)) + 'h i ' +  str(round((wait_time%3600)/60)) + ' min'
  250.     print('zaczynam zasrywanie o', target_time_str, 'czyli za', wait_time_hours, '\naktualna godzina to', time.strftime("%H:%M"))
  251.  
  252.     time.sleep(wait_time)
  253.     print('no to jechane z tym koksem')
  254.     time.sleep(4)
  255.  
  256.  
  257.  
  258. def copy_to_clipboard(text):
  259.     pyperclip.copy(text)
  260.     time.sleep(wait_factor * 0.05)
  261.  
  262. def paste_text(text):
  263.     copy_to_clipboard(text)
  264.     time.sleep(wait_factor * 0.05)
  265.     pyautogui.hotkey('ctrl', 'v')
  266.  
  267. def click(loc, wait_time):
  268.     pyautogui.click(loc)
  269.     time.sleep(wait_time)
  270.  
  271. def press(key, wait_time):
  272.     pyautogui.press(key)
  273.     time.sleep(wait_time)
  274.  
  275. def hotkey(hot_key, wait_time):
  276.     pyautogui.hotkey(hot_key)
  277.     time.sleep(wait_time)
  278.  
  279.  
  280.  
  281. def post(message, relatywny, message_loc, file_loc, address_loc, send_loc):
  282.     #paste message
  283.     click(message_loc, wait_factor * 0.01)
  284.     paste_text(message)
  285.     #załącz relatywny
  286.     click(file_loc, wait_factor * 0.05)
  287.     paste_text(relatywny)
  288.     press('enter', wait_factor * 0.05)
  289.     #wyślij, poczekaj aż się załaduje
  290.     click(send_loc, wait_factor * 2)
  291.     #pobierz adres, zapamiętaj freda do bumpów
  292.     click(address_loc, wait_factor * 0.01)
  293.     hotkey(('ctrl', 'c'), wait_factor * 0.01)
  294.     click(message_loc, wait_factor * 0.01)
  295.     address = pyperclip.paste()
  296.  
  297.     if address == 'https://karachan.org/imgboard.php': return False
  298.  
  299.     my_threads.append(address)
  300.  
  301.     #powrót na deskę
  302.     click(address_loc, wait_factor * 0.01)
  303.     press('backspace', wait_factor * 0.01)
  304.     paste_text(board)
  305.     press('enter', wait_factor * 0.5)
  306.  
  307. def bump(message, relatywny, message_loc, file_loc, address_loc, send_loc):
  308.     thread = my_threads[0]
  309.  
  310.     click(address_loc, wait_factor * 0.01)
  311.     press('backspace', wait_factor * 0.01)
  312.     paste_text(thread)
  313.     press('enter', wait_factor * 0.5)
  314.  
  315.     click(message_loc, wait_factor * 0.01)
  316.     paste_text(message)
  317.  
  318.     click(file_loc, wait_factor * 0.1)
  319.     paste_text(relatywny)
  320.     press('enter', wait_factor * 0.1)
  321.  
  322.     click(send_loc, wait_factor * 2)
  323.  
  324.     my_threads.remove(thread)
  325.     my_threads.append(thread)
  326.  
  327.     click(address_loc, wait_factor * 0.01)
  328.     press('backspace', wait_factor * 0.01)
  329.     paste_text(board)
  330.     press('enter', wait_factor * 0.5)
  331.  
  332. def append_bytes(file_path, dir, i, target_size_mb):
  333.     output_dir = os.path.join(dir, 'mod')
  334.  
  335.     try:
  336.         if not os.path.exists(output_dir):
  337.             os.makedirs(output_dir)
  338.  
  339.         target_size_bytes = floor(target_size_mb * 1024 * 1024)
  340.         current_size = os.path.getsize(file_path)
  341.         bytes_to_add = target_size_bytes - current_size
  342.  
  343.         if bytes_to_add <= 0:
  344.             print(f"The file is already {current_size} bytes, which is larger than or equal to the target size.")
  345.             return
  346.  
  347.         random_bytes = bytearray(random.getrandbits(8) for _ in range(bytes_to_add))
  348.  
  349.         output_file_path = os.path.join(output_dir, str(i)+os.path.splitext(file_path)[1])
  350.  
  351.         with open(file_path, 'rb') as src_file:
  352.             with open(output_file_path, 'wb') as dest_file:
  353.                 dest_file.write(src_file.read())
  354.  
  355.         with open(output_file_path, 'ab') as file:
  356.             file.write(random_bytes)
  357.  
  358.         return output_file_path
  359.  
  360.     except Exception as e:
  361.         print(f"An error occurred: {e}")
  362.  
  363. def obfuscate_source():
  364.     obfuscated_sentences = []
  365.     forbidden_list = [
  366.         "xd","xD",";d",":D",";D",":O",":s",":)",":(",";)","8D","8)",":3",";3","^^","XD",":-)",":P",";p",";P",":p",":-P",":-(",
  367.         "dis","putas","kund","piastows",
  368.         "wulkan","przecwe","moderatorsk","zawsze","parodii","spermę","rakaczan","pędz","kurwa","konsolet","karach","possał","hipis","bud","mord"
  369.         # ta ostatnia linijka trochę losowo dojaban bo zacząłem się głubić w tych słowofiltrach
  370.     ]
  371.  
  372.     def obfuscate_word(word):
  373.         for forbidden_pattern in forbidden_list:
  374.             if forbidden_pattern in word.lower():
  375.                 word = word.replace('a', 'а')
  376.                 word = word.replace('A', 'Α')
  377.                 word = word.replace('d', 'ԁ')
  378.                 word = word.replace('D', 'Ꭰ')
  379.                 word = word.replace('i', 'і')
  380.                 word = word.replace('p', 'р')
  381.                 word = word.replace('P', 'Р')
  382.                 word = word.replace('s', 'ѕ')
  383.                 word = word.replace('S', 'Ѕ')
  384.                 word = word.replace('T', 'Τ') #3a4
  385.                 word = word.replace(':', '։')
  386.                 word = word.replace(';', ';')
  387.                 word = word.replace(')', ')')
  388.                 #word = word.replace('^^', 'dupa') na chwilę obecną niepotrzebny
  389.  
  390.         return word
  391.  
  392.     for sentence in message_source:
  393.         words = sentence.split()
  394.         redacted_words = [obfuscate_word(word) for word in words]
  395.         obfuscated_sentences.append(' '.join(redacted_words))
  396.  
  397.     for item in biblia:
  398.         words = item.split()
  399.         redacted_words = [obfuscate_word(word) for word in words]
  400.         obfuscated_sentences.append(' '.join(redacted_words))
  401.  
  402.  
  403.     return obfuscated_sentences
  404.  
  405. def random_embed(embeds):
  406.    if not embeds:
  407.       raise ValueError('brak plikow o odpowiednich rozszerzeniach')
  408.  
  409.    return os.path.join(path, random.choice(embeds))
  410.  
  411.  
  412.  
  413.  
  414.  
  415.  
  416. def main ():
  417.     is_list = type(message_source) == list
  418.     is_path_dir = os.path.isdir(path)
  419.     embeds = [rel for rel in os.listdir(path) if rel.lower().endswith((allowed_extensions))]
  420.  
  421.     print(' '+str(len(message_source)) + ' wiadomosci\n' if is_list else "jedna wiadomosc", len(embeds), 'relatywnych\n')
  422.  
  423.     address_loc, message_loc, file_loc, send_loc = where_to_click()
  424.  
  425.     if obfuscate: obfuscate_source()
  426.     wait(start_time)
  427.  
  428.     last_post_time = time.time() - 300
  429.     last_bump_time = time.time()
  430.     exec_start = time.time()
  431.  
  432.     while not banned:
  433.         print('moje tematy: [\n', "\n".join(str(thread) for thread in my_threads)+'\n]')
  434.         # relatywny i wiadomość
  435.         if is_list:
  436.            message = random.choice(message_source)
  437.            while message == prev_message:
  438.                message = random.choice(message_source)
  439.            prev_message = message
  440.         else:  message = message_source
  441.  
  442.         if apply_bible == True:
  443.             message = message + ' ' + random.choice(biblia)
  444.  
  445.         if is_path_dir:
  446.            embed = random_embed(embeds)
  447.         elif not is_path_dir:
  448.            embed = path
  449.         else:
  450.            raise ValueError(f" '{path}' nie istnieje")
  451.  
  452.         embed = append_bytes(embed, path, i, target_size_mb)
  453.         i = i + 1
  454.  
  455.         # wysyłanie
  456.         while not sent:
  457.             if time.time() - last_post_time >= 300: # cooldown po nowym temacie
  458.                 print('\nNOWY POST', '\n', message, '\n', embed)
  459.                 if post(message, embed, message_loc, file_loc, address_loc, send_loc) != False:
  460.                     print('\n\n b a n')
  461.                     banned = True
  462.                 last_post_time = time.time()
  463.                 sent = True
  464.                 post_count+=1
  465.             elif time.time() - last_bump_time >= 20: # cooldown po bumpie
  466.                 print('\nBUMP', my_threads[0], '\n', message, '\n', embed)
  467.                 bump(message, embed, message_loc, file_loc, address_loc, send_loc)
  468.                 last_bump_time = time.time()
  469.                 sent = True
  470.                 bump_count+=1
  471.             else:
  472.                 time.sleep(0.1)
  473.         sent = False
  474.  
  475.  
  476.     if shutdown:
  477.         sytem_shutdown()
  478.     else:
  479.         exec_time_hm = str(round((time.time()-exec_start)/3600)) + ':' +  str(round(((time.time()-exec_start)%3600)/60))
  480.         print('\nkoniec zasrywania', 'posty:', post_count, '\nbumpy:', bump_count, '\nw przeciągu:', exec_time_hm, '\n(orientacyjnie)')
  481.  
  482.  
  483.  
  484.  
  485.  
  486. if __name__ == '__main__':
  487.     main()
  488.  
Add Comment
Please, Sign In to add comment