{"id":19720245,"url":"https://github.com/arhcoder/curso-creando-bots-de-twitter","last_synced_at":"2025-07-17T02:12:06.921Z","repository":{"id":144337100,"uuid":"544276372","full_name":"arhcoder/Curso-creando-bots-de-Twitter","owner":"arhcoder","description":"🐦 Material from the course taught at the XVI Congress of Basic Sciences of the Autonomous University of Aguascalientes, 2022 on the creation of Twitter Bots with Python and Web Scraping.","archived":false,"fork":false,"pushed_at":"2022-10-08T21:14:21.000Z","size":8795,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-05T19:34:20.295Z","etag":null,"topics":["api","bot","congress","course","python","scraping","twitter","university"],"latest_commit_sha":null,"homepage":"https://arhcoder.com/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/arhcoder.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-10-02T04:24:06.000Z","updated_at":"2023-03-02T23:15:54.000Z","dependencies_parsed_at":null,"dependency_job_id":"2652069e-3cef-423f-9a7c-8fa0792473ba","html_url":"https://github.com/arhcoder/Curso-creando-bots-de-Twitter","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arhcoder%2FCurso-creando-bots-de-Twitter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arhcoder%2FCurso-creando-bots-de-Twitter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arhcoder%2FCurso-creando-bots-de-Twitter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/arhcoder%2FCurso-creando-bots-de-Twitter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/arhcoder","download_url":"https://codeload.github.com/arhcoder/Curso-creando-bots-de-Twitter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251585743,"owners_count":21613271,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","bot","congress","course","python","scraping","twitter","university"],"created_at":"2024-11-11T23:10:54.801Z","updated_at":"2025-04-29T21:30:51.641Z","avatar_url":"https://github.com/arhcoder.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003chr\u003e\n\n# 🤖 Creando BOTS de Twitter con Python y Web Scraping\n\n\u003chr\u003e\n\n#### 📅 Impartido 3, 4 y 5 de Octubre, 2022\n#### ⏰ Seis horas teórico-prácticas\n#### 💻Congreso de Ciencias Básicas\n#### 🏫 Universidad Autónoma de Aguascalientes\n#### 🌮 En Español\n\n\u003chr\u003e\n\n### 📋 Requisitos\n\n#### 🛠 Instalaciones:\n- [**Python**](https://www.python.org/downloads/ \"Python\");\n- [**JSON-Handle**](https://chrome.google.com/webstore/detail/json-handle/iahnhfdhidomcpggpaimmmahffihkfnj \"JSON-Handle - Chrome\");\n- [**Visual Studio Code**](http://https://code.visualstudio.com/ \"Visual Studio Code\");\n\t* Extensión [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python \"Python\");\n\t* Extensión [Better comments](https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments \"Better comments\");\n\t* Extensión [JSON](https://marketplace.visualstudio.com/items?itemName=ZainChen.json \"JSON\");\n\n#### 🐦 Cuentas:\n- [**Twitter**](https://twitter.com/ \"Twitter\");\n- [**Twitter Developer Portal**](https://developer.twitter.com \"Twitter Developer Portal\");\n- [**Spotify Developer Portal**](https://developer.spotify.com/ \"Spotify Developer Portal\") (Opcional);\n- [**Marvel Developer Portal**](https://developer.marvel.com) (Opcional);\n\n\u003chr\u003e\n\n## 🗂 Índice\n### [1️⃣ Primer día](#1%EF%B8%8F⃣-primer-día-1);\n### [2️⃣ Segundo día](#2%EF%B8%8F⃣-segundo-día-1);\n### [3️⃣ Tercer día](#3%EF%B8%8F⃣-tercer-día-1);\n\n\u003chr\u003e\n\n\u003cbr\u003e\n\n## 1️⃣ Primer día\n### 📚 Tópicos\n1. Teoría sobre internet, bots, scraping y APIS.\n2. Primer loggeo en la plataforma de desarrollador de Twitter.\n3. Definición y partes de un HTTP Request.\n4. Ejercicio sobre APIS:\n\t* Extraer y abrir fotos aleatorias de gatos.\n\t* Traer datos interesantes sobre Pokémons.\n\t* Traer canciones más populares de una banda, con Spotify.\n\t* Ejercicio con API de Marvel.\n\n### 📓 Apuntes\n\n\u003chr\u003e\n\n#### 🔰 Librería en Python para hacer peticiones http:\n\nInstalación en consola:\n```\npython -m pip install requests\n```\nO bien:\n```\npip install requests\n```\n\nImportación en código:\n```\nimport requests\n```\n\n#### 🔰 Ejemplo de uso para hacer petición **GET**:\n```python\n# Se guarda en \"respuesta\", el resultado de hacer la petición GET:\nrespuesta = requests.get(\"https://api.thecatapi.com/v1/images/search\")\nprint(respuesta) # ---\u003e Imprime algo como \u003cResponse[200]\u003e;\n\n# Para obtener los meta-datos que trae la petición:\nestatus = respuesta.status_code\ncabezera = respuesta.headers\ncontenido = respuesta.content\ntexto = respuesta.text\ncontenidox = respuesta._content\nencoding = respuesta.encoding\n\n# Se convierte la respuesta a un archivo JSON para procesarlo:\nrespuestaEnJSON = respuesta.json()\nprint(respuestaEnJSON) # ---\u003e Imprime el JSON de la respuesta\u003e;\n\n# SI QUERÉMOS SÓLO EL CONTENIDO DE LA RESPUESTA:\ncontenidoRespuesta = respuesta.content\n\n# SI EL CONTENIDO DE LA RESPUESTA ES CÓDIGO HTML;\n# ES NECESARIO DECODIFICARLO PARA EVITAR ERRORES CON CARACTERES ESPECIALES:\ncontenidoRespuesta = respuesta.content.decode(\"utf-8\")\n```\n\n#### 📖 Para entender cómo leer y procesar JSONs:\n- [**Cómo leer JSON**](https://developer.mozilla.org/es/docs/Learn/JavaScript/Objects/JSON \"Cómo leer JSON\");\n- [**Manejo de JSON con Python**](https://pywombat.com/articles/json-python \"Manejo de archivos JS con Python\");\n- [**VIDEO: ¿Cómo abrir los archivos JSON?  Python**](https://www.youtube.com/watch?v=4jnel2Kd9MU \"VIDEO: ¿Cómo abrir los archivos JSON? Python\");\n\n#### 🧰 Recursos:\n- [**LISTA CON CIENTOS DE APIS GRATUITAS PARA USAR**](https://github.com/public-apis/public-apis);\n- [**API PARA FOTOS DE GATOS**](https://api.thecatapi.com/v1/images/search);\n- [**API PARA FOTOS DE PERROS**](https://random.dog/woof.json);\n- [**API PARA FOTOS DE AJOLOTES**](https://axoltlapi.herokuapp.com/);\n- [**API PARA FRASES ALEATORIAS**](https://api.quotable.io/random);\n- [**API PARA DATOS INTERESANTES INÚTILES**](https://uselessfacts.jsph.pl/);\n- [**API DE POKEMÓN**](https://pokeapi.co/);\n- [**API DE MARVEL**](https://developer.marvel.com/) (REQUIERE KEYS);\n- [**API DE SPOTIFY**](https://developer.spotify.com/) (REQUIERE KEYS);\n\n\u003chr\u003e\n\n\u003cbr\u003e\n\n## 2️⃣ Segundo día\n### 📚 Tópicos\n1. ¿Qué es el scraping?\n2. ¿Qué es xPath?\n3. Implementando xPath en el navegador:\n\t* Extraer frases celebres.\n\t* Extraer información sobre libros.\n4. Ejercicios en Python:\n\t* Obtener letra de una canción dicha por el usuario.\n\t* Obtener descuentos en juegos populares de Steam.\n\n### 📓 Apuntes\n\n\u003chr\u003e\n\n#### 🔰 xPath:\n**⭕ Revisar** [**carpeta de apuntes**](https://github.com/arhcoder/Curso-creando-bots-de-Twitter/tree/master/Apuntes/xPath);\n\n#### 🔰 xPath en Python:\nInstalar librería\n```\npython -m pip install lxml\n```\nO bien:\n```\npip install lxml\n```\n\nImportación en código:\n```\nimport lxml.html as html\n```\n\n**❗ NOTA:** También necesitarémos la librería antes mencionada ***requests***.\n\n#### 🔰 Ejemplo de uso de hacer scraping:\n```python\n# Hacer request para la página que se desea scrapear:\nrespuesta = requests.get(urlDeLaWeb)\n\n# Obtener el content del response (Que en este caso\n# es un HTML, en lugar de un JSON, como antes). Este\n# se debe decodificar con \"utf-8\" para evitar errores\n# en el formato de caractéres especiales:\nhtmlDeLaWeb = respuesta.content.decode(\"utf-8\")\n\n# Se utiliza la librería que importamos con el nombre\n# de \"html\" para convertir el HTML a un objeto que\n# podrá procesar la librería con xPath:\nhtmlParaScrapear = html.fromstring(htmlDeLaWeb)\n\n# Hacemos scraping a la página y guardamos el resultado:\nconsultaXPATH = '//a[@class=\"song\"]/text()'\nresultadoDelScraping = htmlParaScrapear.xpath(consultaXPATH)\n```\n\n#### 🔰 Funciones útiles de Python para procesar texto:\n- **Eliminar los espacios de un texto al principio y al final:**\n```\nnombreCancion = nombreCancion.strip()\n```\n- **Eliminar los espacios duplicados en un texto:**\n```\nnombreCancion = \" \".join(nombreCancion.split())\n```\n- **Reemplazar los espacios de un texto por \"%20\"...**\n```\nnombreCancion = nombreCancion.replace(\" \", \"%20\")\n```\n\n#### 📖 Para entender cómo recorrer listas con Python:\n- [**Cómo recorrer listas con *for***](https://es.acervolima.com/iterar-sobre-una-lista-en-python/ \"Cómo recorrer listas con for\");\n- [**Cómo recorrer listas con *for enumerate***](https://www.codigopiton.com/como-recorrer-dos-listas-a-la-vez-en-python/#:~:text=Una%20manera%20sencilla%20de%20recorrer,ambos%20de%20la%20misma%20posici%C3%B3n \"Cómo recorrer listas con for enumerate\");\n- [**VIDEO: Bucle For de string y lista**](https://www.youtube.com/watch?v=dBXs2gRMAJY \"VIDEO: Bucle For de string y lista\");\n\n#### 🧰 Recursos:\n- [**WEB PARA PRACTICAR SCRAPING**](https://toscrape.com/);\n\t- [**SCRAPING DE FRASES**](http://quotes.toscrape.com/);\n\t- [**SCRAPING DE LIBROS**](http://books.toscrape.com/);\n- [**WEB PARA OBTENER LETRAS DE CANCIONES**](https://lyricsfreak.com/);\n- [**WEB ALTERNA DE LETRAS DE CANCIONES**](https://genius.com/);\n- [**WEB ALTERNA DE LETRAS DE CANCIONES**](https://metrolyrics.pro/);\n\n\u003chr\u003e\n\n\u003cbr\u003e\n\n## 3️⃣ Tercer día\n### 📚 Tópicos\n1. Explorar funciones básicas de la API de Tweeter.\n2. Ejercicios básicos con Twitter:\n\t* Twittear.\n\t* Retwitear.\n\t* Responder menciones.\n\t* Enviar DMs.\n\t* Seguir hastags.\n3. Programación del proyecto:\n\t* Identificar web de Steam.\n\t* Encontrar xPath para traer datos.\n\t* Hacer scraping en consola.\n\t* Colocar resultados en Twits.\n\n### 📓 Apuntes\n\n\u003chr\u003e\n\n#### 🔰 Crear un entorno virtual en Python:\nComando para crearlo:\n```\npython -m venv venv\n```\n\n**❗ NOTA:** PARA CREAR EL ENTORNO VIRTUAL EN CONSOLA NO OLVIDES\nCAMBIAR DE DIRECTORIO A DONDE VA A ESTAR EL PROYECTO. Para moverte\nde directorio en consola, ejecuta el comando `cd nombredelacarpeta`.\n\n**✔ En Windows:**\n\nPara activarlo:\n```\n.\\venv\\Scripts\\activate\n```\nPara desactivarlo:\n```\n.\\venv\\Scripts\\deactivate.bat\n```\n\n**✔ En MAC:**\n\nPara activarlo:\n```\nsource venv\\Scripts\\activate\n```\nPara desactivarlo:\n```\nsource venv\\Scripts\\deactivate.bat\n```\n\n#### 🔰 Cómo esconder varibables secretas:\n**1.** Primero instala la librería ***python-dotenv***:\n```\npython -m pip install python-dotenv\n```\nO bien...\n```\npip install python-dotenv\n```\n**2.** Crea dentro de la carpeta de tu proyecto un archivo de nombre ***.env***.\n\n**3.** En ***.env*** vas a colocar las variables que quieres esconder, junto a su valor, y separadas por un signo **\"=\"**, y una en cada línea. Es recomendable como estándar, colocar el nombre de las variables en letras mayúsculas. Además, no escribas espacios. (EJEMPLO):\n```\nAPI_KEY=xxxxxxxxxxxxxxxxxxxx\nAPI_SECRET=0000000000000000000000\nTOKEN=000000.xxxxxxxx.0000.XXXXXXX.00\n```\n**4. Dentro del código en el que quieres acceder a las variables:**\n```python\n# Importa la función de la librería...\nfrom dotenv import load_dotenv\nimport os\n\n# Cargar las varibales de entorno con la función...\nload_dotenv()\n\n# Obten las variables según el nombre que les pusiste...\nllaveDeLaAPI = os.getenv(\"API_KEY\")\nsecretoDeLaAPI = os.getenv(\"API_SECRET\")\ntokenDeLaAPI = os.getenv(\"TOKEN\")\n```\n\n***❌ NO OLVIDES EXLUÍR EL ARCHIVO .env EN LOS SEGUIMIENTOS DE TU SISTEMA GESTOR DE VERSIONES (.gitignore) SI VAS A COLOCAR EL CÓDIGO EN UN REPOSITORIO***.\n\n\u003cbr\u003e\n\n#### 🔰 CÓMO CONECTAR EL BOT EN MODO \"API\":\n\n\u003chr\u003e\n\n```python\n# Se genera una variable con las llaves de autenticación:\nauth = tweepy.OAuthHandler(API_KEY, API_SECRET, ACCES_TOKEN, ACCES_TOKEN_SECRET)\n\n# Se crea la conexión y se crea la instancia del bot:\nbot = tweepy.API(auth)\n```\n**❗ NOTA:** Este es sólo un método de autenticación; existen muchas variantes que puedes encontrar en [**LA DOCUMENTACIÓN OFICIAL DE TWEEPY**](https://docs.tweepy.org/), en donde también encontrarás los cambios y actualizaciones que pueda sufrir en el futuro.\n\n\u003cbr\u003e\n\n#### 🔰 FUNCIONES VALIOSAS PARA MANIPULAR EL BOT:\n\n\u003chr\u003e\n\n**1. Publica un tweet de sólo texto:**\n```python\nbot.update_status(\"¡Que viva Python! 🛐\")\n```\n\n\u003cbr\u003e\n\n**2. Recupera en una lista los últimos [10] tweets del usuario @arhcoder:**\n```python\ntweets = bot.user_timeline(screen_name=\"arhcoder\", count=10)\nprint(f\"{tweets[3]}\") # \u003c--- Meta-datos del 4to Tweet;\n```\n\n\u003cbr\u003e\n\n**3. Meta-datos que se pueden obtener del \"Tweet\":**\n```python\n# Toma el último Tweet del usuario \"@arhcoder\":\ntweet = bot.user_timeline(screen_name=\"arhcoder\", count=1)[0]\n\nprint(\"\\n\\n* ID del Tweet: \"+str(tweet.id))\nprint(\"\\n* Fecha: \"+str(tweet.created_at))\nprint(\"\\n* Texto: \"+str(tweet.text))\nprint(\"\\n* Dispositivo: \"+str(tweet.source))\nprint(\"\\n* Nombre del autor: \"+str(tweet.user.name))\nprint(\"\\n* Foto de perfil del autor: \"+str(tweet.user.profile_image_url))\nprint(\"\\n* Cantidad de seguidores del autor: \"+str(tweet.user.followers_count))\nprint(\"\\n* Cantidad de seguidos del autor: \"+str(tweet.user.friends_count))\nprint(\"\\n* Fecha de creación de la cuenta del autor: \"+str(tweet.user.created_at))\nprint(\"\\n* Arroba del autor: \"+str(tweet.user.screen_name))\nprint(\"\\n* Descripción del autor: \"+str(tweet.user.description))\nprint(\"\\n* Respondió a un Tweet?: \"+str(tweet.in_reply_to_status_id))\nprint(\"\\n* Respondió a un usuario?: \"+str(tweet.in_reply_to_user_id))\nprint(\"\\n* Respondió a un usuario?: \"+str(tweet.in_reply_to_screen_name))\nprint(\"\\n* Cantidad de me gusta: \"+str(tweet.favorite_count))\nprint(\"\\n* Cantidad de me retweets: \"+str(tweet.favorite_count))\nprint(\"\\n* El bot sigue al autor? \"+str(tweet.user.following))\n#! Y MUCHÍSIMAS OTRAS MÁS CARACTERÍSTICAS #\n```\n\u003cbr\u003e\n\n**4. Obtiene un Tweet teniendo su ID:**\n\n**❗ NOTA:** Se puede saber el ID de un Tweet desde su URL; y se puede obtener su URL desde la web, o dando \"compartir\" desde la aplicación móvil.\nEl ID se extrae tal que así...\n- **URL:** https://twitter.com/usuario/status/   **ID**   ?más información...\n- **Ejemplo:** https://twitter.com/arhcoder/status/1460652032994512898?t=N8f3sgkb02Tq5Ff_K8P7Ug\u0026s=19\n- **El ID es:** 1460652032994512898;\n\n```python\nunTweet = bot.get_status(id=\"1460652032994512898\")\nprint(f\"\\n\\n{unTweet}\") #\u003c--- Imprime los meta-datos del Tweet;\n```\n\n\u003cbr\u003e\n\n**5. Obtiene información de un usario teniendo su @arroba:**\n```python\nusuario = bot.get_user(screen_name=\"arhcoder\")\nprint(usuario) # \u003c--- Toda la información del usuario;\n```\n\n\u003cbr\u003e\n\n**6. Envía un mensaje directo:**\n```python\n# Es posible tomar el ID del usuario desde el atributo \"id\", y es necesario convertirlo a String...\n# Sin embargo, el objeto usuario también trae un atributo llamado \"id_str\", que ya da el ID del usuario en String...\nidDelUsuario = str(usuario.id)\nidDelUsuario = usuario.id_str\nmensaje = \"Soy un bot acosador...\"\n\nbot.send_direct_message(recipient_id=idDelUsuario, text=mensaje)\n```\n\n\u003cbr\u003e\n\n**7. Publicar Tweet con un archivo multimedia:**\n\n**❗ NOTAS:**\n- Para trabajar con archivos multimedia; tanto para publicarlos en Tweets, como mensajes, como foto de perfil, es necesario usar una función que primero, **sube dentro de la API de Twitter,** el archivo en cuestión...\n- Ya habiendo subido el archivo multimedia, **se obtiene el ID** de este al subirlo, y este es el que **se adjunta** dentro del envío/publicación que querámos hacer.\n- Si se quiere trabajar con un **archivo de internet,** es necesario primero **descargarlo** localmente y después subirlo.\n- Para descargar archivos de internet, basta con utilizar ***requests***.\n\n**a) Para descargar un archivo de internet con el link de la imágen:**\n```python\n# Nombre del archivo que guardaremos localmente:\nnombreArchivo = \"michi.jpg\"\n\n# Se hace el request:\nurlDeLaImagen = \"https://cdn2.thecatapi.com/images/df1.jpg\"\nrespuesta = requests.get(urlDeLaImagen, stream=True)\n\n# Si se pudo obtener la respuesta:\nif respuesta.status_code == 200:\n\t# Función que escribe la imágen en el archivo local:\n    with open(nombreArchivo, \"wb\") as archivoLocalDeImagen:\n        for pedazo in respuesta:\n            archivoLocalDeImagen.write(pedazo)\nelse:\n    print(\"No se pudo descargar la imágen...\")\n```\n\n**b) Para subir el archivo a Twiter y obtener su ID:**\n\n**❗ NOTAS:**\n- **Restricciones:**\n\t- Imágenes: max **5MB;**\n\t- GIFs: max **15MB;**\n\t- Videos: max **512MB;**\n- **La función retorna una lista de \"Media\"** pues se pueden agregar varios archivos. A la hora de procesarla es necesario **agarrar sólo el primer** elemento si querémos sólo una imágen:\n\n```python\n# La lista que retorna es de objeto tipo \"Media\", por lo cuál, si se quiere obtener el ID, se deberá procesar:\nlistaMedias = bot.media_upload(filename=nombreArchivo)\n```\n\n**c) Para publicar el Tweet con la imágen (Sólo un archivo):**\n```python\n# Publica el tweet agregando el ID de la imágen:\n# \"media_ids\" recibe listas de IDs, por lo que si se quiere sólo una, se coloca sólo la que se extrajo anteriormente, entre corchetes []:\nbot.update_status(status=\"🐈 Un mishi bonito: \", media_ids=[listaMedias.media_id_string])\n```\n\n**d) Si quieres, puedes hacer que se borre el archivo al descargarlo:**\n```\nos.remove(nombreArchivo)\n```\n\n\u003cbr\u003e\n\n**8. Publicar Tweet con varios archivos multimedia:**\n```python\n# Lista con todos los archivos a subir en el Tweet:\narchivos = [\"michi-01.png\", \"michi-02.jpg\", \"michi-03.png\", \"michi-04.jpg\"]\n\n# Lista en donde se van a guardar los IDs de las medias:\nmediaIDs = []\n\n# Para cada archivo de la lista de archivos:\nfor archivo in archivos:\n\t# Sube a twitter el archivo y obten el \"Media\":\n\tmediaDelArchivo = bot.media_upload(archivo)\n\n\t# Agrega a la lista de medias el id en string del Media del archivo actual:\n\tmediaIDs.append(mediaDelArchivo.media_id_string)\n\n# Publica el tweet con los archivos que subiste:\nbot.update_status(status=\"🐱‍👤 Un tweet con demasiados gatos :3\", media_ids=mediaIDs)\n```\n\n\u003cbr\u003e\n\n#### 📖 Para complementar el día:\n- [**Guardar imágenes de internet localmente**](https://www.adamsmith.haus/python/answers/how-to-download-an-image-using-requests-in-python);\n- [**Python - Sentencia \"with\"**](https://www.geeksforgeeks.org/with-statement-in-python/);\n- [**Python + Tweepy para usar Twitter**](https://www.youtube.com/watch?v=fqFAOYh_-bs \"**Python + Tweepy para usar Twitter**\");\n\n#### 🧰 Recursos:\n- [**PLATAFORMA DE DESARROLLADORES DE TWITTER**](https://developer.twitter.com/ \"**PLATAFORMA DE DESARROLLADORES DE TWITTER**\");\n- [**ESPACIO PARA DAR DE ALTA UNA APP DE TWITTER SI YA SE TIENE CUENTA**](https://developer.twitter.com/en/portal/ \"**ESPACIO PARA DAR DE ALTA UNA APP DE TWITTER SI YA SE TIENE CUENTA**\");\n- [**DOCUMENTACIÓN DE TWEEPY PARA CONOCER SUS FUNCIONES**](https://docs.tweepy.org/ \"**DOCUMENTACIÓN DE TWEEPY PARA CONOCER SUS FUNCIONES**\");\n- [**DOCUMENTACIÓN DE TWEEPY CON TODAS LAS FUNCIONES DE LA API EXPLICADAS**](https://docs.tweepy.org/en/stable/api.html \"**DOCUMENTACIÓN DE TWEEPY CON TODAS LAS FUNCIONES DE LA API EXPLICADAS**\");\n- [**TIENDA OFICIAL DE STEAM**](https://store.steampowered.com/ \"TIENDA OFICIAL DE STEAM\");\n- [**PÁGINA DE OFERTAS ESPECIALES DE STEAM**](https://store.steampowered.com/specials/ \"**PÁGINA DE OFERTAS ESPECIALES DE STEAM**\");","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farhcoder%2Fcurso-creando-bots-de-twitter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Farhcoder%2Fcurso-creando-bots-de-twitter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Farhcoder%2Fcurso-creando-bots-de-twitter/lists"}