Calificación:
  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Perdido con código compartido
#1
Hola a todos.

Antes de comenzar a explicar el problema con el que me encuentro, quiero informar que soy nuevo en programación, llevo tan solo tres semanas en esto, y los conocimientos adquiridos han sido de forma autodidacta, de esta manera, pido que sean comprensibles con mi desconocimiento.

Hace dos días, hablando con un chico me paso un código que el mismo había creado, a partir del cual se puede monitorear productos de paginas web, para observar cuando vuelven a estar disponibles, teniendo como finalidad alojarlo en un servidor de discord. Una vez me paso este código, intenté configurarlo sin ningún tipo de éxito, debido en parte al desconocimiento que he comentado anteriormente. Me gustaria saber si hay alguien que ha tratado con codigo utilizado para este tipo de finalidad que estaría dispuesto a ayudarme a resolver ciertas dudas.

Aclarar que quiero esto para poder comprar ciertos articulos excluivos para uso propio, sin buscar ningun tipo de benificio economico a partir de reventar o actividades similares.

Un saludo y gracias de antemano.
Responder
#2
Hola Pablo, bienvenido.

Sí, no hay problema en darte una mano con eso, pero la única forma es que pegues el código o la parte del código que te genera conflictos acá, porque esa es la dinámica de un foro.

No obstante, si recién estás empezando en programación, tal vez no sea lo más conveniente ir de lleno a cosas muy avanzadas.

Saludos!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!
Responder
#3
(04-07-2020, 01:13 PM)Francisco escribió: Hola Pablo, bienvenido.

Sí, no hay problema en darte una mano con eso, pero la única forma es que pegues el código o la parte del código que te genera conflictos acá, porque esa es la dinámica de un foro.

No obstante, si recién estás empezando en programación, tal vez no sea lo más conveniente ir de lleno a cosas muy avanzadas.

Saludos!
Hola Francisco, muchísimas gracias por explicarme la mecánica del foro. Me dispongo a adjuntar el código, ademas de este, el chico que te comenté me adjunto otro archivo (discord_hooks.py) del cual, en teoria, y tal y cómo me comentó no tiene ningun problema, ademas de dos archivos de texto (proxies.txt y other_sites.txt) necesarios para el correcto funcionamiento.

Destacar que la primera linea de codigo que adjunto, es la linea 37, con el fin de que puedan relacionar estas lineas de codigo con las que adjunto en la screenshoot. A lado del codigo he escrito la linea que es, referente a la screenshoot, con el fin de poder facilitarles la visualización

Código

  1. import requests
  2. from bs4 import BeautifulSoup as soup
  3. import requests
  4. from log import log as log
  5. import time
  6. from datetime import datetime
  7. import random
  8. import sqlite3
  9. from bs4 import BeautifulSoup as soup
  10. from discord_hooks import Webhook
  11. from threading import Thread
  12.  
  13.  
  14. class Product():
  15.     def __init__(self, title, link, stock, keyword):
  16.         '''
  17.         (str, str, bool, str) -> None
  18.         Creates an instance of the Product class.
  19.         '''
  20.     
  21.         # Setup product attributes
  22.         self.title = title
  23.         self.stock = stock
  24.         self.link = link
  25.         self.keyword = keyword
  26.  
  27.  
  28. def read_from_txt(path):
  29.     '''
  30.     (None) -> list of str
  31.     Loads up all sites from the sitelist.txt file in the root directory.
  32.     Returns the sites as a list
  33.     '''
  34.  
  35.     # Initialize variables
  36.     raw_lines = []
  37.     lines = []
  38.  
  39.     # Load data from the txt file
  40.     try:
  41.         f = open(path, "r")
  42.         raw_lines = f.readlines()
  43.         f.close()
  44.  
  45.     # Raise an error if the file couldn't be found
  46.     except:
  47.         log('e', "Couldn't locate <" + path + ">.")
  48.         raise FileNotFound()
  49.  
  50.     if(len(raw_lines) == 0):
  51.         raise NoDataLoaded()
  52.  
  53.     # Parse the data
  54.     for line in raw_lines:
  55.         lines.append(line.strip("\n"))
  56.  
  57.     # Return the data
  58.     return lines
  59.  
  60.  
  61. def add_to_db(product):
  62.     '''
  63.     (Product) -> bool
  64.     Given a product <product>, the product is added to a database <products.db>
  65.     and whether or not a Discord alert should be sent out is returned. Discord
  66.     alerts are sent out based on whether or not a new product matching
  67.     keywords is found.
  68.     '''
  69.  
  70.     # Initialize variables
  71.     title = product.title
  72.     stock = str(product.stock)
  73.     link = product.link
  74.     keyword = product.keyword
  75.     alert = False
  76.  
  77.     # Create database
  78.     conn = sqlite3.connect('products.db')
  79.     c = conn.cursor()
  80.     c.execute("""CREATE TABLE IF NOT EXISTS products(title TEXT, link TEXT UNIQUE, stock TEXT, keywords TEXT)""")
  81.  
  82.     # Add product to database if it's unique
  83.     try:
  84.         c.execute("""INSERT INTO products (title, link, stock, keywords) VALUES (?, ?, ?, ?)""", (title, link, stock, keyword))
  85.         log('s', "Found new product with keyword " + keyword + ". Link = " + link)        
  86.         alert = True
  87.     except:
  88.         # Product already exists
  89.         pass
  90.         #log('i', "Product at URL <" + link + "> already exists in the database.")
  91.  
  92.     # Close connection to the database
  93.     conn.commit()
  94.     c.close()
  95.     conn.close()
  96.  
  97.     # Return whether or not it's a new product
  98.     return alert
  99.  
  100.  
  101. def send_embed(product):
  102.     '''
  103.     (Product) -> None
  104.     Sends a discord alert based on info provided.
  105.     '''
  106.  
  107.     url = 'https://discordapp.com/api/webhooks/728519194660044840/67DY4NDad2AsYqsPXuSuX9CbMS7g4nbj0pCmpfdXnbTT6fymwDVDvsx0BpdUNfBjRBXQ'
  108.  
  109.     embed = Webhook(url, color=123123)
  110.  
  111.     embed.set_author(name='NERYS', icon='https://static.zerochan.net/Daenerys.Targaryen.full.2190849.jpg')
  112.     embed.set_desc("Found product based on keyword " + product.keyword)
  113.  
  114.     embed.add_field(name="Link", value=product.link)
  115.  
  116.     embed.set_footer(text='NERYS by @snivynGOD', icon='https://static.zerochan.net/Daenerys.Targaryen.full.2190849.jpg', ts=True)
  117.  
  118.     embed.post()
  119.  
  120.  
  121. def monitor(link, keywords):
  122.     '''
  123.     (str, list of str) -> None
  124.     Given a URL <link> and keywords <keywords>, the URL is scanned and alerts
  125.     are sent via Discord when a new product containing a keyword is detected.
  126.     '''
  127.  
  128.     log('i', "Checking site <" + link + ">...")
  129.  
  130.     # Parse the site from the link
  131.     pos_https = link.find("https://")
  132.     pos_http = link.find("http://")
  133.  
  134.     if(pos_https == 0):
  135.         site = link[8:]
  136.         end = site.find("/")
  137.         if(end != -1):
  138.             site = site[:end]
  139.         site = "https://" + site
  140.     else:
  141.         site = link[7:]
  142.         end = site.find("/")
  143.         if(end != -1):
  144.             site = site[:end]
  145.         site = "http://" + site
  146.  
  147.     # Get all the links on the "New Arrivals" page
  148.     try:
  149.         r = requests.get(link, timeout=5, verify=False)
  150.     except:
  151.         log('e', "Connection to URL <" + link + "> failed. Retrying...")
  152.         time.sleep(5)
  153.         try:
  154.             r = requests.get(link, timeout=8, verify=False)
  155.         except:
  156.             log('e', "Connection to URL <" + link + "> failed.")
  157.             return
  158.  
  159.     page = soup(r.text, "html.parser")
  160.  
  161.     raw_links = page.findAll("a")
  162.     hrefs = []
  163.  
  164.     for raw_link in raw_links:
  165.         try:
  166.             hrefs.append(raw_link["href"])
  167.         except:
  168.             pass
  169.  
  170.     # Check for links matching keywords
  171.     for href in hrefs:
  172.         found = False
  173.         for keyword in keywords:
  174.             if(keyword.upper() in href.upper()):
  175.                 found = True
  176.                 if("http" in href):
  177.                     product_page = href
  178.                 else:
  179.                     product_page = site + href
  180.                 product = Product("N/A", product_page, True, keyword)
  181.                 alert = add_to_db(product)
  182.  
  183.                 if(alert):
  184.                     send_embed(product)
  185.  
  186. if(__name__ == "__main__"):
  187.     # Ignore insecure messages
  188.     requests.packages.urllib3.disable_warnings()
  189.  
  190.     # Keywords (seperated by -)
  191.     keywords = [
  192.         "monedero-con-llavero-monogram-000941",
  193.         "gold-toe",
  194.         "pharrell",
  195.         "free-throw-line",
  196.         "kendrick",
  197.         "tinker",
  198.         "game-royal",
  199.         "yeezy",
  200.         "human-race",
  201.         "big-bang",
  202.         "dont-trip",
  203.         "kung-fu-kenny",
  204.         "playstation",
  205.         "valentine",
  206.         "ovo-air-jordan",
  207.         "ovo-jordan",
  208.         "air-jordan-1",
  209.         "wotherspoon"
  210.     ]
  211.     
  212.     # Load sites from file
  213.     sites = read_from_txt("other-sites.txt")
  214.  
  215.     # Start monitoring sites
  216.     while(True):
  217.         threads = []
  218.         for site in sites:
  219.             t = Thread(target=monitor, args=(site, keywords))
  220.             threads.append(t)
  221.             t.start()
  222.             time.sleep(2)  # 2 second delay before going to the next site


A continuación adjunto un screenshoot con los problemas que me aparecieron.

https://gyazo.com/6b9af685d094dffc1381b2a7de990939

Muchas gracias por la ayuda ofrecida.
Responder
#4
Hola Pablo. Bien, por los errores que indica tu editor, parece que te falta instalar Requests. Tenés que ejecutar este comando en la consola:

Código:
pip install requests

Después te está marcando que hay dos clases que no existen: FileNotFound y NoDataLoaded. O te falta ahí una parte del código, o te faltan importarlas de otro archivo.

Como sea, para saber exactamente qué errores está tirando el programa, es mejor ejecutarlo y ver lo que se imprime en la consola, el editor de código no siempre es muy preciso con los errores.

Saludos!
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!
Responder
#5
(06-07-2020, 01:49 PM)Francisco escribió: Hola Pablo. Bien, por los errores que indica tu editor, parece que te falta instalar Requests. Tenés que ejecutar este comando en la consola:

Código:
pip install requests

Después te está marcando que hay dos clases que no existen: FileNotFound y NoDataLoaded. O te falta ahí una parte del código, o te faltan importarlas de otro archivo.

Como sea, para saber exactamente qué errores está tirando el programa, es mejor ejecutarlo y ver lo que se imprime en la consola, el editor de código no siempre es muy preciso con los errores.

Saludos!
Hola de nuevo Francisco.

Como bien me comentaste, el problema de los requests era por un error en la instalación, que ya solucioné. 
He probado a ejecutar el código, y esto es lo que aparece

https://gyazo.com/db0b70cd4545d7ba81e697bff0acaced

A su vez, en el editor de código siguen apareciendo estos errores, hablé con el creador, y me comento que el código estaba un poco anticuado, y era posible que ciertas lineas tendrian que ser modificadas, o incluso eliminadas. No sé si sabes de que se pueda tratar, de cualquier modo, gracias por la ayuda ofrecida.

https://gyazo.com/da6dfa1fb3e37b48558a7797af4dd3a6

Un saludo.
Responder
#6
Hola Pablo.

Por los errores que muestra el editor, diría que falta alguna parte de ese código (hay dos excepciones que no están definidas). Yo te recomendaría que continúes con tus estudios del lenguaje para que en un tiempo te puedas apropiar del programa y modifcarlo a tu gusto (no es un código muy complejo).

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!
Responder
#7
(07-07-2020, 12:27 PM)Francisco escribió: Hola Pablo.

Por los errores que muestra el editor, diría que falta alguna parte de ese código (hay dos excepciones que no están definidas). Yo te recomendaría que continúes con tus estudios del lenguaje para que en un tiempo te puedas apropiar del programa y modifcarlo a tu gusto (no es un código muy complejo).

Saludos
Muchas gracias por todo Francisco, eso haré, de todos modos, se te ocurre algo que se pueda hacer para corregir esos errores?
Un saludo.

Como última cuestion, me gustaria saber si es posible que me dijeses, segun tu opinion, cuales son los mejores lugares para aprender python, de manera gratuita
Responder
#8
Hola Pablo.

Para los errores de las excepciones, podrías agregar esto al comienzo del archivo:

  1. class FileNotFound(Exception): pass
  2. class NoDataLoaded(Exception): pass


En cuanto a los tutoriales, cualquier libro introductorio de Python te va a servir. Te dejo también nuestro tutorial: https://tutorial.recursospython.com/introduccion/.

Saludos
¡No te pierdas nuestro curso oficial en Udemy para aprender Python, bases de datos SQL, orientación a objetos, tkinter y mucho más!
Responder


Salto de foro:


Usuarios navegando en este tema: 1 invitado(s)