Zoho CRM SDK

news2024/12/23 18:33:24

前言

因早期公司的业务在Zoho CRM,现在孵化出自己的想法,想着能把一部分CRM的数据同步导出来,故研究Zoho CRM SDK的接入方法。虽说在文档上都有提及,但有部分细节不甚明了,也是一遍遍尝试出来的,所以分享出来少走些弯路

一、Python SDK

1.环境配置(python2.7及以上)

  • pip install requests
  • pip install zcrmsdk

注:此处安装的zcrmsdk,可能无法像文档描述似的加载配置文件zcrmsdk.ZCRMRestClient.initialize(config),那是因为安装的包版本不正确,应pip install zcrmsdk==2.0.11

二、注册应用

我理解着的这个应用相当于访问CRM的媒介,应用APP拿着CRM授权给的访问权限(令牌)请求,认证通过即可访问CRM数据!

1. 访问页面:https://accounts.zoho.com.cn/developerconsole配置应用,两种方式!

  • 第一种方式:基于web
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 第二种方式:基于自身self
    在这里插入图片描述
    在这里插入图片描述

三、访问范围权限&授权令牌grant_token

1.两种方式配置,应用与URL

  • 应用生成
    ①选择应用Self Client
    ②在“作用域”处填写有效的作用域(参考本章5.),多个作用域之间用逗号分隔
    ③点击"生成"按钮,提取授权令牌grant_token
    在这里插入图片描述
    在这里插入图片描述
  • URL生成
    ①选择应用Test_sdk
    ②收集client_id,作用域scope,重定向redirect_uri的值
    ③授权url规则{Accounts_URL}/oauth/v2/auth,路径参数有scope、client_id,、response_type、access_type、redirect_uri
    ③发起GET请求"https://accounts.zoho.com.cn/oauth/v2/auth?scope=ZohoCRM.Modules.ALL&client_id={client_id}&response_type=code&access_type={"offline"or"online"}&redirect_uri={redirect_uri}"
    ④在重定向的地址栏{redirect_uri}?code={grant_token}&location=cn&accounts-server=https://accounts.zoho.com.cn&中,提取授权令牌grant_token
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

四、SDK配置

1.相关的参数详解

  • client_id、client_secret 和 redirect_uri 是注册 Zoho 客户端后获取的 OAuth 客户端配置
  • access_type 取值范围【online,offine】,必须设置为 offline 的唯一原因是 Python SDK 目前不支持在线 OAuth 客户端
  • accounts_url 根据您的域(EU或CN),更改 accounts_url 的值。默认值设置为 US 域,此处设置的CN域
  • applicationLogFilePath 日志配置,如不提供此参数则不记录,仅在控制台查看它们。"."代表日志存放到当前位置
  • sandbox 是否是沙箱账户,默认为false。很明显,此处不是沙箱环境
  • 单用户认证 currentUserEmail,多用户认证,需要在当前线程中将用户邮箱地址设置为属性threading.current_thread().__setattr__('current_user_email','user@email.com')。无论如何一定要选择一种方式认证,否则Python SDK将抛出异常
  • apiBaseUrl CRM函数模块的调用最终转换成url地址的请求,这个值代表URL地址的根地址。如https://www.baidu.com/s?wd=1111,根地址即为https://www.baidu.com
  • apiVersion 调用的api服务版本号。一般跟地址的关系大体是,最终地址=根URL/版本号/api服务的接口名
  • token_persistence_path 认证的持久化处理,即类似于token的永久认证。

2.持久化的四种方式,选其一即可

①保存到默认文件zcrm_oauthtokens.pkl (会在配置路径下创建此文件)中,此处采用这种
'token_persistence_path': '.'
②保存到自定义文件中

'persistence_handler_class' : 'Custom',
'persistence_handler_path': 'CustomPersistance.py'

③保存到本地local默认数据库
无需配置其它,自动本地读取数据库配置,需要:数据库端口为3306;数据库名称应该为“zohooauth”;必须有一个名为“oauthtokens”的表,此表带有以下列:“user identifier”(varchar(100))、“accesstoken”(varchar(100))、“refreshtoken”(varchar(100)) 和“expirytime”(bigint)
④保存到自定义数据库

'mysql_username':'',
'mysql_password':'',
'mysql_port':'3306',

3.demo演示

import zcrmsdk
import logging
import httpx

class Request:
    def __init__(self):
        self.headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0",
            "Authorization": "Zoho-oauthtoken 1000.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
        }

    def get(self, url, headers={}):
        logging.debug(f"收到GET请求,URL地址{url}")
        self.headers.update(headers)
        return httpx.get(url, headers=self.headers).json()

    def post(self, url, json_data, files=None, headers={}):
        logging.debug(f"收到POST请求,URL地址{url},Data数据{json_data}")
        self.headers.update(headers)
        return httpx.post(url=url, json=json_data, files=files, headers=headers).json()

config = {
    # 基于web的应用尝试
    # "client_id": "1000.xxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    # "client_secret": "964xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    # 基于self的应用尝试
    "client_id": "1000.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "client_secret": "e5e3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "redirect_uri": "https://hao.360.com/?a1004",
    "accounts_url": "https://accounts.zoho.com.cn",
    "token_persistence_path": ".",
    "access_type": "offline",
    "applicationLogFilePath": "./persistence",
    "sandbox": "False",
    "currentUserEmail": "username@xyz.com",
    "apiBaseUrl": "https://www.zohoapis.com.cn",
    "apiVersion": "v2",
}
# 初始化
zcrmsdk.ZCRMRestClient.initialize(config)
oauth_client = zcrmsdk.ZohoOAuth.get_client_instance()
# 授权令牌grant_token
grant_token = "1000.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
oauth_tokens = oauth_client.generate_access_token(grant_token)
accessToken, refreshToken = oauth_tokens.accessToken, oauth_tokens.refreshToken

# 通过刷新令牌获得新的访问令牌
# user_identifier = "username@xyz.com"
# oauth_tokens = oauth_client.generate_access_token_from_refresh_token(refreshToken, user_identifier)

五、访问令牌Token的获取与撤销

1.两种方式获取token,URL与Code

  • Code代码获取Token已在本章4.3演示,即accessToken值
  • URL获取访问令牌Token
    ①授权url规则{Accounts_URL}/oauth/v2/token,路径参数有grant_type、client_id,、client_secret、redirect_uri、code
    ②释意,grant_type固定值authorization_code;client_id客户端ID;client_secret客户端密钥;redirect_uri回调(重定向)URL;code授权令牌grant_token
    ③发起POST请求"https://accounts.zoho.com.cn/oauth/v2/token?grant_type=authorization_code&client_id={client_id}&client_secret={client_secret}&redirect_uri={redirect_uri}&code={grant_token}"
    在这里插入图片描述
  • 刷新用以获取访问令牌的地址,POST请求{Accounts_URL}/oauth/v2/token?refresh_token={refresh_token}&client_id={client_id}&client_secret={client_secret}&grant_type=refresh_token
  • 撤销访问令牌的地址,POST请求{Accounts_URL}/oauth/v2/token/revoke?token={refresh_token}

六、访问zoho的数据

在这里插入图片描述

1.python函数为什么无法访问CRM内部数据?

可以看到,请求头里需要的token,转换在函数中无法携带,认证无法通过

七、关于作用域的问题

ZohoCRM.org.ALL,
ZohoCRM.users.ALL,
ZohoCRM.Bulk.ALL,
ZohoCRM.Modules.ALL,
ZohoCRM.modules.notes.ALL
ZohoCRM.settings.all,
ZohoCRM.settings.modules.all,
ZohoCRM.settings.fields.all,
ZohoCRM.settings.layouts.all,
ZohoCRM.settings.related_lists.all,

.
.
.
研究明白在细说!目前来说的话呢,哪个能访问就用哪个,哈哈哈..

八、引用

  • 中文版
  • 中文高级版
  • 英文版
  • GitHub版
  • 其它版
  • Zoho社区解决问题
  • 另一种途径接入未尝试

九、结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/630943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Vue】六:路由(上)使用路由 多级路由

文章目录 1.多页面应用2. 单页面应用(使用路由)3. 多级路由 1.多页面应用 2. 单页面应用(使用路由) (1)安装vue-router插件 vue2 要安装 vue-router3 npm i vue-router3vu3 要安装 vue-router4 npm i vue…

字节薪酬体系被曝光,我真的酸了....

曾经的互联网是PC的时代,随着智能手机的普及,移动互联网开始飞速崛起。而字节跳动抓住了这波机遇,2015年,字节跳动全面加码短视频,从那以后,抖音成为了字节跳动用户、收入和估值的最大增长引擎。 自从字节…

【Java】数组详解

文章目录 一、数组的基本认识1.1 数组的概念1.2数组的创建与初始化1.3 数组的使用 二、数组的类型 — 引用类型2.1 JVM 内存分布2.2 什么是引用类型2.3 基本类型变量与引用类型变量的区别2.4 Java 中的 null 三、数组的应用3.1 保存数据3.2 函数参数3.3 函数返回值 一、数组的基…

STL——string和vector容器

初识STL **STL的基本概念****vector容器存放内置数据类型****在vector容器中存放自定义数据类型****vector容器嵌套vector容器****string容器——构造函数****string容器——赋值操作****string容器——字符串拼接****string容器——字符串的查找和替换****string容器——字符串…

Java阶段四Day01

Java阶段四Day01 文章目录 Java阶段四Day01Security框架通配符Vue脚手架 Vue-cli关于VUE关于VUE Cli创建Vue Cli工程解决端口被占用 Vue工程的工程结构[.idea]【重要】[node_modules]【重要】[public]favicon.icoindex.html [src][assets][compnents]【重要】[router][store]【…

Kafka详解(一)

第1章 Kafka概述 1.1 定义 1.2 消息队列 目前企业中比较常见的消息队列产品主要有Kafka、ActiveMQ、RabbitMQ、RocketMQ等。Message Queue ② 在大数据场景主要采用Kafka作为消息队列 ② 在JavaEE开发中主要采用ActiveMQ、RabbitMQ、RocketMQ Kafka存储数据,且保证…

虚函数+多态实现原理(一个冷门知识)

目录 多态实现 虚函数定义 先说原理 抛出问题 探究多态底层 冷门知识 多形态的大海 多态实现 完成类多态体现,多态两个条件: 虚函数重写 父类指针或者引用去调用虚函数。 虚函数定义 虚函数重写/覆盖条件 : 函数 三同 (函数名、参数、返回值) 不符合重写&…

【板栗糖GIS】——如何使用插件将微信读书笔记同步到notion

【板栗糖GIS】——如何使用插件将微信读书笔记同步到notion 注:本文创意以及插件开发皆是B站的【三此君】 视频链接如下: 全网唯一支持图文导出的微信读书插件,升级啦!主打一个惊艳。_哔哩哔哩_bilibili ,我只是记录…

阿里内部人手一份的Spring Cloud Alibaba手册

“微服务架构经验你有吗?” 前段时间一个朋友去面试,阿里面试官一句话问倒了他。实际上,不在 BAT 这样的大厂工作,是很难接触到支撑千亿级流量微服务架构项目的。但也正是这种难得,让各个大厂都抢着要这样的人才&…

linux(信号结尾)

目录: 1.可重入函数 2.volatile关键字 3.SIGCHLD信号 -------------------------------------------------------------------------------------------------------------------------------- 1.可重入函数----------用来描述一个函数的特点的 1.在单进程当中也存…

【数据结构】图的遍历、图的应用

以下是对王道数据结构图的部分选择题的纠错 图的遍历 对于一个非连通无向图G,采用DFS访问所有顶点,在DFSTraverse函数中调用DFS的次数正好等于连通分量个数 一次遍历必然会将一个连通图中的所有顶点都访问到,对于已被访问的顶点不在调用DFS&…

APP测试中ios和Android的区别是什么~

01、常识性区别 02、导航方式 iOS:Tab放在页面底部,不能通过滑动来切换,只能点击。也有放在上面的,也不能滑动,但有些Tab本身可以滑动,比如天猫的。还有新闻类的应用。 Android:一般放在页面…

数据库实验五 函数

任务描述 本关任务:对表达式取整 相关知识 四舍五入的函数 ROUND(X,D) 返回X,其值保留到小数点后D位,而第D位的保留方式为四舍五入。 若D的值为0,则对小数部分四舍五入。 若将D设为负值,保留X值小数点左边的D位 TRUNCATE(X,D)…

《剑指 Offer--LeetCode 学习计划》-- 字符串

剑指 Offer 05. 替换空格&#xff08;Easy&#xff09; 题目描述 请实现一个函数&#xff0c;把字符串 s 中的每个空格替换成"%20"。限制&#xff1a;0 < s 的长度 < 10000。 举例说明 示例 1&#xff1a; 输入&#xff1a;s “We are happy.”。输出&…

K210图像检测(1~8)数字卡片识别

前言 第一次使用该平台。想先找一个简单的识别&#xff0c;来走走流程。就想到了&#xff0c;前几年的送药小车的数字卡片识别。花了半天收集标记图片。在运行时要注意摄像头与数字卡片的高度。不过也有些不足&#xff0c;可能是收集某个数字的训练集的时候&#xff0c;拍摄高度…

文件智能归类,让文件分类变得简单易行

在数字化信息时代&#xff0c;我们经常需要处理各种类型的文件&#xff0c;如文档、图片、视频等&#xff0c;而这些文件可能存在于不同的文件夹、不同的磁盘之间&#xff0c;管理起来十分繁琐。为了解决这个问题&#xff0c;文件智能归类管理应运而生。这种文件管理方式采用智…

公司新招了几个00后,我愿称之为卷王之王

前几天我们公司一下子也来了几个新人&#xff0c;这些年轻人是真能熬啊&#xff0c;本来我们几个老油子都是每天稍微加会班就打算走了&#xff0c;这几个新人一直不走&#xff0c;搞得我们也不好走。 2023年秋招就要开始了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&a…

水中声源级SL的求解应用举例

水中声源级SL的求解应用举例 在水声学中&#xff0c;经常会遇到声源级的概念&#xff0c;并根据声源级的大小估计其他重要参数&#xff0c;本文举例说明声源级的概念和定义。 一、声源级的定义 声源级用来描述声音辐射源所产生声信号或噪声在1m距离处的声强量级。其定义为 S …

安卓大作业 书籍列表APP

系列文章 安卓大作业 书籍列表APP 文章目录 系列文章1&#xff0e;背景2&#xff0e;功能3. 源代码获取 1&#xff0e;背景 我做的项目是一个可以查看到书籍列表以及详情效果的内容&#xff0c;主要使用到的技术有Intent数据传递以及数据库存储的应用&#xff0c;其次使用的组…

【笔试强训选择题】Day23.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录…