API поиска работы с Google Cloud

В этой лабораторной работе вы узнаете, как улучшить поиск вакансий и привлечение талантов для вашей организации с помощью Cloud Talent Solution API (CTS). Используя CTS, вы можете расширить возможности машинного обучения при поиске работы!

Что вы узнаете

  • Включите CTS в своем проекте Google Cloud
  • Создание объектов «Компания» и рабочих мест в этих компаниях

Что вам понадобится

  • Проект Google Cloud с уже настроенным платежным аккаунтом (если у вас его еще нет, создайте файл .
  • Около часа

Как вы будете использовать этот учебник?

Только прочитайте это Прочтите его и выполните упражнения

Как бы вы оценили свой предыдущий опыт работы с Google Cloud Platform?

Новичок Средний Эксперт

Это руководство предназначено для полной работы на Google Cloud Platform. Никаких загрузок на вашу рабочую станцию ​​не требуется.

Включить API Cloud Talent Solutions

Откройте свое приложение в облачной консоли и щелкните меню-гамбургер в левом верхнем углу. Перейдите в меню Talent Solution -> Обзор .

Поскольку это новый проект, вы будете перенаправлены на новый экран с просьбой включить API. Нажмите «Включить» и подождите несколько минут, пока API не будет включен для этого проекта.

Включить регистрацию данных

Теперь вернитесь к предыдущей странице обзора. Появится новое диалоговое окно с просьбой включить регистрацию данных (если это не так, вернитесь на предыдущую страницу диалога). Это на самом деле просто убедиться, что вы знаете, что API поиска работы основан на модели машинного обучения, которая нуждается в данных. В рамках интеграции вы фактически сможете отправлять события от пользователей, которые ищут возможность дальнейшего обучения этих моделей. Когда это реализовано с помощью кода, вы можете указать, какая информация будет отправлена.

Мы углубимся в то, что это за события и как их отправлять позже, но предварительно обученные модели будут работать нормально. Включите ведение журнала данных, затем нажмите «Подключение к служебной учетной записи» в левой части этого диалогового окна.

Настройка служебной учетной записи

При отправке запросов API вам нужно будет делать их от имени фактической аутентифицированной учетной записи. Рекомендации Google Cloud Platform рекомендуют для этого настроить учетную запись службы. Думайте об учетных записях служб как о простом способе настроить пользователей, прошедших проверку подлинности, с ограниченными разрешениями. Это поможет вам создать независимую и безопасную систему.

Например, нам потребуется учетная запись службы для использования API поиска работы. Давайте создадим его и предоставим ему права на чтение/запись с помощью «Редактора заданий» в разделе «Решение Cloud Talent» на левой панели навигации. Также можно настроить учетную запись службы только с «Просмотрщиком заданий», чтобы он имел доступ только для чтения.

На следующем шаге вас спросят, хотите ли вы предоставить пользователям доступ к этой учетной записи службы. Вы можете пропустить этот шаг, но обязательно нажмите «Создать ключ» внизу. Выберите «JSON» в качестве типа ключа, а затем «Создать». Новый файл учетных данных JSON загружается автоматически. Сохраните этот файл на своем сервере, код, который вы напишете в следующем разделе, будет использовать его для аутентификации.

Установить переменные среды

Для удобства будем использовать оболочку Google Cloud. Если вы хотите сделать это из своей собственной среды разработки, отлично! Убедитесь, что вы установили Google Cloud SDK и клиентские библиотеки на выбранном вами языке (эта лаборатория кода будет использовать Python). В облачной оболочке уже установлены облачные клиентские библиотеки. Удобно, правда?

Чтобы запустить код с использованием библиотек, вам необходимо убедиться, что установлены две переменные среды: одна для указания вашего идентификатора проекта, а другая — для указания файла ключа вашей учетной записи службы. Давайте установим те.

В своем проекте щелкните значок «>_» в правом верхнем углу веб-консоли, чтобы открыть облачную оболочку. Добавьте следующие переменные среды, чтобы указать идентификатор вашего проекта и указать путь к файлу ключа json:

export GOOGLE_CLOUD_PROJECT="your-project-id"
export GOOGLE_APPLICATION_CREDENTIALS="/path/to/key.json"

Чтобы убедиться, что переменные установлены, используйте `echo`.

echo $GOOGLE_CLOUD_PROJECT
echo $GOOGLE_APPLICATION_CREDENTIALS

Откройте редактор кода в Cloud Shell.

В консоли Google Cloud откройте Cloud Shell с помощью значка облачной оболочки в правом верхнем углу.

В правом верхнем углу облачной оболочки будет ряд значков. Нажмите File -> Launch Code Editor , как показано здесь:

Создать компанию

Используйте File -> New File , чтобы создать новый исходный файл, и заполните его содержимым ниже. Назовите его create_company.py .

c reate_company.py

import os

from googleapiclient.discovery import build
from googleapiclient.errors import Error

# Build the service object, passing in the api name and api version
client_service = build('jobs', 'v3')
project_id = 'projects/' + os.environ['GOOGLE_CLOUD_PROJECT']


# Specifying details for the company that's going to be created.
# These are the only two required fields.
# Optional fields are documented at
# http://googleapis.github.io/google-api-python-client/docs/dyn/jobs_v3.projects.companies.html#create
new_company = {
    'display_name': "FooCorp",
    'external_id': "foo_llc"
}
request = {'company': new_company}

try:

    # This is the API call that actually creates the new company.
    result = client_service.projects().companies().create(
       parent=project_id, body=request).execute()

    # You can easily just print the result as a string if you want
    print('Company created: %s' % result)

    # Or you can individual fields.  The fields returned depend on what's specified
    # in the "new_company" object.  To see possible fields of the
    # response, see the "create" documentation at:
    # http://googleapis.github.io/google-api-python-client/docs/dyn/jobs_v3.projects.companies.html#create
    print('%s: %s, %s' % (result.get('externalId'),
                       result.get('displayName'),
                       result.get('name')))

except Error as e:
    print('Got exception while creating company')
    raise e

Что делает этот код? Давайте исследовать! Здесь есть два соответствующих вызова клиентской библиотеки:

  • client_service = build('jobs', 'v3') создает объект службы с использованием клиентской библиотеки Python API Google .
  • client_service.projects().companies().create(parent=project_id, body=request).execute() выполняет вызов API для создания компании. Ответом на этот вызов является объект, содержащий информацию о компании. Содержимое как объекта запроса, так и объекта ответа изложено в документации по методу create .

Запустите файл из командной строки (которая находится прямо под окном редактора кода), и вы увидите что-то похожее на следующий вывод.

> python create_company.py
Company created: {u'externalId': u'foo_llc', u'displayName': u'FooCorp', u'name': u'projects/[PROJECT_ID]/companies/1cd6ada9-e678-49cf-80da-aaaf8876feda'}
Foo_llc, FooCorp, projects/[PROJECT_ID]/companies/1cd6ada9-e678-49cf-80da-aaaf8876feda 

Имя — это уникальный идентификатор, сгенерированный API поиска работы, а external_id — это идентификатор, который вы предоставляете из своей собственной системы вакансий. Каждый раз, когда вы обращаетесь к объекту через API, вам нужно использовать имя .

Обновить компанию

Если у вас уже есть компания в системе и вы хотите добавить или изменить некоторые поля, процесс разбивается на следующие этапы:

  • Создайте объект с текущими значениями полей для компании
  • Обновите этот объект новыми или обновленными полями, используя поле «название компании» в качестве ключа, чтобы API знал, какую компанию нужно обновить.
  • Отправьте новый объект с помощью метода «заплатки» .

Обратите внимание, что этот процесс требует, чтобы у вас были все существующие значения, поскольку он перезаписывает все значения компании сразу, независимо от того, какие из них вы фактически обновили. Это означает, что перед обновлением информации о компании нам необходимо получить ее.

Создайте новый файл update_company.py в своей рабочей области. Запустите, если выключено, добавив метод get_company , показанный ниже.

update_company.py

import os

from googleapiclient.discovery import build
from googleapiclient.errors import Error

# Build the service object, passing in the api name and api version
client_service = build('jobs', 'v3')
project_id = 'projects/' + os.environ['GOOGLE_CLOUD_PROJECT']
company_name = 'Your company name goes here'


def get_company(company_name):
   try:
       company_existed = client_service.projects().companies().get(
           name=company_name).execute()
       print('Company existed: %s' % company_existed)
       return company_existed
   except Error as e:
       print('Got exception while getting company')
       raise e


newCompany = get_company()

На этом этапе вы заметите одну вещь: вызов API очень похож на создание компании. Клиентская библиотека создается в соответствии с интерфейсом REST, поэтому все операции CRUD, которые вы выполняете с компаниями, будут иметь вид client_service.projects().companies().theMethod(argName=argValue).execute().

Теперь, когда у нас есть набор существующих значений, создайте объект «заплатки» с именами полей, которые вы хотите обновить, и их новыми значениями, и используйте его для обновления объекта вашей компании новыми значениями. Вот что интересного в том, чтобы делать это на Python: клиентская библиотека представляет компанию как объект словаря, что означает, что метод уже встроен . Нет необходимости в причудливых петлях! Создайте объект словаря прямо под кодом, который вы уже написали.

update_company.py

...  
    patch = {
       'displayName': "The New Bar",
       'websiteUri': "http://www.example.com"
    }
    newCompany.update(patch)
    print("Debug: New company info %s " % newCompany)
... 

Теперь осталось только создать объект запроса ( подробности о том, что туда может входить, см. в документации по патчу ) и выполнить вызов API.

... 
    request = {'company': newCompany}
 
    company_updated = client_service.projects().companies().patch(
        name=company_name, body=request).execute()
    print('Company updated: %s' % company_updated)
... 

В качестве альтернативы, если вы хотите предоставить только те поля, которые вы действительно хотите изменить, вы можете включить поля вместе с маской обновления. Это полезно в ситуациях, когда у вас еще нет обновленной настройки объекта компании или есть только одно поле, которое вы хотите обновить, и вы не хотите отправлять туда и обратно ненужные большие объекты. Но как использовать маску обновления, спросите вы? Где код, демонстрирующий этот захватывающий и новый способ обновления информации о компании?

Ты читаешь наши мысли, читатель! В приведенном ниже фрагменте выполняется обновление информации о компании с использованием маски обновления вместо полной замены записи.

update_company.py

... 
   # New set of fields, not the complete company object
   companyFields = {'displayName': 'The New Bar',
                    'websiteUri': 'http://shouldNotUpdate.com',
                    'externalId': 'bar_llc'}

   # Note that the mask only contains the display name, not the URL.
   # This is entirely for demonstration purposes.  This mask will tell the API
   # to update the display name, but NOT the website uri.
   mask = 'displayName'
   request = {'company': companyFields,
              'update_mask': mask}
   company_updated = client_service.projects().companies().patch(
       name=company_name,
       body=request).execute()
   print('Company updated!: %s' % company_updated)
... 

Обратите внимание, что вызов API тот же. Разница в том, что объект запроса теперь имеет два поля ( company и update_mask ) вместо одного ( company). Маска обновления представляет собой список полей, разделенных запятыми. Если бы мы хотели включить поле «websiteUri» в маску, то значение маски вместо этого выглядело бы так:

   mask = 'displayName,websiteUri'

Какой бы маршрут вы ни выбрали, запустите его из облачной оболочки, и (при условии, что вы оставили эти операторы печати) вы должны увидеть выходные данные, указывающие как старые, так и новые значения для вашей компании.

$ python update_company.py
Company existed: {u'externalId': u'bar_llc', u'displayName': u'The New Bar', u'name': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'websiteUri': u'http://www.example.com'}
Company {u'externalId': u'bar_llc', u'displayName': u'The New Bar', u'name': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'websiteUri': u'http://www.example.com'}
New company info {u'externalId': u'bar_llc', u'name': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'displayName': 'The New Bar', u'websiteUri': 'http://www.example.com'}
Company updated: {u'externalId': u'bar_llc', u'displayName': u'The New Bar', u'name': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'websiteUri': u'http://www.example.com'}
$

Не было бы особого смысла в решении по поиску работы без работы для поиска! В прошлом разделе мы говорили о создании компаний. Теперь поговорим о том, как создавать рабочие места и лучшие практики работы с ними.

Обратите внимание, что вакансии будут прикреплены к компаниям. Если у вас еще нет компаний, созданных с помощью API (или если вы успешно выполнили вызов «удалить» в конце раздела и удалили свою единственную компанию), вернитесь и снова создайте компанию. Тогда вы будете готовы создавать рабочие места!

Создать задание

Начнем с создания работы!

Для создания задания вам потребуются следующие данные:

  • Название компании. Не удобочитаемая строка «My fancy company LLC», а гораздо более длинная строка «projects/[PROJECT_ID]/companies/COMPANY_ID».
  • Идентификатор заявки на работу. Это похоже на external_id для компании — он представляет ваш собственный уникальный идентификатор для работы, чтобы упростить синхронизацию API Cloud Talent Solution с вашим текущим решением для работы, например Senior_llama_wrangler
  • Название должности, которое является отображаемым именем для работы, например, «Старший лама-угонщик».
  • Описание работы. Обратите внимание, что описание может содержать встроенный HTML, чтобы вы могли его правильно отформатировать. Содержание довольно понятно. "<p>Возглавит команду охотников за ламами.</p><p> Должен иметь лидерские качества и опыт работы с ламами."</p>
  • applicationInfo — дополнительная информация о том, как подать заявку. Может состоять из 1+ URI, 1+ адресов электронной почты или строки в формате HTML с дальнейшими инструкциями. Вы даже можете включить все 3! Но вам нужно включить хотя бы 1.

Итак, если бы мы создали задание для нашей ранее созданной корпорации FooCorp, поля могли бы выглядеть так:

имя

projects/[PROJECT_ID]/companies/0123-Big-Hex-String-AABB0

requisition_id

Senior_llama_wrangler

заглавие

Старшая лама Вранглер

описание

На постоянную работу требуется лама с опытом работы. Требуются лидерские качества, так как вы возьмете команду ухаживающих за ламами и будете обучать их до полномасштабных спорщиков.<p/>Должен хорошо работать с животными и иногда быть готовым бегать очень, очень, очень быстро. Как ОЧЕНЬ быстро. Это какие-то быстрые ламы.

application_info

Урис: http://www.example.com/llama_wrangler_application/

Электронная почта: llama-apply@example.com

Если у вас больше нет названия компании, вы можете использовать код «get_company», который вы использовали на шаге 3, чтобы получить его.

Код для создания работы будет очень похож на код для создания компании. Первые несколько строк должны быть вам хорошо знакомы (импортировать бла-бла-бла, создавать экземпляр объекта службы клиента). Затем вы создаете объект dict (просто вложенный набор пар ключ/значение), представляющий ваш запрос, и отправляете его вместе с вызовом API «создать».

Вставьте следующий фрагмент в файл с именем create_job.py. На самом деле вы можете называть его как хотите, но в этом руководстве предполагается, что это имя файла.

create_job.py

import os

from googleapiclient.discovery import build
from googleapiclient.errors import Error

client_service = build('jobs', 'v3')
project_id = 'projects/' + os.environ['GOOGLE_CLOUD_PROJECT']

new_job = {
   'company_name': 'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e',
   'title': 'Senior Llama Wrangler',
   'description':
   """Experienced Llama Wrangler required for full-time position.
   Leadership ability required, as you will be taking a team of llama
   caregivers and training them up to full-scale wranglers.
   <p/>Must work well with animals and occasionally be prepared to run
   really, like really really fast.  Like REALLY fast.
   These are quick llamas.""",
   'requisition_id': 'senior_llama_wrangler',
   'application_info': {
       'uris': ['http://www.example.com/llama-wrangler-application'],
       'emails': ['llama-apply@example.com']
   }
}

try:
   # Nest that Job object in a "job" object.  Now it's an API request!
   request = {'job': new_job}

   # The actual API call happens here.
   result = client_service.projects().jobs().create(
       parent=project_id, body=request).execute()
   print('Job created: %s' % result)

except Error as e:
   print('Got exception while creating job')
   raise e

Запустите это из облачной оболочки, и вы должны получить большой блок JSON с только что созданным заданием.

$ python create_job.py
Job created: {u'languageCode': u'en', u'description': u'Experienced Llama Wrangler required for full-time position. Leadership ability required, as you will be taking a team of llama caregivers and training them up to full-scale wranglers.Must work well with animals and occasionally be prepared to run really, like really really fast. Like REALLY fast. These are some quick llamas.', u'applicationInfo': {u'emails': [u'llama-apply@example.com'], u'uris': [u'http://www.example.com/llama-wrangler-application']}, u'companyName': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'requisitionId': u'senior_llama_wrangler', u'title': u'Senior Llama Wrangler', u'postingExpireTime': u'2019-09-11T16:04:48.546Z', u'visibility': u'ACCOUNT_ONLY', u'postingCreateTime': u'2019-08-12T16:04:48.546Z', u'companyDisplayName': u'Masked Panda Inc', u'postingUpdateTime': u'2019-08-12T16:04:48.611Z', u'postingPublishTime': u'2019-08-12T16:04:48.611Z', u'name': u'projects/[PROJECT_ID]/jobs/12345}

Если вы получите что-то подобное выше, вы успешно создали задание!

Вакансии должны быть уникальными

В качестве эксперимента снова запустите этот последний скрипт и посмотрим, что произойдет.

$ python create_job.py
Got exception while creating job
Traceback (most recent call last):
  File "create_job.py", line 37, in <module>
    raise e
googleapiclient.errors.HttpError: <HttpError 409 when requesting https://jobs.googleapis.com/v3/projects/[PROJECT_ID]/jobs?alt=json returned "Job projects/[PROJECT_ID]/jobs/103672929591403206 already exists. Request ID for tracking: ec94f4cb-70f1-48cf-bae6-b4dad056ac3f:APAb7ITRlgTTpVMONSSBCG4LnFzqR765Eg==. Related Job requisition ID: senior_llama_wrangler.">

Что здесь случилось? Вы пытались ввести дубликат списка вакансий. Неистекшие задания должны быть уникальными в системе.

Уникальность определяется следующими полями:

  • Название компании — требуется при создании задания, не подлежит обновлению.
  • Идентификатор заявки — требуется при создании задания, не подлежит обновлению.
  • Код языка — необязательно, по умолчанию en_us, обновляемый

Если какое-либо задание, которое вы пытаетесь создать или обновить, имеет все 3 из этих полей вместе с существующим заданием с неистекшим сроком действия, оно считается дубликатом, а создание/обновление завершается ошибкой с тем сообщением об ошибке, которое вы видите выше.

Ура!

Поздравляем, теперь у вас есть и компания, и список вакансий для этой компании в вашей системе! И все это вы сделали менее чем за час! Вы хоть представляете, сколько времени потребовалось лучшим сайтам со списком вакансий в Интернете, чтобы добраться до этой точки, читатель? Намного больше часа. Нравится намного больше. Недели. Месяцы. Заседания правления. Вероятно, речь шла о электронных таблицах и заявлениях о миссии. Я уверен, что в тех офисах это стало довольно реальным. Знаешь, что тебе понадобилось? Чуть меньше часа. Иди ты!

Однако есть еще кое-что! Давайте продолжим.

Обновление задания

Как и в случае с компаниями, мы можем получить задание, чтобы увидеть его детали, и исправить задание, чтобы обновить его.

Вот как можно получить сведения о работе. Если приведенный ниже фрагмент кода кажется вам знакомым, это потому, что мы взяли метод «get_company» из предыдущего раздела, заменили «company» на «job» и добавили его в переменную job_name. Давайте сначала взглянем на получение информации о работе.

update_job.py

import os

from googleapiclient.discovery import build
from googleapiclient.errors import Error

client_service = build('jobs', 'v3')
project_id = 'projects/' + os.environ['GOOGLE_CLOUD_PROJECT']

# The interesting bit
def get_job():
   try:
       job_existed = client_service.projects().jobs().get(
           name=job_name).execute()
       print('Job existed: %s' % job_existed)
       return job_existed
   except Error as e:
       print('Got exception while getting job')
       raise e

job_name = "projects/[PROJECT_ID]/jobs/12345"
job_info = get_job(job_name)

Чтобы фактически обновить задание, у вас есть те же варианты, что и раньше, когда вы обновляли компанию: отправить полный объект с обновленными значениями для замены старого или отправить меньший патч с маской поля, разделенной запятыми.

update_job.py (обновление с полной заменой объекта)

   # First the full-replacement method.  Update the complete job object with new field values.
   job_patch = {
       'title': "Rogue Llama Acquisition Engineer"
   }

   job_info.update(job_patch)
   request = {"job": job_info}

   job_updated = client_service.projects().jobs().patch(
       name=job_name, body=request).execute()
   print ("Updated job info : %s" % job_updated)

update_job.py (только с новыми значениями полей и маской обновления)

   # Alternatively, if you know which fields have been updated, you can submit a patch with just the changes
   # and an update mask. This time let's just re-use the same job patch, and create an update mask.
   job_patch = {
       'title': "Rogue Llama Acquisition Engineer"
   }

   update_mask = "title"
   request = {"job": job_patch,
              "updateMask": update_mask
              }

   job_updated = client_service.projects().jobs().patch(
       name=job_name, body=request).execute()

   print ("Updated job info : %s" % job_updated)   

Два вышеприведенных фрагмента делают одно и то же: они обновляют конкретный список вакансий, добавляя название должности «Лама-мошенник, инженер по закупкам». Также обратите внимание, что строка, которая делает вызов API, одна и та же: единственная разница заключается в объекте запроса. У одного есть полный объект задания, который заменит объект с этим именем задания. Другой — просто набор полей для обновления.

Какой бы из них вы ни выбрали для запуска, вывод будет одинаковым. Дать ему шанс!

$ python update_job
Updated job info : {u'languageCode': u'en', u'description': u'Experienced Llama Wrangler required for full-time position. Leadership ability required, as you will be taking a team of llama caregivers and training them up to full-scale wranglers.Must work well with animals and occasionally be prepared to run really, like really really fast. Like REALLY fast. These are some quick llamas.', u'applicationInfo': {u'emails': [u'llama-apply@example.com'], u'uris': [u'http://www.example.com/llama-wrangler-application']}, u'companyName': u'projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e', u'derivedInfo': {u'jobCategories': [u'SCIENCE_AND_ENGINEERING']}, u'requisitionId': u'senior_llama_wrangler', u'title': u'Rogue Llama Acquisition Engineer', u'postingExpireTime': u'2019-09-11T16:04:48.546Z', u'visibility': u'ACCOUNT_ONLY', u'postingCreateTime': u'2019-08-12T16:04:48.546Z', u'companyDisplayName': u'Masked Panda Inc', u'postingUpdateTime': u'2019-08-12T19:28:41.850Z', u'postingPublishTime': u'2019-08-12T16:04:48.611Z', u'name': u'projects/[PROJECT_ID]/jobs/12345}

Ура! Вы выполнили шаг 4!

Ну, а теперь посмотри на себя. Вырубить все это, как какого-то монстра продуктивности. Пока что вы можете создавать компании, создавать рабочие места и обновлять их по своему усмотрению! Но вы, возможно, заметили что-то странным образом отсутствующее в этих уроках. Это последняя операция, которая помещает D в CRUD . Что, если мы хотим их УДАЛИТЬ? Не волнуйся, читатель! В следующем разделе это рассматривается подробно.

Давайте начнем с компаний по причинам, которые станут понятны через 5 минут.

Удалить компанию

Удалить компанию довольно просто. Используя те же операторы импорта, которые вы использовали при создании или обновлении компании, просто вызовите метод удаления , передав только название компании (тело запроса не требуется).

   # Yup, that's the whole thing.
   company_to_delete = "Insert company name here"
   result = client_service.projects().companies().delete(
       name=company_to_delete).execute()

Чтобы помочь с очисткой, пока вы изучаете этот API, вот простой скрипт Python, который принимает название компании в качестве параметра командной строки и, как вы уже догадались, удаляет компанию.

delete_company.py

from googleapiclient.discovery import build
from googleapiclient.errors import Error

client_service = build('jobs', 'v3')

# Name of the company to delete
company_to_delete = 'projects/[PROJECT_ID]/companies/123-abc-123'

try:
   # Yup, that's the whole thing.
   result_company = client_service.projects().companies().delete(
       name=company_to_delete).execute()

   print('Result of deleting company: %s' % result_company)

except Error as e:
   print('Got exception while deleting company')
   raise e

Вызовите его, передав название компании в качестве единственного аргумента командной строки.

$ python delete_company.py projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e
Got exception while deleting company
Traceback (most recent call last):
  File "delete_company.py", line 29, in <module>
    raise e
googleapiclient.errors.HttpError: <HttpError 400 when requesting https://jobs.googleapis.com/v3/projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e?alt=json returned "Company with name projects/[PROJECT_ID]/companies/083495ad-acba-477f-a084-8be84f31692e still has open jobs. Request ID for tracking: 6b9fe1a0-50ae-48b0-b33d-1622d547c363:APAb7ISnO4taWI4poffoX/EqzRCPSwpEbQ==">

И вот оно! Вы преуспели - подождите секунду. Это что? Ошибка? "Все еще есть открытые вакансии"?

Да! Теперь вы знаете первое правило удаления компаний: оно не будет работать, пока в этой компании есть открытые вакансии. Как мы справляемся с этим? Ну, мы должны просмотреть и удалить все открытые вакансии, связанные с этой компанией.

Теперь совершенно разумно вы думаете: «Я удалю только что созданную работу, а ТОГДА удалю компанию, в которой она была!» В этом есть смысл, читатель! Давайте сделаем это.

delete_company.py

from googleapiclient.discovery import build
from googleapiclient.errors import Error

client_service = build('jobs', 'v3')

# Replace with your actual company and job names.
company_to_delete = 'projects/[PROJECT_ID]/companies/123-abc-123'
job_to_delete = 'projects/[PROJECT_ID]/jobs/12345'

try:
   result_job = client_service.projects().jobs().delete(
       name=job_to_delete).execute()

   result_company = client_service.projects().companies().delete(
       name=company_to_delete).execute()

   print('Result of deleting job: %s' % result_job)
   print('Result of deleting company: %s' % result_company)

except Error as e:
   print('Got exception while deleting company')
   raise e

Теперь попробуйте запустить его снова. Значения, возвращаемые этими вызовами API, должны быть текущими записями «компания» и «работа», то есть должны быть пустыми.

python delete_company.py
Result of deleting job: {}
Result of deleting company: {}

Ах. Отличная работа.

Последняя вещь. Приведенное выше решение отлично сработало, потому что вы, читатель,

  • Уже имелось название вакансии для всех существующих вакансий для этой компании.
  • Не создал для этой компании слишком много рабочих мест, чтобы их можно было удалить вручную.

Сделаем вид, что это не так

Существует вызов API, jobs.list() , который возвращает задания, соответствующие указанному идентификатору проекта и родительской компании. Вот как вы бы назвали метод:

jobs_response = client_service.projects().jobs().list(
    parent=project_id,
    filter='companyName="' + company_name + '"').execute()
if jobs_response.get('jobs') is not None:
    for job in jobs_response.get('jobs'):
        print('- %s: %s' % (
              job.get('title'),
              job.get('name')))

Теперь вы можете создавать и управлять списками компаний и вакансий с помощью API поиска вакансий Google Cloud Talent Solutions!

Что мы рассмотрели

  • Создание и управление компаниями
  • Создание и управление списками вакансий для этих компаний
  • Настройка сервисных аккаунтов для взаимодействия с API от вашего имени

Учить больше