Prueba de Script a Mobile

Quería escribir un script de shell / python que compruebe si un sitio web es compatible con dispositivos móviles o no. Usando el navegador esto se puede hacer fácilmente visitando

https://www.google.com/webmasters/tools/mobile-friendly/?url= 

Por ejemplo.-

 https://www.google.com/webmasters/tools/mobile-friendly/?url=http://facebook.com 

Intenté obtener el contenido a través de los comandos curl, wget , lynx pero no funcionó.

¿Como lo puedo hacer?

Sanchit,

Le sugiero que mire la biblioteca de solicitudes para recuperar la url. Además, como ya se ha dicho (no tengo experiencia con esta API), debe llamar ‘ https://www.googleapis.com/pagespeedonline/v3beta1/mobileReady?url=http://facebook.com ‘ en su lugar de la url que publicaste.

Aquí hay un ejemplo:

 import requests r = requests.get('https://www.googleapis.com/pagespeedonline/v3beta1/mobileReady?url=http://facebook.com') data = r.json() 

Eso le daría un archivo json con todos los datos que utiliza el sitio web que publicó.

La página utiliza una solicitud JSONP para una API de Google PageSpeed ​​aún no publicada. Google publica PageSpeeds Insights API v2 , pero la página parece estar usando un punto final v3beta1.

Cuando vaya a la página https://www.google.com/webmasters/tools/mobile-friendly/?url=http://facebook.com por ejemplo y mire la pestaña de red de las herramientas de desarrollo de su navegador, Veré una solicitud para:

 https://www.googleapis.com/pagespeedonline/v3beta1/mobileReady?key=AIzaSyDkEX-f1JNLQLC164SZaobALqFv4PHV-kA&screenshot=true&snapshots=true&locale=en_US&url=http%3A%2F%2Ffacebook.com%2F&strategy=mobile&filter_third_party_resources=false&callback=_callbacks_._Ce2bYp0wchLY 

El parámetro url se toma directamente del parámetro url pasado a la página, el parámetro de callback está allí para que la solicitud JSONP proporcione un contenedor de callback.

Existe la posibilidad de que Google cambie la clave API utilizada allí, pero mientras tanto, puedes usar el código Python para validar la facilidad de uso móvil de un sitio con:

 import requests url_to_test = 'http://facebook.com' params = { 'key': 'AIzaSyDkEX-f1JNLQLC164SZaobALqFv4PHV-kA', 'url': url_to_test, } api_url = 'https://www.googleapis.com/pagespeedonline/v3beta1/mobileReady' response = requests.get(api_url, params=params) data = response.json() passed = all(rule['pass'] for rule in data['ruleGroups'].values()) print('{} is {}'.format(url_to_test, 'mobile friendly' if passed else 'not mobile friendly')) 

Lo resolví yo mismo, con la ayuda de @TimberlakeCoding y @MartijnPieters. Aquí está-

 $ wget -q -O - https://www.googleapis.com/pagespeedonline/v3beta1/mobileReady?url=http://facebo‌​ok.com | grep "\"pass\": true" 

Si el código de estado de salida es 0, eso significa que el sitio web no es compatible con dispositivos móviles.

Espero que ayude a alguien! Gracias

Escribí un sencillo script de Python para esta tarea similar para enviar múltiples solicitudes de red a la API de prueba móvil de Google y guardar “pasar” y algunos otros campos a la base de datos de mysql. Es muy rápido y eficiente.

 # download mysql connector for python # from: https://dev.mysql.com/downloads/connector/odbc/ # select your Platform from drop-down and install it from twisted.internet import reactor, threads from urlparse import urlparse import httplib import itertools import json import mysql.connector GOOGLE_API_KEY = 'YOUR GOOGLE API KEY HERE' db = mysql.connector.connect(user='root', password='root', host='127.0.0.1', database='mobiletracker', autocommit=True) cursor = db.cursor() concurrent = 10 finished=itertools.count(1) reactor.suggestThreadPoolSize(concurrent) def getData(ourl): googleapiUrl = 'https://www.googleapis.com/pagespeedonline/v3beta1/mobileReady?url=' + ourl + '&key=' + GOOGLE_API_KEY print googleapiUrl url = urlparse(googleapiUrl) conn = httplib.HTTPSConnection(url.netloc) conn.request("GET", url.path + '?' + url.query) res = conn.getresponse() return res.read() def processResponse(response,url): jsonData = json.loads(response) try: score = str(jsonData['ruleGroups']['USABILITY']['score']) except Exception, e: score = '0' try: pass_ = jsonData['ruleGroups']['USABILITY']['pass'] #Boolean if pass_: pass_ = '1' else: pass_ = '0' except Exception, e: pass_ = '0' try: cms = str(jsonData['pageStats']['cms']) except Exception, e: cms = '' cursor.execute("SELECT id FROM mobile WHERE url='" + url + "'") result = cursor.fetchone() try: id_ = str(result[0]) query = "UPDATE mobile SET score='" + score + "', pass='" + pass_ + "', cms='" + cms + "' WHERE id = '" + id_ + "'" print query cursor.execute(query) except Exception, e: query = "INSERT INTO mobile SET url='" + url + "', score='" + score + "', pass='" + pass_ + "', cms='" + cms + "'" print query cursor.execute(query) processedOne() def processError(error,url): print "error", url, error processedOne() def processedOne(): if finished.next()==added: reactor.stop() def addTask(url): req = threads.deferToThread(getData, url) req.addCallback(processResponse, url) req.addErrback(processError, url) added=0 for url in open('urllist.csv'): added+=1 addTask(url.strip()) try: reactor.run() except KeyboardInterrupt: reactor.stop() 

También disponible en https://github.com/abm-adnan/multiple-requests