Agerke Balgabekova
Agerke Balgabekova

Reputation: 11

Why importing data to Zoho Analytics API causes error?

My goal is to write a script in Python3 that will push data in existing table in Zoho Analytics, the script will be used by a scheduler once a week. What I have tried to far:

  1. I can successfully import some data using cURL commands. Like so

curl -X POST \ 'https://analyticsapi.zoho.com/api/OwnerEmail/Workspace/TableName?ZOHO_ACTION=IMPORT& ZOHO_OUTPUT_FORMAT=JSON&ZOHO_ERROR_FORMAT=JSON&ZOHO_API_VERSION=1.0&ZOHO_IMPORT_TYPE=APPEND&ZOHO_AUTO_IDENTIFY=True&ZOHO_ON_IMPORT_ERROR=ABORT&ZOHO_CREATE_TABLE=False' \ -H 'Authorization: Zoho-oauthtoken *******' \ -H 'content-type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW' \ -F ZOHO_FILE='path_to_csv'

  1. What I found out that the ReportClient provided by Zoho Analytics team Zoho Report Client for Python is not compatible with Python 3. Hence, I installed a wrapped for this ReportClient from [here] (https://pypi.org/project/zoho-analytics-connector).

  2. Following sample examples from Zoho website and tests in github of wrapper for Zoho in Python3, I implement something like this: Have a class to keep my ENV variables

import os
from zoho_analytics_connector.report_client import ReportClient, ServerError
from zoho_analytics_connector.enhanced_report_client import EnhancedZohoAnalyticsClient


class ZohoTracking:
    LOGINEMAILID = os.getenv("ZOHOANALYTICS_LOGINEMAIL")
    REFRESHTOKEN = os.getenv("ZOHOANALYTICS_REFRESHTOKEN")
    CLIENTID = os.getenv("ZOHOANALYTICS_CLIENTID")
    CLIENTSECRET = os.getenv("ZOHOANALYTICS_CLIENTSECRET")
    DATABASENAME = os.getenv("ZOHOANALYTICS_DATABASENAME")
    OAUTH = True
    TABLENAME = "My Table"

Instantiate the Client Class

    def get_enhanced_zoho_analytics_client(self) -> EnhancedZohoAnalyticsClient:
        assert (not self.OAUTH and self.AUTHTOKEN) or (self.OAUTH and self.REFRESHTOKEN)
        rc = EnhancedZohoAnalyticsClient(
         // Just setting email, token, etc using class above
         ... 
        )
        return rc```
Then have a method to upload data to existing table, the data_upload() function has the problem.

def enhanced_data_upload(self):
    enhanced_client = self.get_enhanced_zoho_analytics_client()
    try:
        with open("./import/tracking3.csv", "r") as f:
            import_content = f.read()
            print(type(import_content))
    except Exception as e:
        print(f"Error:Check if file exists in the import directory {str(e)}")
        return
 
    res = enhanced_client.data_upload(import_content=import_content, table_name=ZohoTracking.TABLENAME)
    assert res




Traceback (most recent call last):
  File "push2zoho.py", line 106, in <module>
    sample.enhanced_data_upload()
  File "push2zoho.py", line 100, in enhanced_data_upload
    res = enhanced_client.data_upload(import_content=import_content, table_name=ZohoTracking.TABLENAME)
  File "/Users/.../zoho_analytics_connector/enhanced_report_client.py", line 99, in data_upload
    matching_columns=matching_columns)
  File "/Users/.../site-packages/zoho_analytics_connector/report_client.py", line 464, in importData_v2
r=self.__sendRequest(url=url,httpMethod="POST",payLoad=payload,action="IMPORT",callBackData=None)
  File "/Users/.../zoho_analytics_connector/report_client.py", line 165, in __sendRequest
    raise ServerError(respObj)
  File "/Users/.../zoho_analytics_connector/report_client.py", line 1830, in __init__
    contHeader = urlResp.headers["Content-Type"]
TypeError: 'NoneType' object is not subscriptable



That is the error I receive. What am I missing in this puzzle? Help is appreciated

Upvotes: 1

Views: 386

Answers (1)

Tim Richardson
Tim Richardson

Reputation: 7231

In Feb 2021 I changed this inherited Zoho code in my library. Now it is: contHeader = urlResp.headers.get("Content-Type",None)

which avoids the final exception you had.

Upvotes: 1

Related Questions