一个简单的 Python 包,用于促进与 Bullhorn REST API 的交互
项目描述
::
########:: ##:::: ##: ##::::::: ##::::::: ##:::: ##:: # ######:: ########:: ##::: ##:::::::::::::
##.... ##: ##: ::: ##: ##::::::: ##::::::: ##:::: ##:'##.... ##: ##....# #: ###:: ##:::::::::::::
##:::: ##: ##:::: ##: ##::::::: # #::::::: ##:::: ##: ##:::: ##: ##:::: ##: ####: ##:::::::: :::::
########:: ##:::: ##: ##::::::: ##::::::: ######## #: ##:::: ##: ########:: ## ## ##:::::::::::::
##.... ##: # #:::: ##: ##::::::: ##::::::: ##.... ##: ##:::: ##: ##.. ## ::: ##。####:::::::::::::
##:::: ##: ##:::: ##: ##::::::: ##:::: ::: ##:::: ##: ##:::: ##: ##::. ##:: ##:. ###:::::::::::::
########::. #######:: ########: ########: ##:::: ##:. #######:: ##:::. ##: ##::. ##:::::::::::::::
........::::.......:::........::........::..:::::. .:::........:::..:::::..::..::::..::::::::::::::
::: ::::::'####:'##::: ##:'########:'########:'######## ::'########::::'###:::::'######::'########
:::::::: ::. ##:: ###:: ##:... ##..:: ##.....:: ##.... ##: ##.....:::: '## ##:::'##... ##: ##.....::
:::::::::: ##:: ####: ##::: : ##:::: ##::::::: ##:::: ##: ##::::::::'##:. ##:: ##:::..:: ##:::::::
:::::::::: ##:: ## ## ##:::: ##:: :: ######::: ########:: ######:::'##:::. ##: ##::::::: ######:::
:::::::::: ##:: ##。####:::: ##:::: ##...:::: ##.. ##::: ##...:::: ######### : ##::::::: ##...::::
::::::::::: ##:: ##:. ###:::: ##:::: ##::::::: ##::. ##:: ##::::::: ##.... ##: ##::: ##: ##::::::::
::::::::::####: ##::. ##:::: ##:::: ########: ##:::. ##: ##::::::: ##:::: ##:. ######:: ########:
::::::::::....::..:::::..:::::..:: :::.........::..:::::..::..:::::::::..::::::..:::.... ..:::........::
描述
===========
这个包方便了 Bullhorn 的开发者 API 的使用。该软件包的完整文档可在 `<https://jjorissen52.github.io/bullhorn_interface/index.html>`__ 获得。
功能
--------
- 处理授权
- 存储凭据可选
- 处理令牌
- 授予
- 存储
- 自动刷新过期令牌
- 促进简单并发
- 在 Windows 中工作(请不要闪光摄影)
环境设置
=================
Linux
-----
使用 anaconda 或其他任何东西创建环境并激活它:
.. code:: python
conda create -n Bullhorn3.6
source activate Bullhorn3.6
pip install -r /path/to/project_root/requirements.txt
Windows (Anaconda)
==================
同上,但需要执行
. .code ::python
conda install psycopg2
conda install sqlalchemy
之后,因为 Anaconda 必须解决一些依赖关系
才能使这些软件包在 Windows 上运行。我强烈建议您
在 Windows 中使用 Anaconda,因为它会处理所有令人讨厌的 c 位
许多 python 包需要。
## 配置
需要有一个名为``bullhorn_interface.conf`` 的文件,
在你的系统某处看起来像这样:
.. code:: python
[bullhorn_interface]
TOKEN_HANDLER = [pick from 'live', 'pg', or ' sqlite']
CLIENT_ID = client_id
CLIENT_SECRET = client_secret
BULLHORN_USERNAME = 用户名
BULLHORN_PASSWORD = 密码
EMAIL_ADDRESS =
email@email.com EMAIL_PASSWORD = 密码
DB_NAME =
Bullhorn_box DB_HOST = localhost
DB_USER = db_user DB_PASSWORD
= 密码
. 如果不,
您需要将环境变量设置为此
文件的完整路径。请注意,如果您
不习惯以纯文本形式存储项目,则可以将这些行中的每一行留空,但
如果将重要项目留空,则任何测试都不会通过。请参阅`here <#no_plaintext>`__,了解如何
在不以纯文本形式存储凭据的情况下使用界面。
Linux
=====
.. code:: python
export INTERFACE_CONF_FILE=/home/jjorissen/interface_secrets.conf
Windows
=======
.. code:: python
set INTERFACE_CONF_FILE=/full/path/to/bullhorn_secrets.conf
Python
.. 代码:: python
导入操作系统
os.environ['INTERFACE_CONF_FILE'] = '/home/jjorissen/interface_secrets.conf'
要测试您当前的配置,您可以执行以下操作:
.. code:: python
# 这不能在 jupyter 笔记本中运行,遗憾的是。
from Bullhorn_interface import tests
tests.run()
如果您想运行全覆盖测试(即使是您
未配置的功能),您可以先设置以下环境变量。
.. code:: python
export TEST_FULL_COVERAGE=1 # 实际上并没有完全覆盖,抱歉。
开发人员,您可以运行以下代码来测试覆盖率。
.. 代码:: python
sudo apt-get install coverage
coverage run -m unittest discover -s Bullhorn_interface/
#inline summary
coverage report -m
# 生成浏览器可导航的摘要
覆盖率 html
使用 Postgres 或 SQLite
========================
数据库设置
------ -------------
注意:如果您使用 PG,您的 ``DB_USER`` 必须有权访问您的 postgreSQL 服务器上的 'postgres' 数据库,并且必须有足够的权限来创建和编辑数据库。
要创建一个数据库来存放您的令牌:
.. code:: python
from bullhorn_interface.api import tokenbox
tokenbox.create_database()
.. parsed-literal::
Bullhorn_box 创建成功。
如果您出于某种原因希望删除该数据库:
.. code:: python
tokenbox.destroy_database()
.. parsed-literal::
名为 Bullhorn_box 的数据库将在 5...4...3...2...1...0
Bullhorn_box 成功删除。
就这么容易。第一次生成令牌时,必要的表将自动创建
,所以不要担心!
更多关于使用`tokenbox`的信息,请访问
`repo <https://github.com/jjorissen52/tokenbox>`__
接口说明
================= = ``bullhorn_interface``使用``Interface`` 对象
与 Bullhorn 的 API 交互。
- ``LiveInterface`` 自己保存令牌。这些家伙应该总是被创建为“独立的”,因为“LiveInterface”对象只能为自己刷新过期的令牌。
- ``StoredInterface`` 将令牌保留在自身上,并在允许刷新之前检查数据库中的令牌。这允许您在多个接口之间使用相同的令牌,以防您需要同时运行多个接口。\* Bullhorn 似乎不介意您是否同时运行多个 API 登录,因此“StoredInterface”没有太多实用程序。但是,在您频繁创建新的“接口”对象的情况下,使用“独立”存储接口将使您不必等待不必要的“登录()”调用。
使用 LiveInterface
=====================
生成登录令牌
------------
.. code:: python
from bullhorn_interface import api
interface = api.LiveInterface(username=api.BULLHORN_USERNAME, password =api.BULLHORN_PASSWORD)
interface.login()
.. parsed-literal::
New Login Token
Generate API Token
--------------------
一旦你被授予登录权限令牌,您可以获得其余 API 的令牌和 url。
.. code:: python
interface.get_api_token()
.. parsed-literal::
New Access Token
Make API Calls
--------------------
.. code:: python
import熊猫
# 相当于 query="lastName:Jorissen AND firstName:John-Paul"
df = pandas.DataFrame(interface.api_search(entity='Candidate', lastName="Jorissen", firstName="John-Paul")['data' ])
# df = pandas.DataFrame(interface.api_search(entity='Candidate', query="lastName:Jorissen AND firstName:John-Paul")['data'])
df[['lastName', 'firstName'] ].head(2)
.. parsed-literal::
新登录令牌
新访问令牌
刷新 API 令牌
.. raw:: html
<div>
<style>
.dataframe thead tr:only-child th {
text-align: right;
}
。
dataframe thead th { text-align: left;
}
.dataframe tbody tr th {
垂直对齐:顶部;
}
</style>
<table border="1" class="dataframe">
<thead>
<tr style="text-align: right;">
<th></th>
<th>lastName</th>
< th>firstName</th>
</tr>
</thead>
<tbody>
<tr>
<th>0</th>
<td>Jorissen</td>
<td>John-Paul</td>
</tr >
<tr>
<th>1</th>
<td>
</div>
如果你能像上面那样按名字找到候选人,那么一切都设置
正确。
使用 StoredInterface
=====================
如果您出于`某种原因 <#storedinterface_reasons>`__ 需要(或想要)将
令牌存储在数据库中,您可以使用存储的接口。
.. code:: python
interface = api.StoredInterface(username=api.BULLHORN_USERNAME, password=api.BULLHORN_PASSWORD)
您与所有内容的交互方式与“LiveInterface”
设置相同。
.. code:: python
interface.login()
interface.get_api_token()
# 永远没有理由手动调用 refresh_token(); api_call() 将为您处理过期的令牌。
interface.refresh_token()
df = pandas.DataFrame(interface.api_search(entity='Candidate', lastName="Jorissen", firstName="John-Paul")['data'])
.. parsed-literal::
New Login令牌
新访问令牌
.. code:: python
df[['lastName', 'firstName']].head(2)
.. raw:: html
<div>
<style>
.dataframe thead tr:only-child th {
text -对齐:正确;
}
.dataframe thead th {
文本对齐:左;
}
.dataframe tbody tr th {
垂直对齐:顶部;
}
</style>
<
但是,这里有一个区别。您可以使您的“StoredInterface”对象独立。这意味着他们不会
自行登录或刷新令牌;相反,他们将依靠
领先的“StoredInterface”来保持令牌新鲜。对于演示
,在单独的 python 命令提示符下运行 1 和 2。
.. code:: python
from bullhorn_interface import api
first, last = "John-Paul", "Jorissen"
qs = f"firstName:{first} AND lastName:{last}"
lead_interface = api.StoredInterface(username=api.BULLHORN_USERNAME , password=api.BULLHORN_PASSWORD)
dependent_interface = api.StoredInterface(username=api.BULLHORN_USERNAME, password=api.BULLHORN_PASSWORD,
Independent=False)
lead_interface.login()
lead_interface.get_api_token()
# 使用lead_interface 获取的令牌
dependent_interface.api_call(query=qs)
# 强制依赖接口认为其人的令牌已过期
dependent_interface.login_token['expiry'] = 0
# 接口现在将检查自己并发现它是令牌已过期。在第一次失败后,它会
# 检查数据库,看看是否有独立接口放入了一个未过期的令牌。
dependent_interface.api_call(query=qs)['data'][0]
.. parsed-literal::
新登录令牌
新访问令牌
令牌已过期。尝试 1/10 失败。
.. parsed-literal::
{'_score': 1.0,
'comments': '',
'firstName': 'John-Paul',
'id': 425082,
'lastName': 'Jorissen',
'middleName': None,
'notes': {'data': [], 'total': 0}}
避免明文密码
===============================
如果您对将 Bullhorn 登录凭据
以明文形式存储在文件系统的某个位置感到有点不安有一个解决方法。
.. code:: python
import os
os.environ['INTERFACE_CONF_FILE'] = '/home/jjorissen/bullhorn_secrets.conf'
from Bullhorn_interface import api
# 不要在配置文件中给接口你的密码(将该字段留空)
接口 = api。
# 运行 login 并获取将为您生成登录代码的 url。您必须自己运行它;访问
# 本教程中的 URL 将不适合您。
interface.login()
::
未提供凭据。提供用户名/密码组合或按照以下步骤操作:
将此 URL 粘贴到浏览器 https://auth.bullhornstaffing.com/oauth/authorize?client_id=YOUCLIENTID&response_type=code
重定向 URL 将如下所示:http://www.bullhorn .com/?code=YOUR%CODE%WILL%BE%RIGHT%HERE&client_id=YOURCLIENTID。
.. code:: python
# 您只能使用此代码登录一次。
interface.login(code="YOUR%CODE%WILL%BE%RIGHT%HERE")
.. parsed-literal::
New Login Token
您还可以避免以
明文形式存储任何其他敏感信息,方法是从配置文件中省略它们(将密钥
留空)并手动将其添加到“接口”和
“api.tokenbox”,如下所示:
.. 代码:: python
from tokenbox import TokenBox
api.tokenbox = TokenBox('username', 'password', 'db_name', api.metadata, db_host='localhost',
use_sqlite=True, **api.table_definitions)
interface.client_id = " I%am%your%client%ID"
interface.client_secret = "I%am%your%client%secret"
interface.login()
API 指南
==============
现在使用您的接口您可以按顺序进行 API 调用。这都会
使用 ``interface.api_call`` 和许多其他辅助方法来完成。
如果您
还没有熟悉实体以及它们如何
相互关联,则需要查看 Bullhorn API 参考资料。
- `Bullhorn API 参考 <http://bullhorn.github.io/rest-api-docs/>`__
- `Bullhorn 实体
指南 <http://bullhorn.github.io/rest-api-docs/entityref.html >`__
- `bullhorn_interface API 文档 <https://jjorissen52.github.io/bullhorn_interface/source/bullhorn_interface.html#module-bullhorn_interface.api>`__
按名字和姓氏获取候选人 ID(和评论)
.. 代码:: python
first_name, last_name = "John-Paul", "Jorissen"
def get_candidate_id(first_name, last_name):
return interface.api_call(command="search", entity="Candidate", select_fields=["id", "comments"],
query=f"firstName:{first_name} AND lastName:{ last_name}")
候选人 = get_candidate_id(first_name, last_name)['data']
print(list(filter(lambda x: x['id'] == 425084, Candidate)))
.. parsed-literal::
[{' id': 425084, 'comments': 'I am the old comment', '_score': 1.0}]
更新候选人的评论
.. code:: python Candidate_id
= 425084
comments = '我是新评论'
body = {"评论”:评论}
interface.api_call(command="entity", entity="Candidate", entity_id=candidate_id, body=body, method="UPDATE")
.. parsed-literal::
{'changeType': 'UPDATE',
'changedEntityId': 425084,
'changedEntityType': 'Candidate',
'data': {'comments': '我是新评论'}}
.. code:: python
print(list(filter(lambda x: x['id'] = = 425084, get_candidate_id(first_name, last_name)['data'])))
.. parsed-literal::
[{'id': 425084, 'comments': 'I am the new comment', '_score': 1.0} ]
问题
=========
如有问题和改进建议,请随时与我联系。
非常感谢您的贡献。
`jjorissen52@gmail.com <mailto:jjorissen52@gmail.com>`__
项目详情
下载文件
下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。
源分布
Bullhorn_interface-2.0.14.dev0.tar.gz
(21.7 kB
查看哈希)
关
Bullhorn_interface -2.0.14.dev0.tar.gz 的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | e0d5d820ed3005727cc050d3305623c305ede8e98074d1a4da5b011cf753be3c |
|
| MD5 | eb27df5cec4e305eebb6c1b73bda4d5c |
|
| 布莱克2-256 | 0bf6cdd9c67469f1075386806bbb838da6019079a5a61a271911b503cdf9aa6f |