Vinnaren i pepparkakshustävlingen!
2023-06-29, 15:49
  #1
Avstängd
Skitungen43s avatar
Hej alla! Jag undrar om det är möjligt att använda Selenium för att få ut nedladdningslänkar till delningar i Telegram. Jag skulle vilja göra detta direkt från grupper på webbadressen https://web.telegram.org/k/, utan att behöva bjuda in en bot till gruppen.

Det jag önskar är att kunna göra följande med Selenium:

Logga in på Telegram och navigera till webbplatsen.
Gå in i en grupp som redan finns i listan.
Extrahera alla nedladdningsbara filers URL:er och ladda ner filerna, inklusive foton, om de inte redan finns i nedladdningskatalogen så starta en nedladdning via webläsaren.
Citera
2023-06-29, 22:01
  #2
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Skitungen43
Hej alla! Jag undrar om det är möjligt att använda Selenium för att få ut nedladdningslänkar till delningar i Telegram. Jag skulle vilja göra detta direkt från grupper på webbadressen https://web.telegram.org/k/, utan att behöva bjuda in en bot till gruppen.

Det jag önskar är att kunna göra följande med Selenium:

Logga in på Telegram och navigera till webbplatsen.
Gå in i en grupp som redan finns i listan.
Extrahera alla nedladdningsbara filers URL:er och ladda ner filerna, inklusive foton, om de inte redan finns i nedladdningskatalogen så starta en nedladdning via webläsaren.
Jag gillar inte Telegram (för mycket rysk desinformation) och är sällan inne på den. Utan att (därför) veta om strukturen på Telegrams hemsida, så låter det som du listar fullt möjligt att göra med Selenium. Skulle till och med säga att det är relativt trivialt.

Om du har tillgång till Chat GPT (helst v4) så skulle jag tro att du relativt snabbt kan få förslag på fungerande kod samt installationsinstruktioner för Selenium.

Edit: Jag testade nu din länk och såg att det är en QR-kod att köras från din mobil. Om det inte finns något annat sätt att logga in så innebär det nog att du först måste logga in manuellt och sedan köra ditt Selenium-skript. Jag tror inte du kan greja en sådan QR-inloggning med Selenium. Då får man använda någon form av automatisering också på telefonen och då börjar det bli komplicerat.
__________________
Senast redigerad av Enterprise 2023-06-29 kl. 22:05.
Citera
2023-06-30, 14:16
  #3
Avstängd
Skitungen43s avatar
Citat:
Ursprungligen postat av Enterprise
Jag gillar inte Telegram (för mycket rysk desinformation) och är sällan inne på den. Utan att (därför) veta om strukturen på Telegrams hemsida, så låter det som du listar fullt möjligt att göra med Selenium. Skulle till och med säga att det är relativt trivialt.

Om du har tillgång till Chat GPT (helst v4) så skulle jag tro att du relativt snabbt kan få förslag på fungerande kod samt installationsinstruktioner för Selenium.

Edit: Jag testade nu din länk och såg att det är en QR-kod att köras från din mobil. Om det inte finns något annat sätt att logga in så innebär det nog att du först måste logga in manuellt och sedan köra ditt Selenium-skript. Jag tror inte du kan greja en sådan QR-inloggning med Selenium. Då får man använda någon form av automatisering också på telefonen och då börjar det bli komplicerat.

Det finns mer än bara desinformation på denna plattformen det vill jag klargöra ;--) ;--)
Citera
2023-06-30, 14:54
  #4
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Skitungen43
Det finns mer än bara desinformation på denna plattformen det vill jag klargöra ;--) ;--)
Absolut, ibland svårt att sålla agnarna från vetet, bara.

Men prova att logga in manuellt och så ber du Chat GPT om hjälp med Selenium-skriptet (utgår från att du kör Python). Felkoder klistrar du bara in direkt i prompten på GPT så får du justerade skriptförslag.
Citera
2023-06-30, 15:45
  #5
Avstängd
Skitungen43s avatar
Problemet är att Telegram via grupper inte går att använda på samma sätt då det är "wss" och man egentligen måste bjuda in en bot. Här kan vi se ett exempel där jag har skapat kod för att hämta länkar från offentliga kanaler, men jag skulle vilja göra samma sak med privata grupper. Det verkar dock vara mycket svårare att åstadkomma det. Jag undrar om det finns några andra tips eller förslag på hur man kan lösa det här problemet. Selenium var bara ett exempel på något jag tror skulle kunna användas, men jag är öppen för andra förslag.

Kod:
import argparse
import requests
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor, as_completed
from tqdm import tqdm
import subprocess
import os

output_file = "filtered_links.txt"
post_processing_script = "post_processing_script.py"
extreme_downloader_script = "start-extreme-downloader.awk"

file_types = [".zip", ".xml", ".pdf", ".txt", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx",
              ".csv", ".json", ".png", ".jpg", ".jpeg", ".gif", ".bmp", ".mp3", ".wav", ".mp4",
              ".avi", ".mov", ".flv", ".swf", ".rar", ".7z", ".tar", ".gz", ".bz2", ".exe", ".dll",
              ".jar", ".py", ".java", ".cpp", ".h", ".html", ".css", ".js", ".php", ".asp", ".jsp",
              ".md", ".sql", ".svg", ".ico", ".iso", ".dat", ".cfg", ".log", ".ini", ".bak"]

def filter_links(links):
    filtered_links = []
    for link in links:
        href = link.get("href")
        if href and href.startswith("https"):
            for file_type in file_types:
                if file_type in href:
                    filtered_link = href.split('?')[0]
                    filtered_links.append(filtered_link)
                    break
    return filtered_links

def process_page(page):
    url = base_url
    response = requests.get(url)
    soup = BeautifulSoup(response.text, "html.parser")
    links = soup.find_all("a")
    filtered_links = filter_links(links)
    return filtered_links

parser = argparse.ArgumentParser()
parser.add_argument("-u", "--url", help="URL för att hämta länkar från")
parser.add_argument("--pwn", action="store_true", help="Anropa extreme downloader")
parser.add_argument("-p", "--parallel", type=int, help="Antal sidor som bearbetas parallellt")
args = parser.parse_args()

if not args.url:
    print("URL måste anges med flaggan -u eller --url.")
    exit()

if not args.url.startswith("https://t.me/s/"):
    print("URL måste vara en offentlig Telegram-kanal.")
    exit()

base_url = args.url
start_page = 1
end_page = 1790
concurrent_pages = args.parallel or 30

all_filtered_links = []
with ThreadPoolExecutor(max_workers=concurrent_pages) as executor, \
    tqdm(total=end_page - start_page + 1, desc="Bearbetar sidor") as pbar:

    future_to_page = {executor.submit(process_page, page): page for page in range(start_page, end_page+1)}
    for future in as_completed(future_to_page):
        page = future_to_page[future]
        filtered_links = future.result()
        all_filtered_links.extend(filtered_links)
        pbar.update(1)

with open(output_file, "w") as f:
    for link in all_filtered_links:
        f.write(link + "\n")

print("Filtrerade länkar har sparats i filen:", output_file)

print("Filtrerade länkar:")
for link in all_filtered_links:
    print(link)

with open(output_file, "r") as f:
    filtered_links_content = f.read()

if input("Vill du starta start-extreme-downloader.awk? (y/n): ").lower() == "y":
    subprocess.run(["awk", "-f", extreme_downloader_script, filtered_links_content])

Kod:
python3 python3.py -u https://t.me/s/MotoUpdatesTracker?before={} --parallel 25

Länkarna från privata grupper är inte tillgängliga med denna metod eftersom det krävs en botinbjudan. Detta exempel är från en publik kanal för Motorola som länkar till firmware för deras telefoners ROM och hämta ut urler.

Kod:
https://rsddownload-secure.lenovo.com/AUSTIN_G_T1SA33.73-40_subsidy-CCAWS_regulatory-DEFAULT_cid50_R7_CFC.xml.zip
https://rsddownload-secure.lenovo.com/GNEVAN_G_T1THS33.75-12-6-1_subsidy-CRICKET_RSU_regulatory-DEFAULT_cid51_CFC.xml.zip
.......

Den kommer att gå igenom alla 1790 sidor och filtrera ut länkarna, men hur gör jag detta med en privat grupp? Det är frågan
__________________
Senast redigerad av Skitungen43 2023-06-30 kl. 15:48.
Citera
2023-06-30, 16:09
  #6
Avstängd
Skitungen43s avatar
Här är en liknande historia i JavaScript. Det behöver eventuellt inte vara just JavaScript eller Python, men eftersom Telegram använder "blob:" och det är "wss", verkar det svårt att få ut privata gruppers delningar utan att bjuda in en bot. Det är bara det. Här är en variant i JavaScript som kommer att crawl'a alla sidor, 50 stycken rekursivt, i Google Developer Console. När det är klart, dumpar vi alla URL:er vi har hittat till en ny flik och startar sedan mitt AWK-program (detta är inte ett krav de är bara hur jag gör det idag)


Kod:
let crawledUrls = [];
let pendingUrls = ['https://t.me/s/MotoUpdatesTracker?before=1'];
let totalPages = 50;

const crawl = async () => {
  while (pendingUrls.length && crawledUrls.length < totalPages) {
    let urlsToCrawl = pendingUrls.splice(0, 50); // Number of concurrent requests: 50
    let crawlPromises = urlsToCrawl.map(async (url) => {
      if (crawledUrls.includes(url)) return;
      console.log(`Crawling ${url}`);
      try {
        let response = await fetch(url);
        let text = await response.text();
        let parser = new DOMParser();
        let doc = parser.parseFromString(text, 'text/html');
        let anchors = doc.getElementsByTagName('a');
        for (let i = 0; i < anchors.length; i++) {
          let href = anchors[i].href;
          if (!crawledUrls.includes(href) && !pendingUrls.includes(href)) {
            pendingUrls.push(href);
          }
        }
      } catch (err) {
        console.error(`Failed to crawl "${url}": ${err}`);
      }
      crawledUrls.push(url);
    });
    await Promise.all(crawlPromises);
  }
  console.log('Finished crawling');
  console.log(crawledUrls);
  console.log(`Total URLs crawled: ${crawledUrls.length}`);
  console.log(`Total URLs found: ${pendingUrls.length}`);

  // Dumpa länkar i en ny flik
  let linksList = "<ul>";
  for (let i = 0; i < crawledUrls.length; i++) {
    linksList += `<li><a href="${crawledUrls[i]}" target="_blank">${crawledUrls[i]}</a></li>`;
  }
  linksList += "</ul>";

  let newTab = window.open("about:blank", "_blank");
  newTab.document.write("<h1>Skrapade länkar:</h1>");
  newTab.document.write(linksList);
};

crawl();

Om du bara besöker länken https://t.me/s/MotoUpdatesTracker?before=1 och kopierar och klistrar in den i verktyget kommer det att börja hämta och extrahera alla URL:er från den publika Telegram-gruppen. Du behöver inte använda specifika programmeringsspråk som Python, JavaScript eller verktyg som awk. Jag är öppen för alla förslag som kan användas för att få fram länkar från en privat Telegram-grupp, eftersom web.telegram.com inte fungerar för detta ändamål tyvärr.

Jag är osäker på om tråden är rätt placerad, och den kanske skulle ha lagts i "Huvudforumet". Jag är öppen för förslag och tänkte bara på Selenium som ett alternativ eftersom det kan använda webbläsaren för att försöka hämta nedladdningarna på det sättet. Det viktigaste är att jag kan ladda ner filerna utan att de skrivs över (no-clobbering) när jag tänkt använda det för att automatisera nedladdningarna.

Jag har försökt det mesta, autoscrollat i gruppen i telegram då det inte är "sidor" utan man scrollar ner och sedan försökte jag dumpa alla urler för varje ny "expand" men det blir som sagt inga urler p.g.a av att dom är "inbbygda" i telegram på något vis jag vet inte exakt hur de funkar heller riktigt jag bara hänger i grupper för att ladda ner olika saker och vill ha en "auto downloader" som skall köras lite då och då för att hämta senaste firmware (te.x) och den skall bara se ifall om filen finns, isåfall hoppa över liknande variant:

Kod:
[ -e "exempel.txt" ] && echo "Filen existerar." || echo "Filen existerar inte, ladda ner den"

Ganska enkel grej men extremt svår iom telegram verkar ha någon special variant hur dom hanterar länkar.

I Telegram Desktop-klienten finns det en funktion som heter "autodownloading" där du kan ladda ner filer automatiskt upp till 4 GB i privata chattar, grupper och kanaler så på något sätt borde man ju kunna få ut länkarna utan att den klienten: telegram-autodownloader-exempel-på-bilder Jag skulle kunna åstadkomma samma sak genom att skapa ett program som öppnar Telegram Desktop, bläddrar igenom chattarna och skapar en egen historia där jag kan navigera runt i klienten. Det är dock inte en särskilt elegant lösning och jag skulle vilja ha det på ett rätt sätt, det vill säga en enkel autodownloader där jag kan välja att sortera filerna på ett enklare sätt än att behöva ladda ner alla filer till exempelvis Telegram Desktop/Downloads och sedan använda inotifywait-ng eller liknande verktyg för att sortera dem efter filändelse till rätt mapp. Det är helt enkelt fel och fult sätt att göra det, även om det fungerar. Det är mitt sista alternativ, så jag hoppas att någon kanske har tips som kan ge mig möjligheten att uppnå det jag önskar.
__________________
Senast redigerad av Skitungen43 2023-06-30 kl. 16:24.
Citera
2023-06-30, 21:32
  #7
Medlem
Enterprises avatar
Citat:
Ursprungligen postat av Skitungen43
Här är en liknande historia i JavaScript.
Kollat på detta?
https://os2int.com/toolbox/batch-scr...-using-tg-api/
Citera
2023-07-01, 11:03
  #8
Avstängd
Skitungen43s avatar
Citat:
Ursprungligen postat av Enterprise
Kollat på detta?
https://os2int.com/toolbox/batch-scr...-using-tg-api/

Jag känner till tg api, men har inte tidigare tittat på det noggrant men jag har lyckats få ihop en lösning nu i alla fall.

För att genomföra processen använder jag ett Python-skript som kör min vanliga Google Chrome-webbläsare. Jag har redan sparade tokens som tillåter mig att besöka varje kanal individuellt. Detta är inte särskilt svårt att göra. Sedan kommer jag att använda en superscroll-funktion som scrollar upp och ner på sidan under en given tidsperiod. När nedladdningarna är klara, stänger jag fönstret genom att använda en timeout. Nedladdningarna från Telegram går väldigt snabbt, med hastigheter på upp till gigabit per sekund, och jag kan i princip ladda ner hur många filer som helst. Detta gör att jag kan få en snabb och effektiv process. Jag tror inte att det finns någon annan metod som är lika effektiv utan att ha en bot inne i en kanal/grupp. Nedan är JavaScript-koden jag tänkte använda. Den kommer att scrolla upp och ner snabbt och "autodownload" kommer att starta alla nedladdningar parallellt, fort skall det gå.

Kod:
function scrollBottomTop() {
  const scrollHeight = document.documentElement.scrollHeight;
  const viewportHeight = window.innerHeight;

  let scrollTop = 0;
  let scrollIncrement = viewportHeight;
  let scrollDirection = 1;
  let iteration = 0; 

  function scroll() {
    scrollTop += scrollIncrement * scrollDirection;

    if (scrollTop >= scrollHeight || scrollTop <= 0) {
      scrollDirection *= -1; 
    }

    window.scrollTo(0, scrollTop);

    if (scrollTop < scrollHeight || scrollTop > 0) {
      requestAnimationFrame(scroll);
    }

    iteration++; 
    if (iteration === 10) { 
      return;
    }
  }

  scroll();
}

scrollBottomTop();

Jag får nöja mig med detta tillsvidare, tills Telegram öppnar möjligheten för vanliga användare att ladda ner filer via länkar. Det är tyvärr inte tillåtet att bjuda in botarna i de mest intressanta kanalerna. Men jag är nöjd med den nuvarande lösningen som den är.

Tack för att du tog dig tid att kolla i alla fall.

Glömde nämna att det inte gick så enkelt som du tidigare var inne på att kringgå inloggningen på Telegram för deras extra skydd så därför fungerar det utmärkt att använda min vanliga webbläsare eftersom jag redan är inloggad där hela tiden. Det är därför jag valde den metoden.
__________________
Senast redigerad av Skitungen43 2023-07-01 kl. 11:09.
Citera
2023-07-08, 01:13
  #9
Avstängd
Karlaos avatar
Nu är detta inte Python, men här är din lösning ändå skriven i Golang och presenterad på ett enkelt sätt. Tog en sekund att få igång den laddade ner en färdig fil och sedan var det klart, fungerar på alla system enligt guiden.

Citat:
tdl download # Ladda ner vad som helst från Telegram (privat) chatt

Länk: https://github.com/iyear/tdl
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback