Python не записывает файл, если выполняется из задания cron - PullRequest
0 голосов
/ 17 апреля 2019

Я написал скрипт на python, который извлекает некоторые данные из Google Analytics API, а затем записывает эти значения в файл JSON в папке webroot. Мой скрипт работает нормально и записывает JSON-файл, когда я выполняю его напрямую или через ./analytics.py. Я на Ubuntu 18.04.

Я сделал его исполняемым через:

chmod +x analytics.py

и добавил Шебанг в начале моего кода:

#!/usr/bin/env python3

Моя запись в crontab -e выглядит так:

45 17 * * * /root/dashboard_scripts/analytics.py

Вывод tail -f / var / log / syslog выглядит следующим образом:

Apr 17 15:44:01 gs-kpi cron[62390]: (root) RELOAD (crontabs/root)
Apr 17 15:45:01 gs-kpi CRON[63978]: (root) CMD (/root/dashboard_scripts/analytics.py)

Я также проверил с помощью образца cron, работает ли cron под пользователем root.

Мой скрипт на Python такой:

#!/usr/bin/env python3

import argparse
import json
import re
import os
import pprint
from googleapiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
import httplib2
from oauth2client import client
from oauth2client import file
from oauth2client import tools

save_path = '/var/www/html/'
filename = 'googleanalytics_data.json'

data = []
SCOPES = ['https://www.googleapis.com/auth/analytics.readonly']
DISCOVERY_URI = ('https://analyticsreporting.googleapis.com/$discovery/rest')
KEY_FILE_LOCATION = '543671d681ee.p12'
SERVICE_ACCOUNT_EMAIL = 'data-gserviceaccount.com'
VIEW_ID = '10'

def initialize_analyticsreporting():
  """Initializes an analyticsreporting service object.
  Returns:
    analytics an authorized analyticsreporting service object.
  """
  credentials = ServiceAccountCredentials.from_p12_keyfile(
    SERVICE_ACCOUNT_EMAIL, KEY_FILE_LOCATION, scopes=SCOPES)
  http = credentials.authorize(httplib2.Http())
  # Build the service object.
  analytics = build('analytics', 'v4', http=http, discoveryServiceUrl=DISCOVERY_URI)
  return analytics

def get_report(analytics):
  # Use the Analytics Service Object to query the Analytics Reporting API V4.
  return analytics.reports().batchGet(
      body={
          'reportRequests': [
              {
                  'viewId': VIEW_ID,
                  'dateRanges': [
                      {'startDate': '7daysAgo', 'endDate': 'yesterday'},
                      {'startDate': '14daysAgo', 'endDate': '8daysAgo'},
                      ],
                  'metrics': [
                      {'expression': 'ga:pageviews'},
                      {'expression': 'ga:sessions'},
                      {'expression': 'ga:pageviewsPerSession'},
                      {'expression': 'ga:bounces'},
                      {'expression': 'ga:users'},
                      {'expression': 'ga:newUsers'},
                      {'expression': 'ga:goal7Starts'},
                      {'expression': 'ga:avgPageLoadTime'}
                  ],
                  "orderBys": [
                      {"fieldName": "ga:pageviews", "sortOrder": "DESCENDING"}
                  ]
              }
          ]
      }
  ).execute()
def print_response(response):
  """Parses and prints the Analytics Reporting API V4 response"""
  for report in response.get('reports', []):
    columnHeader = report.get('columnHeader', {})
    dimensionHeaders = columnHeader.get('dimensions', [])
    metricHeaders = columnHeader.get('metricHeader', {}).get('metricHeaderEntries', [])
    rows = report.get('data', {}).get('rows', [])
    for row in rows:
      dimensions = row.get('dimensions', [])
      dateRangeValues = row.get('metrics', [])
      for header, dimension in zip(dimensionHeaders, dimensions):
        data.append ( header + ': ' + dimension )
      for i, values in enumerate(dateRangeValues):
        data.append ('Date range (' + str(i) + ')' )
        for metricHeader, value in zip(metricHeaders, values.get('values')):
          data.append ( metricHeader.get('name') + ': ' + value )
def main():
  analytics = initialize_analyticsreporting()
  response = get_report(analytics)
  print_response(response)
  keys = []
  values = []
  counter = 0
  for item in data:
      try:
        key = re.search(r'ga:(.*?):', item).group()
        value = re.search(r'\d{4,5}', item).group()
        counter +=1
        if counter > 7:
            keys.append(key + '_7days')
        else:
            keys.append(key + '_14days')
        values.append(value)
      except:
          pass

  ga_dict = dict(zip(keys, values))
#   print(ga_dict)

  with open(os.path.join(save_path, filename), mode='w') as f:
    f.write(json.dumps(ga_dict, indent=2))

if __name__ == '__main__':
  main()
...