¿Hacking con API's o redes sociales?

Iniciado por Mortal_Poison, Diciembre 19, 2017, 09:48:38 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Diciembre 19, 2017, 09:48:38 PM Ultima modificación: Enero 28, 2018, 02:00:40 PM por Mortal_Poison

Cuando deseamos o queremos trabajar con las API's de Facebook, Twitter e Instagram, algunas veces, estas nos frenan. He tenido la oportunidad de trabajar con Machine Learning por distintos motivos y contratos, pero nada se suma a la preocupación que llegué a tener al saber que el tiempo se acotaba y el trabajo no estaba ni por la mitad. En uno de ellos, debía realizar análisis de sentimiento que era realmente complejo; debía hacer uso de la API de Instagram. Al final, tendrás un glosario donde está definida la terminología usada en éste post. Los que alguna vez han hecho uso de la API de Instagram, sabrán que ésta únicamente te permite hacer uso de sus métodos si la aplicación ya está en producción, y para verificar esto, debes mandarles un formulario donde demuestres de que es verídica tu aplicación en producción. Al encontrarme con esto, no le entendí la lógica del por qué harían eso, sabiendo que muchos desarrolladores necesitan hacer uso de sus métodos para testing y bueno, infinidad de cosas antes de lanzar a producción cualquier cosa. Cuando vi lo que les mencione anteriormente, me quedé sorprendido, con cara de: vaya  :-\.

Deberíamos remitirnos primero a la siguiente documentación de Instagram del desarrollador:
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta-> Link directo.

A continuación, podrán ver el lugar exacto donde ellos mismos ratifican que no aceptan apps en modo de test:



Ilustración 1. Líneas exactas donde emiten el NO uso de su Api para aplicaciones en modo test.

A mi criterio propio, es desapropiado decidir que las aplicaciones de prueba no pueden hacer uso de su API mientras que las de producción sí; de igual manera, están haciendo uso de su servicio.

Determinando que no se podía/puede hacer uso de la API y necesitaba hacer el trabajo, me senté a hacer el código(reinventar la rueda, pero al cliente no le importa si la reinventas o no, él necesita el trabajo).


EL COMIENZO

Debía saber cómo funcionaba Instagram, así que me fui al buscador y busqué un HashTag:



Ilustración 2. HashTag de Obama.

Más de 3 millones de Posts con el HashTag de #Obama. Ahora, lo que debía recopilar era lo siguiente:



Ilustración 3. Color Negro: Texto del que publica; Color Azul: Comentarios.

Además de recopilar los nombres de usuarios, también debía quedar en un archivo de texto plano, que a eso no le veo complejidad alguna. Ahora, vamos con el código.

Aclaro que ya fue hace algunos años que hice el código, ustedes pueden mejorarlo, pues el código que les voy a mostrar es únicamente un estilo de prototipo, luego lo mejoré y ahora es más robusto. Aunque es privado, espero que éste, les de una idea de lo que se puede llegar a hacer con perseverancia, constancia y lo más importante: pasión.

Un usuario de Underc0de también deseaba saber cómo hacer ScrollBar en Twitter, pues bueno, aquí lo haré con Instagram. Lo único que faltaría, es cambiar peras por manzanas(espero y te de una idea, ;)).



Ilustración 4. Botón de cargar más.

Al presionar en "Cargar más", se cargan las demás publicaciones, valga la redundancia. Ahora, lo que hay que tener en cuenta es que al presionar se hace una petición a /query/ para traer la información de la siguiente página.



Ilustración 5. Petición a /query/ para obtener la información de la siguiente página.



Ilustración 6. Segunda petición que realiza Instagram para verificar si se cargó correctamente mediante Ajax.

Comprendiendo esto, podemos deducir que en las peticiones a /query/ siempre va a variar un valor, que hace referencia al de la página: Página 1, Página dos, Página Tres, Página N.

Instagram sigue en sus patrones para conocer la siguiente página una variable llamada "end_cursor", el cual le indica el "max_id"(es decir, cuál es el ID de la página siguiente). Esto, lo podemos encontrar de la siguiente manera:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

En éste caso, el tag es Plebiscito, que vendría siendo el HashTag #Plebiscito respectivamente. Así, que quedaría de la siguiente forma:

No tienes permitido ver los links. Registrarse o Entrar a mi cuentaplebiscito/?__a=1&max_id=END_CURSOR

Al cargar esto, se mostrará de manera lineal, por ende, le daremos formato con la siguiente página:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



Ilustración 7. Formato al JSON del HashTag de Instagram.



Ilustración 8. END_CURSOR que indica la siguiente página al presionar en "Cargar más".

Si observamos detalladamente, podemos ver en el siguiente enlace, un JSON que nos muestra el end_cursor y también un 'code' que hace referencia al código de la imagen: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta




Ilustración 9. "Code" del JSON es el código de la URL en la imagen mostrada.

Asumiendo que la próxima página con las fotos se mostrará con un código determinado por END_CURSOR, hay que automatizar dicho proceso de tal modo, que extraigamos los códigos de las imágenes en cada END_CURSOR(página) que nos posicionemos.

Realicé entonces, un script en PHP, el cual cargará todos los end_cursors, es decir, todas las páginas y a la vez, obteniendo la variable 'code'  y almacenándola en un archivo.



Ilustración 10. Script en PHP encargado de almacenar los códigos de las imágenes.

ini_set('max_execution_time', 0) es para que no se obtenga un límite de tiempo al intentar obtener todos los 'code'.
Luego, se crea un loop infinito mientras se va añadiendo al archivo de texto y además de esto, se va obteniendo cada uno de los códigos de las imágenes('code') hasta la última página del hashtag.
Ejecutándolo en un servidor local, podemos observar que nos imprime y guarda los respectivos códigos.




Ilustración 11. Archivo de texto plano con los códigos de las respectivas imágenes



Luego de obtener los códigos de las imágenes del HashTag que deseamos, se procede a leer el archivo que creo el script de php con python, para ello, tenemos esta función:



Ilustración 12. Función que se encarga de leer el archivo de texto con los códigos de las imágenes.



Una vez leídos, se almacena en una lista temporal, la cual será enviada a la función que obtendrá los comentarios y el Caption(la descripción de la imagen/foto de la persona que lo publica).
Luego de que se almacena la lista y contiene los valores que son los códigos de las imágenes, se envía como parámetro de entrada a la función "get_comments_data".



Ilustración 13. Función donde son recibidos los códigos de las imágenes como argumentos de entrada.

En este punto, es crucial conocer que cada imagen tiene incrustada objetos de Javascript, los cuales se cargan cada vez que se carga una imagen.

Por ejemplo, veamos la siguiente imagen:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



Ilustración 14. Objetos de JavaScript incrustados.

¿Aún no la ves? démole formato:



Ilustración 15. Objetos de JavaScript incrustados con formato.

De esta forma, creé la expresión regular con el objetivo de solo obtener la parte que yo solo deseaba para luego acceder mediante JSON. En la siguiente imagen, lo pueden apreciar con más detalle:



Ilustración 16. Expresión regular para recopilar lo que se desea.

Además de eso, el código tiene comentarios, así que pueden apreciar cada línea lo que hace con más detalle fijándose en ellos. Cabe recalcar que también se escribe en un archivo individual cada comentario y username: el comentario como el contenido del archivo y el username como el nombre del archivo.
La siguiente imagen muestra como va obteniendo todos los comentarios y nombres de usuario de cada una de las url's ya cargadas.



Ilustración 17. Script en ejecución.

Para finalizar, lo que queríamos ;D :



Ilustración 18. Resultados del script.

Como les mencione, yo mejoré dicho script haciéndolo mediante Threads, pues a pesar de ser rápido, quería más velocidad. Le añadí otro tipo de cosas de OSINT y bueno, como sabrán, usar API's es muy potente cuando queremos recopilar información en masa. Incluso, también le añadí algo con No tienes permitido ver los links. Registrarse o Entrar a mi cuenta. Sin embargo, como en Instagram, si te "frenan" de alguna manera, aprende a realizarlo de otra forma distinta. Como dice un dicho muy famoso: "Si del cielo te caen limones aprende a hacer limonada".

Espero que les de idea de cómo también funcionan éstas plataformas, sobretodo, a conceptualizar cosas que quizás desconocían. Comentarles que haré un vídeo con algunos otros detalles que quizás no me percate, así que no se preocupen ;D.

Cualquier duda, sugerencia u opinión será bien recibida.

El código, lo pueden descargar desde aquí:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Un vídeo explicando su funcionamiento y su "Rework":



Nuevo enlace de descarga:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


GLOSARIO

OSINT: Open Source Intelligence.
CAPTION: Descripción que realizan las personas al publicar algo.
SCROLLBAR: Barra de desplazamiento.
[/font]
Become the change you seek in the world. -Gandhi.


Muchas gracias brother, justo tenía planeado comenzar la próxima semana a trabajar en esto, me acabas de ahorrar mucho tiempo.

Saludos!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

¡Muy bueno! También me he encontrado API's no tan permisivas como deseo, pero con ingenio y algo de web scrapping se pueden tener resultados como estos. Saludos!
\x11\x12\x13

Hola No tienes permitido ver los links. Registrarse o Entrar a mi cuenta No tienes permitido ver los links. Registrarse o Entrar a mi cuenta No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

De antemano, gracias por sus agradecimientos.
Siempre dispuesto a colaborar y contribuir con el conocimiento, también estaré compartiendo otro tipo de contenido referente a lo las API's, pues considero que leí bastante de este tema(incluso libros) que demuestran que es un amplio terreno del cual aprender.

Un saludo.

Become the change you seek in the world. -Gandhi.


Enero 17, 2018, 01:22:23 PM #4 Ultima modificación: Enero 17, 2018, 01:52:00 PM por graphixx
Bro demasiado genial tu vídeo, el tema es de actualidad, esta a la vanguardia y esta siendo demandado ampliamente en el sector comercial y profesional, por lo que una persona con las habilidades que desarrolla siguiendo tus indicaciones tendrá una experticia bastante rentable que añadir a su perfil.

Dejo un compilado VIDEO FULL 1080HD + Script + Articulo del foro offline.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Mi Blog Personal
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Caramba muy buen post demostrando level interesante colega estaré atento a tus siguientes post.
Saludos.

Youtube: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta - Twitter: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Excelente post. Tienes razón, los unicos limites que existen son los que nos ponemos nosotros mismos.

Algo para adicionar, para la parte de la extraccion de cada publicacion, es deciar No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

También aplica lo del la vista en formato json, (de hecho cualquier url bajo el dominio de instagram), y contiene información básica del post, la lista de comentario que además cuenta con el sistema de paginación.

Algo asi No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Al sacar la información de los comentarios mediante la expresión regular, se limita a que solo se tendran una parte de los comentarios.



Enero 07, 2019, 04:37:11 PM #7 Ultima modificación: Enero 07, 2019, 04:41:46 PM por blackdrake
Hola que tal a ver si me pueden ayudar con este problema, intento correr el código en cmd... voy buscando con cd el archivo hasta llegar a la carpeta que contiene No tienes permitido ver los links. Registrarse o Entrar a mi cuenta . y me tira el siguiente error.

Código: text
File "C:\xampp\htdocs\instagram.py", line 75
    file = open("C:\xampp\htdocs\links.txt", "r")
               ^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-4: truncated \xXX escape


siempre corri con jupyter todo. nose que será , es la primera vez que intento correr con cmd un Python .  Aclaro, en la carpeta links.txt ya pude extraer algunos tags( ya que cuando busco en Instagram son 3 millones, y solo me trajo 2400) si me pueden aclarar esa duda también seria genial. Perdón por no saber tanto como ustedes, estoy aprendiendo para saber tanto como ustedes. cambie en el codigo No tienes permitido ver los links. Registrarse o Entrar a mi cuenta la parte de la carpeta y puse C:\xampp\htdocs\links.txt" que es donde esta ubicado mi links.txt . Son los mejores. GRacias



No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Hola que tal a ver si me pueden ayudar con este problema, intento correr el código en cmd... voy buscando con cd el archivo hasta llegar a la carpeta que contiene No tienes permitido ver los links. Registrarse o Entrar a mi cuenta . y me tira el siguiente error.

Código: text
File "C:\xampp\htdocs\instagram.py", line 75
    file = open("C:\xampp\htdocs\links.txt", "r")
               ^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-4: truncated \xXX escape


siempre corri con jupyter todo. nose que será , es la primera vez que intento correr con cmd un Python .  Aclaro, en la carpeta links.txt ya pude extraer algunos tags( ya que cuando busco en Instagram son 3 millones, y solo me trajo 2400) si me pueden aclarar esa duda también seria genial. Perdón por no saber tanto como ustedes, estoy aprendiendo para saber tanto como ustedes. cambie en el codigo No tienes permitido ver los links. Registrarse o Entrar a mi cuenta la parte de la carpeta y puse C:\xampp\htdocs\links.txt" que es donde esta ubicado mi links.txt . Son los mejores. GRacias

Prueba poniendo:

Código: python
file = open(r"C:\xampp\htdocs\links.txt")


Un saludo.



Tal vez debes escapear la barra usando doble barra \\

Saludos,

Hola que tal gente ? yo otra vez. Perdón pero estoy muy enfocado a entender web scraping como lo saben Ustedes (creo que nunca llegare a eso jejej pero le voy a poner pilas ) .
El tema es el siguientes:
- Del PHP no me toma todos los TAGs, solo me toma 2 mil. Alguno sabe por que ?
-Pude correr el Python (nose por que por consola no me corre, solo me corre con Jupyter). El tema es que no me guarda el contenido en la carpeta comments... me tira los nombres de los usuarios sueltos en la carpeta del jupyter (pero tampoco me trae todo los textos de cada usuario)
Alguno corrio el codigo ?
Alguno tiene el codigo arreglado y si lo puede explicar seria genial. Como se almacenan los datos text en la carpeta y los nombres de usuario. Tambíen me queda una duda se le puedo pegar a la pagina con una condicion, por ejemplo (si el usuario dice comienza con tal nombre, o si en su texto tiene tal cosa) Muchisimas Gracias son los Mejores !

Buenas tardes No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Con respecto a tus preguntas:


1- Del PHP no me toma todos los TAGs, solo me toma 2 mil. Alguno sabe por que ?

Sí, al parecer instagram ha hecho un leve cambio en su plataforma y el script no funcionaba con él(el de PHP). Es muy simple el cambio, pero te dejo el código como debería quedar:

Código: php
<?php
ini_set('max_execution_time', 0);
$baseUrl = 'https://www.instagram.com/explore/tags/obama/?__a=1';
$url = $baseUrl;

while(1) {
    $file = fopen("links.txt", "a");
    $json = (object) json_decode(file_get_contents($url));
    foreach($json->{'graphql'}->hashtag->edge_hashtag_to_media->edges as $object_return){
        var_dump($object_return->node->shortcode);
        echo "{$object_return->node->shortcode}\n";
        fwrite($file, $object_return->node->shortcode);
        fwrite($file,"\n");

    }
    fclose($file);
    // Deben modificar la variable $URL y acceder correctamente a ella
    if(!$json->{'graphql'}->hashtag->edge_hashtag_to_media->page_info->has_next_page) break;
    $url = $baseUrl.'&max_id='.$json->{'graphql'}->hashtag->edge_hashtag_to_media->page_info->end_cursor;
}



Me di cuenta rápidamente de esto, por la estructura del JSON. La línea que cambia, es la penúltima de la variable $url para recuperar el dato del end_cursor.


2- Pude correr el Python (nose por que por consola no me corre, solo me corre con Jupyter). El tema es que no me guarda el contenido en la carpeta comments... me tira los nombres de los usuarios sueltos en la carpeta del jupyter (pero tampoco me trae todo los textos de cada usuario)


¿Podrías especificar más por favor? tu versión de Python por ejemplo. Acabé de correr el script de No tienes permitido ver los links. Registrarse o Entrar a mi cuenta con la última versión de Python(Python 3.7) y corre perfectamente. Te dejo una captura de pantalla para que lo veas por ti mismo:


Ilustración 1. Funcionamiento del script en Python.

Además de lo anterior, también he revisado uno de los comentarios:


Ilustración 2. Comentario recoletado de una persona.

Y para finalizar, cuando te refieres a que si puedes realizar una condición para el nombre si comienza con "tal nombre", la respuesta es sí. De hecho, puedes hacerlo con expresiones regulares pero eso depende de lo que desees hacer.


Cualquier cosa, estamos para colaborarte :).

Un saludo.
Become the change you seek in the world. -Gandhi.


Hola que tal? muchas gracias por responder , estoy leyendo mucho asi puedo no molestarlos tanto jejeje . de todas maneras todavía no puedo resolver los problemas, y no quiero tirar la toalla aunque ya estoy haciendo muchos intentos :(

problema 1-me sigue estrayendo solo 2400 y si voy a instagram son 3 millones (a vos te trajo los 3 millones?)

problema 2-yo uso el jupyter (que viene con python 3) . el tema es que tuve que crear dos veces las mismas cosas (osea el código No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, el main.php, y links). Esas tres las ubique en: una en la carpeta (C:\Users\Alumno_Invitado\scrapiins) donde corre el jupyter y allí corro el código python , y otra en (C:\xampp\htdocs) donde puedo correr el php (por que no me corria el php y lei que si lo ubicabas allí corre)
para el Python ya intente abrir cmd.... luego cd C:/xampp/htdocs/instagram.py y no corre.
para el php abro xampp activo el Apache entro al navegador escribo No tienes permitido ver los links. Registrarse o Entrar a mi cuenta y me trae solo 2 mil comentarios

problema3- cuando corro el Python, me deja el nombre de usuario con sus comentarios todo suelto y no dentro de la carpeta "Comments"

problema4-Como seria un caso con condición por ejemplo?


GRACIAS MILESSSSSS DE VERDADDDD !! estoy muy agradecido con ustedes

Buenas noches No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


1- me sigue extrayendo solo 2400 y si voy a instagram son 3 millones (a vos te trajo los 3 millones?)


Sí, con el código que te acabé de poner en el anterior comentario, lo hace perfectamente. Lo que tendrías que hacer es copiar y pegarlo en un nuevo archivo y nombrarlo como quieras. También puedes borrar el contenido de main.php y pegarlo directamente. ¿Lo hiciste?.

2- yo uso el jupyter (que viene con python 3) . el tema es que tuve que crear dos veces las mismas cosas (osea el código No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, el main.php, y links). Esas tres las ubique en: una en la carpeta (C:\Users\Alumno_Invitado\scrapiins) donde corre el jupyter y allí corro el código python , y otra en (C:\xampp\htdocs) donde puedo correr el php (por que no me corria el php y lei que si lo ubicabas allí corre)


A ver, con Jupyter mi experiencia no ha sido muy buena, ya que hace un par de meses, hice algo de Machine Learning y se me bugeaba bastante. ¿Cómo estoy seguro de que no era mi máquina?. Pues bien, yo corría todo desde mi Arch pero luego le pedí a un amigo que lo tenía en un Debian que lo hiciera y se replicó correctamente el bug.

En resumen y según la experiencia que tuve con Jupyter, no te lo recomendaría. Sólo es una recomendación y está sujeta a mi opinión, no debes hacerlo si no lo quieres. Por favor pon en tu símbolo de sistema:

python

Y te aparecerá cuál es la versión exacta del python. Por favor, si tienes una versión <= 3.5 del mismo, deberás actualizarla a la versión más reciente. Puedes optar por la versión 3.6 o 3.7.

3- cuando corro el Python, me deja el nombre de usuario con sus comentarios todo suelto y no dentro de la carpeta "Comments"

Sí, los comentarios te los deja en la carpeta donde se encuentran los 3 archivos y no en Comments. Sin embargo, ¿cómo te genera comentarios si nos comentas que no te funciona el archivo de Python?.

4- Como seria un caso con condición por ejemplo?

¿Qué deseas hacer en realidad con la condición?.

Un saludo.
Become the change you seek in the world. -Gandhi.


Hola que tal ?
Muchas gracias por contestar. La verdad es que es muy buena onda de tu parte estar ayudando. Vamos con El codigo.
Si si lo copie y pegue ... Y solo me toma 2 mil.. nose que estara pasanso.
Con respecto a los comentarios. Me trae los nicknames y dentro algunos vacios y otros con comentarios. Per ademas me trae Todo esto suelto no dentro de una carpeta... Sino todos los nicknames sueltos y si entro a los nicknames estan en algunos los comentarios.
Me gustaria ponerles filtros Como , si tiene comentarios o no, si tiene tal palabra o no El comentarios. (Me gustaria aprender mas sobre esto )
Por que no hacemos un video en vivo hoy ? Que Les parece ? Tengo algunas propuestas tambien por si están interesados

Enero 12, 2019, 11:44:12 AM #15 Ultima modificación: Enero 12, 2019, 01:21:42 PM por lemos.ema
pude hacer que me lo guarde en carpeta, pero sigo teniendo el problema con el numero de post tomados.... si filtras en insta #Obama tiene 3 millones... solo me toma 2 mil , ayuda alguien sabe por que ?
también me gustaría saber como poner condiciones, por ejemplo que tome solo los comentarios que tengan la palabra "precio" .

otra cosa que me gustaria saber. en Instagram sacamos los datos con /?__a=1 ... pero en otras paginas como seria ? o como se puede averiguar ?
gracias

Buenos días No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

En vista que el hilo se ha hecho un poco largo, te recomiendo editar tu respuesta y detallar todo tu escenario con pantallazos. Como te comenté, si no conocemos tu escenario(versión de python, versión de php, los ficheros, la ejecución, entre otras) es muy complicado colaborarte.

Si deseas tomar la palabra "precio", lo que podrías hacer es algo como:

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta(r'\bprecio\b', string)

Sin embargo, sólo funcionaria para comentarios en español.

Con respecto a tu pregunta de cómo sería con otro hashtag, te pongo un ejemplo(en el post lo explico):

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

El hashtag es underc0de y una vez obtengamos de esa URL el end_cursor, comenzamos a realizar todo el proceso que deseamos.

Un saludo.

Become the change you seek in the world. -Gandhi.


Se que sueno molesto e insistir con preguntas , pero yo realmente quiero aprender y la forma de hacerlo es preguntando y sacandose las dudas. Vos usaste ?__a=1 para despues pasarlo a JSON... pero yo por ejemplo ahora se me ocurrio hacer scraping de skycanner . net . Como puedo hacer ? mi idea es entrar a la pagina , buscador origen= uno particular, destino= (todos los destinos), fechas=todos los meses.. y cuando entra a buscar ponerle condicion, si el pasaje esta menos de esto, descargar y enviar un mail. eso seria mi punto final