Security News
Research
Data Theft Repackaged: A Case Study in Malicious Wrapper Packages on npm
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
|License MIT| | |PyPi Package| | |PyPi Versions|
|Build Status| | |Test Coverage| | |Code Climate|
This library allows you to interact with HelpScout using Python.
Read The API Documentation <https://laslabs.github.io/python-helpscout>
_.. contents:: Table of Contents
Installation is easiest using Pip and PyPi::
pip install helpscout
If you would like to contribute, or prefer Git::
git clone https://github.com/LasLabs/python-helpscout.git cd python-helpscout pip install -r requirements.txt pip install .
The HelpScout object <https://laslabs.github.io/python-helpscout/helpscout.html#helpscout.HelpScout>
_
is the primary point of interaction with the HelpScout API.
Connecting to the HelpScout API will require an API Key, which is generated from
within your HelpScout account. In the below example, our key is API_KEY
.
.. code-block:: python
from helpscout import HelpScout hs = HelpScout('API_KEY')
The HelpScout API endpoints are exposed as variables on the instantiated HelpScout
object. The available endpoints are:
Conversations Endpoint <https://laslabs.github.io/python-helpscout/helpscout.apis.html#module-helpscout.apis.conversations>
_Customers Endpoint <https://laslabs.github.io/python-helpscout/helpscout.apis.html#module-helpscout.apis.customers>
_Mailboxes Endpoint <https://laslabs.github.io/python-helpscout/helpscout.apis.html#module-helpscout.apis.mailboxes>
_Tags Endpoint <https://laslabs.github.io/python-helpscout/helpscout.apis.html#module-helpscout.apis.tags>
_Teams Endpoint <https://laslabs.github.io/python-helpscout/helpscout.apis.html#module-helpscout.apis.teams>
_Users Endpoint <https://laslabs.github.io/python-helpscout/helpscout.apis.html#module-helpscout.apis.users>
_WebHook Endpoint <https://laslabs.github.io/python-helpscout/helpscout.apis.html#module-helpscout.apis.web_hook>
_They can also be viewed from the __apis__
property of HelpScout
::
hs.apis {'Conversations': <helpscout.auth_proxy.AuthProxy object at 0x10783ddd0>, 'Customers': <helpscout.auth_proxy.AuthProxy object at 0x10783dd90>, 'Mailboxes': <helpscout.auth_proxy.AuthProxy object at 0x10783ded0>, 'Users': <helpscout.auth_proxy.AuthProxy object at 0x10783df50>, 'Teams': <helpscout.auth_proxy.AuthProxy object at 0x10783df10>, }
API usage is as simple as calling the method with the required parameters and iterating the results:
.. code-block:: python
for customer in hs.Customers.list(first_name='Help', last_name='Scout'): print(customer) print(customer.serialize())
The output from the above would look something like the below when using the HelpScout demo data:
.. code-block:: python
<helpscout.models.customer.Customer object at 0x10783df10>
{'chats': [], 'social_profiles': [], 'first_name': u'Help', 'last_name': u'Scout', 'phones': [], 'created_at': '2017-09-16T18:38:37Z', 'modified_at': '2017-09-16T18:38:37Z', u'class': 'Customer', 'websites': [], 'id': 143161083, 'location': u'Boston, MA', 'full_name': u'Help Scout', 'gender': 'unknown', 'photo_type': 'gravatar', 'type': 'customer', 'emails': [], 'photo_url': u'https://secure.gravatar.com/avatar/7d599977ec288a9141317b352c04d497'}
In some instances, such as in the case of browsing for a record by its ID, a singleton is expected. In these instances, the singleton is directly used instead of iterated
.. code-block:: python
customer = hs.Customers.get(143161083) customer <helpscout.models.customer.Customer object at 0x101723e50> from pprint import pprint pprint(customer.serialize()) {u'class': 'Customer', 'address': {u'class': 'Address', 'city': u'Boston', 'country': u'US', 'created_at': '2017-09-16T18:38:37Z', 'id': 4996350, 'lines': [u'131 Tremont Street', u'3rd Floor'], 'postal_code': u'02111-1338', 'state': u'MA'}, 'chats': [], 'created_at': '2017-09-16T18:38:37Z', 'emails': [{u'class': 'Email', 'id': 189240662, 'location': 'work', 'value': u'help@helpscout.net'}], 'first_name': u'Help', 'full_name': u'Help Scout', 'gender': 'unknown', 'id': 143161083, 'last_name': u'Scout', 'location': u'Boston, MA', 'modified_at': '2017-09-16T18:38:37Z', 'phones': [{u'class': 'Phone', 'id': 189240668, 'location': 'work', 'value': u'855-435-7726'}], 'photo_type': 'gravatar', 'photo_url': u'https://secure.gravatar.com/avatar/7d599977ec288a9141317b352c04d497', 'social_profiles': [{u'class': 'SocialProfile', 'id': 189240667, 'type': 'twitter', 'value': u'http://twitter.com/helpscout'}, {u'class': 'SocialProfile', 'id': 189240663, 'type': 'twitter', 'value': u'https://twitter.com/helpscout'}, {u'class': 'SocialProfile', 'id': 189240664, 'type': 'twitter', 'value': u'https://twitter.com/HelpScoutDev'}], 'type': 'customer', 'websites': [{u'class': 'Website', 'id': 189240670, 'value': u'http://developer.helpscout.net'}, {u'class': 'Website', 'id': 189240665, 'value': u'http://status.helpscout.net/'}, {u'class': 'Website', 'id': 189240666, 'value': u'http://www.helpscout.com'}, {u'class': 'Website', 'id': 189240671, 'value': u'http://www.helpscout.net'}]}
Note that all of the API responses will be parsed, with proper objects being
created from the results. The objects are all defined in the helpscout.models package <https://laslabs.github.io/python-helpscout/helpscout.models.html>
_.
The .search()
method is implemented for the following endpoints:
Conversations Search <https://laslabs.github.io/python-helpscout/helpscout.apis.html#helpscout. apis.conversations.Conversations.search>
_Customers Search <https://laslabs.github.io/python-helpscout/helpscout.apis.html#helpscout. apis.customers.Customers.search>
_Search accepts either an instantiated Domain <https://laslabs.github.io/ python-helpscout/helpscout.domain.html#helpscout.domain.Domain>
, or an
iterator of queries <https://laslabs.github.io/python-helpscout/helpscout. domain.html#helpscout.domain.Domain.from_tuple>
:
.. code-block:: python
[('subject', 'Test1'), 'OR', ('subject', 'Test2')', ('subject', 'Test3')', ]
The above is equivalent to a HelpScout query string of::
(subject:'Test1' OR subject:'Test2' OR subject:'Test3')
Following is a usage example:
.. code-block:: python
res = hs.Conversations.search([('subject', 'Learning')]) for r in res: r.serialize() {'status': 'active', 'customer_email': u'help@helpscout.net', 'thread_count': 0, 'modified_at': '2017-09-16T18:38:37Z', 'number': 150, 'subject': u'Learning the basics', u'class': 'SearchConversation', 'has_attachments': False, 'mailbox_id': 122867, 'preview': u'Hey Dave, Above this message is what we call the Conversation Toolbar. From there you can take all sorts of actions on a Conversation. Hover your mouse over each of the icons to see what you can do....', 'id': 432907900, 'customer_name': u'Help Scout'}
Web Hooks <https://laslabs.github.io/python-helpscout/helpscout. web_hook.html#helpscout.web_hook.web_hook.HelpScoutWebHook>
_ can be received by
instantiating a HelpScoutWebHook
using
the secret key that was configured while setting up the hook in your
HelpScout account:
.. code-block:: python
from helpscout import HelpScoutWebHook
hook = HelpScoutWebHook('your secret key')
In order to actually receive the request, call the receive method <https://laslabs.github.io/python-helpscout/helpscout.web_hook.html #helpscout.web_hook.web_hook.HelpScoutWebHook.receive>
_ on the instantiated
HelpScoutWebHook
:
.. code-block:: python
signature = '2iFmnzC8SCNVF/iNiMnSe19yceU=\n' # (X-HelpScout-Signature
Header)
event_type = 'customer.created' # (X-HelpScout-Event
Header)
request_body = '{"firstName":"Jackie","lastName":"Chan",'
'"email":"jackie.chan@somewhere.com",'
'"gender":"male"}'
event = web_hook.receive( event_type, signature, request_body, )
The WebHookEvent
that is returned contains two properties:
event_type
(str): The type of event that is being representedrecord
(helpscout.BaseModel): The parsed data record for this requestGiven the above example:
.. code-block:: python
event.event_type 'customer.created' event.record <helpscout.models.customer.Customer object at 0x101723e50>
You create a web hook using the standard endpoint create:
.. code-block:: python
from helpscout.models import HelpScoutWebHook hook = HelpScoutWebHook( url='https://example.com/my/web/hook/' secret_key='SuperSecretRandomizedString' events=[ 'customer.created', ], ) hs.WebHook.create(hook)
The above example will create a hook for the customer.created
event using
the pre-authenticated HelpScout
object from above examples (hs
).
.. image:: https://laslabs.com/logo.png :alt: LasLabs Inc. :target: https://laslabs.com
This module is maintained by LasLabs Inc.
.. |Build Status| image:: https://img.shields.io/travis/LasLabs/python-helpscout/master.svg :target: https://travis-ci.org/LasLabs/python-helpscout .. |Test Coverage| image:: https://img.shields.io/codecov/c/github/LasLabs/python-helpscout/master.svg :target: https://codecov.io/gh/LasLabs/python-helpscout .. |Code Climate| image:: https://img.shields.io/codeclimate/github/LasLabs/python-helpscout.svg :target: https://codeclimate.com/github/LasLabs/python-helpscout .. |License MIT| image:: https://img.shields.io/github/license/laslabs/python-helpscout.svg :target: https://opensource.org/licenses/MIT :alt: License: MIT .. |PyPi Package| image:: https://img.shields.io/pypi/v/helpscout.svg :target: https://pypi.python.org/pypi/helpscout :alt: PyPi Package .. |PyPi Versions| image:: https://img.shields.io/pypi/pyversions/helpscout.svg :target: https://pypi.python.org/pypi/helpscout :alt: PyPi Versions
FAQs
This library allows you to interact with HelpScout using Python.
We found that helpscout demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
Research
The Socket Research Team breaks down a malicious wrapper package that uses obfuscation to harvest credentials and exfiltrate sensitive data.
Research
Security News
Attackers used a malicious npm package typosquatting a popular ESLint plugin to steal sensitive data, execute commands, and exploit developer systems.
Security News
The Ultralytics' PyPI Package was compromised four times in one weekend through GitHub Actions cache poisoning and failure to rotate previously compromised API tokens.