Search code examples
pythonrestgoogle-apigoogle-apis-explorergoogle-search-console

Google Testing Tools API - MobileFriendlyTest Python 403 Forbidden


So recently I came across the Google Testing Tools API - Mobile Friendly Test (https://developers.google.com/webmaster-tools/search-console-api/reference/rest/v1/urlTestingTools.mobileFriendlyTest) but I couldn't work it even when I am trying on the site. I tried to use python for this app and followed the guide (https://developers.google.com/webmaster-tools/search-console-api/v1/samples) and I made some few changes to actually make it work (since urllib was merged into one library). So end of the day my code looked like this:

from __future__ import print_function
import urllib
import urllib.request as urllib2

api_key =   'API_KEY'
request_url = 'https://www.google.com/'
service_url = 'https://searchconsole.googleapis.com/v1/urlTestingTools/mobileFriendlyTest:run'


params = {
    'url' : request_url,
    'key' : api_key,
}


data = urllib.parse.urlencode(params)
content = urllib2.urlopen(url=service_url, data=str.encode(data)).read()
print(content)

And I got the error:

  File ".\script2.py", line 14, in <module>
    content = urllib2.urlopen(url=service_url, data=str.encode(data)).read()
  File "C:\Python\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "C:\Python\lib\urllib\request.py", line 531, in open
    response = meth(req, response)
  File "C:\Python\lib\urllib\request.py", line 641, in http_response
    'http', request, response, code, msg, hdrs)
  File "C:\Python\lib\urllib\request.py", line 569, in error
    return self._call_chain(*args)
  File "C:\Python\lib\urllib\request.py", line 503, in _call_chain
    result = func(*args)
  File "C:\Python\lib\urllib\request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden

I also tried using curl command and the online tool (not https://search.google.com/test/mobile-friendly but Try This API section) but neither of them worked.


Solution

  • Well I actually solved my own problem, it is mainly caused by urllib I think. So here is what I did;

    from __future__ import print_function
    import urllib.parse as parser
    import urllib.request as urllib2
    import json
    import base64
    
    request_url = url
    
    params = {
            'url': request_url,
            'key': api_key
        }
    
        data = bytes(parser.urlencode(params), encoding='utf-8')
        content = urllib2.urlopen(url=service_url, data=data).read()
        sContent = str(content, encoding='utf-8') #Shorthand for stringContent