Python 简单销售力量
我正在尝试使用 simple_salesforce 这个库,通过Python查询Salesforce的数据。我用的是我的用户名和密码,我非常确定这些信息是正确的。我从登录Salesforce后查看公司资料中获取了组织ID,这个ID只有15位数字。我特别使用这个组织ID,是为了避免使用安全令牌,因为我不知道那是什么。我哪里做错了呢?
代码:
from simple_salesforce import Salesforce
sf = Salesforce(instance_url='https://na1.salesforce.com', session_id='')
sf = Salesforce(password='password', username='email', organizationId='15 digit org id')
输出:
File "C:\Python27\lib\site-packages\simple_salesforce\api.py", line 100, in __init__
proxies=self.proxies)
File "C:\Python27\lib\site-packages\simple_salesforce\login.py", line 124, in SalesforceLogin
code=except_code, message=except_msg))
simple_salesforce.login.SalesforceAuthenticationFailed: INVALID_LOGIN: Invalid username, password, security token; or user locked out.
8 个回答
安全令牌是一个自动生成的密钥,你需要把它加到密码的后面,才能在不安全的网络上登录Salesforce。比如说,如果你的密码是mypassword,而你的安全令牌是XXXXXXXXXX,那么你需要输入mypasswordXXXXXXXXXX才能登录。不管你是通过API还是像Connect for Outlook、Connect Offline、Connect for Office、Connect for Lotus Notes或数据加载器这样的桌面客户端登录,安全令牌都是必须的。
要重置你的安全令牌,可以按照以下步骤操作:
- 在Salesforce页面的顶部,点击你名字旁边的下拉箭头。在你名字下面的菜单中,选择“设置”或“我的设置”,看哪个出现。
- 在左侧的菜单中,选择以下其中一个:
- 如果你点击了“设置”,选择“我的个人信息 | 重置我的安全令牌”。
- 如果你点击了“我的设置”,选择“个人 | 重置我的安全令牌”。
- 点击“重置安全令牌”按钮。新的安全令牌会通过电子邮件发送到你Salesforce用户记录上的邮箱。
虽然这个回答有点晚,但如果有人在找同样的问题,希望我做的事情能帮到你。
我也试着添加公司ID,但问题是,除非你是自助服务用户,否则公司ID可以是空的。
sf = Salesforce(password='password', username='email', organizationId='')
正如其他用户提到的,确保你使用了IP白名单,否则这个方法是行不通的。
编辑
重置我的密码怎么会让我看到令牌是什么呢?
就是会这样。如果用户之前请求过安全令牌(这个令牌会通过电子邮件发送给你,所以你需要能访问与你的账户关联的邮箱)——那么每次重置密码时,系统都会生成一个新的令牌并发送到你的邮箱。此外,一旦你登录到系统(通过网页版本,而不是API),你会有一个选项可以重置你的令牌(同样,这也会发送一封邮件给你)。
这就像你根本没有阅读或尝试我们写的任何内容一样!
我在寻找来自可信或官方来源的答案。
https://help.salesforce.com/htviewhelpdoc?id=user_security_token.htm
https://help.salesforce.com/HTViewSolution?id=000004502
https://help.salesforce.com/HTViewSolution?id=000003783
还有来自库的文档:
https://github.com/neworganizing/simple-salesforce
使用IP白名单组织ID方法登录,只需使用你的Salesforce用户名、密码和组织ID。
就是这样。如果你的IP地址在白名单中——你就不需要令牌。如果不在——你就必须生成令牌。就是这样。
原始回答
我对那个Python库不太熟悉,但……去Salesforce -> 设置 -> 我的个人信息,查看登录历史。如果里面有“失败:需要安全令牌”这样的内容,那你就麻烦了,你必须使用安全令牌。
我不知道有什么方法可以绕过这个限制(我从PHP、Java、C#等连接过API……所以如果那个Python库有什么神奇的方法可以绕过这个限制,我会非常惊讶。你可能习惯于传递一个会话ID,假设你已经通过身份验证并拥有一个有效的会话。
另一个选择是检查你的IP并将其添加到受信任的IP范围(这是设置中的一个选项)。当整个办公室有相同的静态IP时,这个选项很有用;如果你在家工作,就没那么有用了。
如果这也不行——你可能想找一些使用OAuth2而不是常规SOAP API进行身份验证的库。
我写了大部分的 simple-salesforce
这个库(不过 organizationId
的部分我没写,因为我没有一个可以测试的IP白名单账户)。
大多数普通用户应该使用的版本就是简单的 username
、password
和 security_token
方法。
所以像这样就可以了:
from simple_salesforce import Salesforce
sf = Salesforce(username='nick@nickcatalano.com', password='nickspassword', security_token='tokenemailedtonick')
最让人困惑的部分就是 security_token
了(这也是我当初卡住的地方)。其实,安全令牌会在你成功重置密码后通过邮件发送给你。所以如果你去你的 Salesforce 账户重置密码,我相信你会收到一封主题为 salesforce.com security token confirmation
的邮件,里面会包含一个 Security Token
,这就是你的 security_token
。
老实说,security_token
这个参数更多的是为了方便而存在。在大多数用户依赖的正常 email
/password
/token
流程中,实际上发送的是 email
作为登录名,以及 {password}{security_token}
作为密码。我认为你可以自己把它们拼接起来,只传入 email
和 password
这两个参数,如果你愿意的话。但我觉得让大家自己拼接密码和令牌会违背 simple
这个 simple-salesforce
的初衷。
有一种方法可以使用simple-salesforce仅通过用户名和密码登录,不需要安全令牌:
from simple_salesforce import Salesforce, SalesforceLogin
session_id, instance = SalesforceLogin(username='<user>', password='<pass>')
sf = Salesforce(instance=instance, session_id=session_id)
# Logged in! Now perform API actions, SOQL queries, etc.
sf.query_all('<soql>')
解释
所有使用simple-salesforce的例子都从调用Salesforce
构造函数开始来登录。这个构造函数可以接受一个已经存在的会话ID,或者用来登录的新认证信息。当登录时,它会调用一个更底层的SalesforceLogin
函数来完成实际的工作,但有趣的是,SalesforceLogin
对它的参数没有强制要求——它可以仅用用户名和密码发出正确的SOAP调用来登录,而不需要令牌或组织ID。
利用这个技巧,我们可以直接调用SalesforceLogin
,获取新的会话ID,然后直接将其传递给Salesforce
构造函数。从那时起,我们就可以进行经过认证的API请求了。
注意
在PyPI上可用的simple-salesforce版本(也就是通过pip install simple-salesforce
安装的版本)与simple-salesforce的GitHub仓库相比非常过时。最新版本支持额外的登录参数,比如domain
,可以用来登录自定义域。要获取最新版本,请使用
pip install --upgrade https://github.com/simple-salesforce/simple-salesforce/archive/master.zip
(从zip文件安装比使用git+ssh://
或git+https://
要快,正如这个回答中提到的。)