API การค้นหางานด้วย Google Cloud

ใน Codelab นี้ คุณจะได้เรียนรู้วิธีเพิ่มประสิทธิภาพการค้นหางานและการหาบุคลากรให้องค์กรโดยใช้ Cloud Talent Solution API (CTS) เมื่อใช้ CTS คุณจะเพิ่มศักยภาพของแมชชีนเลิร์นนิงไปยังประสบการณ์การค้นหางานได้

สิ่งที่จะได้เรียนรู้

  • เปิดใช้ CTS ในโปรเจ็กต์ Google Cloud
  • สร้าง "Company" บุคคลและงานในบริษัทเหล่านั้น

สิ่งที่ต้องมี

  • โครงการ Google Cloud ที่มีการเรียกเก็บเงินได้รับการตั้งค่าแล้ว (หากยังไม่มี ให้สร้าง
  • ประมาณ 1 ชั่วโมง

คุณจะใช้บทแนะนํานี้อย่างไร

อ่านให้จบเท่านั้น อ่านและตอบแบบฝึกหัด

คุณจะให้คะแนนประสบการณ์การใช้งาน Google Cloud Platform ที่ผ่านมาอย่างไร

มือใหม่ ระดับกลาง ผู้เชี่ยวชาญ

บทแนะนํานี้มีจุดประสงค์ให้ทํางานอย่างเต็มรูปแบบบน Google Cloud Platform ไม่จําเป็นต้องดาวน์โหลดไปยังเวิร์กสเตชัน

เปิดใช้ Cloud Talent Solutions API

เปิดแอปพลิเคชันใน Cloud Console แล้วคลิกเมนูแฮมเบอร์เกอร์ที่ด้านบนซ้าย เรียกดูเมนูในโซลูชันสําหรับครีเอเตอร์ -> ภาพรวม

เนื่องจากนี่เป็นโปรเจ็กต์ใหม่ ระบบจะเปลี่ยนเส้นทางคุณไปยังหน้าจอใหม่ที่ขอให้คุณเปิดใช้ API คลิกเปิดใช้และรอสักครู่เพื่อเปิด API สําหรับโปรเจ็กต์นี้

เปิดใช้การบันทึกข้อมูล

ทีนี้กลับไปที่หน้าภาพรวมอีกครั้ง กล่องโต้ตอบใหม่จะปรากฏขึ้นเพื่อขอให้คุณเปิดใช้การบันทึกข้อมูล (หากไม่เป็นเช่นนั้น ให้กลับไปที่หน้ากล่องโต้ตอบก่อนหน้านี้) เพียงแต่ต้องตรวจสอบว่า Job Search API ขับเคลื่อนโดยโมเดลแมชชีนเลิร์นนิงที่ต้องการข้อมูล โดยในการผสานรวมนี้ คุณจะสามารถส่งเหตุการณ์จากผู้ใช้ที่กําลังค้นหาการฝึกโมเดลเพิ่มเติมเพิ่มเติมได้ เมื่อติดตั้งใช้งานนี้ผ่านทางโค้ด คุณจะระบุได้ว่าข้อมูลที่จะส่งไปให้คืออะไร

เราจะเจาะลึกรายละเอียดเกี่ยวกับเหตุการณ์เหล่านั้นและวิธีส่งเหตุการณ์ในภายหลัง แต่รูปแบบก่อนการฝึกจะทํางานได้ดี เปิดใช้การบันทึกข้อมูลก่อน แล้วคลิก ""การเชื่อมต่อบัญชีบริการ" ในการนําทางด้านซ้ายของกล่องโต้ตอบนี้

สร้างบัญชีบริการ

เมื่อส่งคําขอ API คุณจะต้องส่งคําขอในนามของบัญชีที่ได้รับการตรวจสอบสิทธิ์จริง แนวทางปฏิบัติแนะนําสําหรับ Google Cloud Platform&#39 แนะนําให้ตั้งค่าบัญชีบริการ ลองคิดว่าบัญชีบริการเป็นวิธีง่ายๆ ในการตั้งค่าผู้ใช้ที่ตรวจสอบสิทธิ์แล้วซึ่งมีสิทธิ์แบบจํากัด ซึ่งจะช่วยคุณสร้างระบบอิสระและปลอดภัย

เช่น เราอาจต้องใช้บัญชีบริการเพื่อใช้ Job Search API มาสร้างหลักเกณฑ์และมอบสิทธิ์การอ่าน/เขียนโดยใช้ส่วน "Job Editor" จากส่วน "Cloud Talent Solution" ของการนําทางด้านซ้ายกัน นอกจากนี้ ยังตั้งค่าบัญชีบริการด้วย "Job Viewer&quot ได้ด้วย เพื่อให้มีสิทธิ์เข้าถึงระดับอ่านอย่างเดียว

ขั้นตอนต่อไปจะถามคุณว่าต้องการให้สิทธิ์ผู้ใช้เข้าถึงบัญชีบริการนี้หรือไม่ คุณข้ามขั้นตอนนี้ได้ แต่อย่าลืมคลิก "Create Key" บริเวณด้านล่าง เลือก "JSON" สําหรับประเภทคีย์ แล้วเลือก "Create" ระบบจะดาวน์โหลดไฟล์ข้อมูลเข้าสู่ระบบ JSON ใหม่โดยอัตโนมัติ เก็บไฟล์นี้บนเซิร์ฟเวอร์ของคุณ โค้ดที่คุณเขียนในส่วนถัดไปจะใช้เพื่อตรวจสอบสิทธิ์

ตั้งค่าตัวแปรสภาพแวดล้อม

เพื่อความสะดวก เราจะใช้ Shell ของ Google Cloud หากคุณอยากทําสิ่งนี้จากสภาพแวดล้อมการพัฒนาของคุณเอง เยี่ยมไปเลย ตรวจสอบว่าได้ติดตั้ง Google Cloud SDK และไลบรารีของไคลเอ็นต์เป็นภาษาที่ต้องการแล้ว (Codelab นี้จะใช้ Python) Cloud Shell จะมีไลบรารีของไคลเอ็นต์ระบบคลาวด์ติดตั้งอยู่แล้ว มีประโยชน์ใช่ไหม

หากต้องการเรียกใช้โค้ดโดยใช้ไลบรารี คุณต้องตรวจสอบว่าได้ตั้งค่าตัวแปรสภาพแวดล้อม 2 รายการแล้ว ตัวแปรหนึ่งเพื่อระบุรหัส Porject และอีกรายการเพื่อระบุไฟล์คีย์ของบัญชีบริการ มาเริ่มกันเลย

จากโปรเจ็กต์ ให้คลิกไอคอน ">_" ที่ด้านขวาบนของคอนโซลเว็บเพื่อเปิด Cloud Shell เพิ่มตัวแปรสภาพแวดล้อมต่อไปนี้เพื่อระบุรหัสโปรเจ็กต์และกําหนดเส้นทางไปยังไฟล์คีย์ 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 Console ให้เปิด Cloud Shell โดยใช้ไอคอน Cloud Shell ที่ด้านบนขวา

ที่ด้านขวาบนของ Cloud Shell จะเป็นชุดไอคอน คลิก File -> Launch Code Editor ตามที่แสดงไว้ที่นี่

สร้างบริษัท

ใช้ไฟล์ -> ไฟล์ใหม่เพื่อสร้างไฟล์แหล่งที่มาใหม่ และใส่เนื้อหาด้านล่างลงไป เรียกว่า create_company.py

create_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

รหัสนี้ทําอะไร ไปสํารวจกันเลย! การเรียกไลบรารีของไคลเอ็นต์ที่เกี่ยวข้องมี 2 แบบดังนี้

เรียกใช้ไฟล์จาก Command Prompt (ซึ่งมีประโยชน์ใต้หน้าต่างของตัวแก้ไขโค้ด) และคุณจะเห็นสิ่งที่คล้ายกับเอาต์พุตต่อไปนี้

> 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 

name คือตัวระบุที่ไม่ซ้ํากันซึ่งสร้างขึ้นโดย Job Search API ในขณะที่ external_id เป็นตัวระบุที่คุณระบุจากระบบงานของคุณเอง เมื่อใดก็ตามที่คุณอ้างอิงถึงออบเจ็กต์ผ่าน API คุณจะต้องใช้ชื่อ

อัปเดตบริษัท

หากคุณมีนิติบุคคลในระบบอยู่แล้วและต้องการเพิ่มหรือเปลี่ยนบางช่อง กระบวนการจะแบ่งออกเป็นขั้นตอนต่อไปนี้

  • สร้างออบเจ็กต์ด้วยค่าในช่องปัจจุบันสําหรับบริษัท
  • อัปเดตออบเจ็กต์นั้นด้วยช่องใหม่หรือที่อัปเดตโดยใช้ช่องบริษัท "name" เป็นคีย์เพื่อให้ API ทราบว่าต้องอัปเดตบริษัทใด
  • ส่งออบเจ็กต์ใหม่โดยใช้เมธอด &"patch"

โปรดทราบว่ากระบวนการนี้ต้องมีค่าที่มีอยู่ทั้งหมดเนื่องจากจะเขียนทับค่าบริษัททั้งหมดพร้อมกันไม่ว่าจะอัปเดตค่าใดก็ตามจริงๆ ซึ่งหมายความว่าก่อนที่เราจะอัปเดตข้อมูลบริษัท เราต้องเรียกข้อมูลนั้น

สร้างไฟล์ใหม่ 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().

เมื่อเรามีชุดค่าที่มีอยู่แล้ว ให้สร้างออบเจ็กต์ "patch" พร้อมชื่อช่องที่คุณต้องการอัปเดตและค่าใหม่ แล้วใช้อัปเดตออบเจ็กต์ของบริษัทด้วยค่าใหม่ ต่อไปนี้คือความสนุกสนานของการดําเนินการนี้ใน 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 จะเหมือนกัน สิ่งที่แตกต่างกันคือออบเจ็กต์คําขอมี 2 ช่อง (บริษัท และ update_mask) ไม่ใช่เพียงช่องเดียว (company) เน็ตเวิร์กมาสก์คือรายการที่คั่นด้วยคอมมา หากต้องการรวมช่อง "websiteUri" ในมาสก์ ค่าของมาสก์จะมีลักษณะดังนี้

   mask = 'displayName,websiteUri'

ไม่ว่าคุณจะเลือกเส้นทางใด ให้เรียกใช้จาก Shell ในระบบคลาวด์และ (สมมติว่าคุณปล่อยคําสั่งที่พิมพ์ไว้เหล่านั้น) คุณควรจะเห็นเอาต์พุตที่ระบุทั้งค่าเก่าและค่าใหม่ของบริษัท

$ 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 (หรือถ้าคุณเรียกใช้ "delete" สําเร็จ ในตอนท้ายของส่วนนี้และนําบริษัทแห่งเดียวออก) ให้กลับไปสร้างบริษัทอีกครั้ง เท่านี้คุณก็พร้อมสร้างงานแล้ว

สร้างงาน

มาเริ่มต้นด้วยการสร้างงานกัน

ในการสร้างงาน คุณจะต้องมีข้อมูลต่อไปนี้

  • ชื่อของบริษัท ไม่ใช่สตริงที่เจ้าหน้าที่อ่านได้ " LLC แฟนตาซีของฉัน แต่สตริงที่ยาวกว่าและละเอียดกว่าโปรเจ็กต์/[PROJECT_ID]/บริษัท/รหัสบริษัท/บริษัท)
  • รหัสคําขอของงาน ซึ่งคล้ายกับ external_id ของบริษัท ซึ่งจะแสดงถึงตัวระบุที่ไม่ซ้ํากันของคุณเองสําหรับงาน เพื่อให้ Cloud Talent Solution API ซิงค์กับโซลูชันงานปัจจุบันได้ง่ายขึ้น เช่น senior_llama_wrangler
  • ชื่อของงาน ซึ่งเป็นชื่อที่แสดงของงาน เช่น "Senior Llama Wrangler."
  • คําอธิบายของงาน โปรดทราบว่าคําอธิบายอาจมี HTML ที่ฝังไว้เพื่อให้จัดรูปแบบได้อย่างถูกต้อง เนื้อหาค่อนข้างอธิบายได้ด้วยตัวเอง "<p>จะนําทีมของ llama wranglers.</p><p> ต้องมีความสามารถในการเป็นผู้นําและประสบการณ์ของ llamas."</p>
  • applicationInfo - ข้อมูลเพิ่มเติมเกี่ยวกับวิธีสมัคร ต้องมี URI อย่างน้อย 1 รายการ อีเมลมากกว่า 1 รายการ หรือสตริงรูปแบบ HTML พร้อมวิธีการเพิ่มเติม คุณจะใส่ทั้ง 3 อย่างก็ได้ แต่คุณต้องใส่อย่างน้อย 1 ภาพ

ดังนั้น หากเราสร้างงานให้บริษัท FooCorp ที่เราเคยสร้างไว้ก่อนหน้านี้ ช่องจะมีลักษณะดังนี้

name

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

รหัสสอบถามเกี่ยวกับผลิตภัณฑ์

ninior_llama_wrangler

ชื่อ [title]

ลามะ Wrangler อาวุโส

รายละเอียด [description]

ต้องใช้ Llama Wrangler ที่มีประสบการณ์เพื่อรับตําแหน่งเต็มเวลา ผู้นําต้องมีความสามารถ เนื่องจากคุณจะต้องนําทีมผู้ดูแลลามะมาฝึกและสอนจนได้ Wrangler แบบเต็มตัว <p/> ต้องทํางานได้ดีกับสัตว์และเตรียมตัวสําหรับการวิ่ง เช่น รวดเร็วจริงๆ เช่น เร็วมาก ลามะลาเร็วๆ นี้

ข้อมูลแอปพลิเคชัน

Uris: http://www.example.com/llama_wrangler_application/

อีเมล: llama-apply@example.com

หากไม่มีชื่อบริษัทอีกต่อไป คุณใช้รหัส "get_company" ที่ใช้ในขั้นตอนที่ 3 เพื่อเรียกข้อมูลได้

โค้ดสําหรับการสร้างงานจะมีลักษณะคล้ายกับโค้ดสําหรับการสร้างบริษัท หลายบรรทัดแรกน่าจะคุ้นเคยอยู่แล้ว (นําเข้า blah blah blah, Instantiate user service object) จากนั้นจึงสร้างออบเจ็กต์คําสั่ง (เฉพาะชุดคีย์-ค่าที่ซ้อนกัน) ที่แสดงถึงคําขอของคุณ และส่งไปพร้อมกับการเรียกใช้ "create" 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

เรียกใช้ Shell จาก Cloud Shell เพื่อรับ 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 ช่องนี้เหมือนกับงานที่มีอยู่และยังไม่หมดอายุ งานนั้นจะถือว่าซ้ํากันและจะสร้าง/อัปเดตไม่สําเร็จพร้อมข้อความแสดงข้อผิดพลาดที่คุณเห็นด้านบน

ไชโย

ขอแสดงความยินดี ขณะนี้คุณมีทั้งบริษัทและรายการงานสําหรับบริษัทในระบบของคุณ ทั้งหมดนี้ใช้เวลาไม่ถึง 1 ชั่วโมง คุณอยากรู้ไหมว่าต้องใช้เวลานานเท่าใดกว่าเว็บไซต์ประกาศรับสมัครงานที่ดีที่สุดบนอินเทอร์เน็ตจะไปถึงผู้อ่าน ใช้เวลามากกว่า 1 ชั่วโมง ชอบทางมากขึ้น สัปดาห์ เดือน การประชุมคณะกรรมการ เพราะอาจมีสเปรดชีตและคําแถลงเกี่ยวกับพันธกิจ ฉันรู้จริงๆ ว่าในสํานักงานนั้นน่าจะค่อนข้างเล็ก รู้ไหมว่าเอาอะไรไปบ้าง ไม่ถึง 1 ชั่วโมง สุดๆ ไปเลย

ยิ่งไปกว่านั้นแล้ว มาลุยกันต่อ

การอัปเดตงาน

เช่นเดียวกับบริษัทอื่นๆ เราจะรับงานเพื่อดูรายละเอียด และแพตช์งานเพื่ออัปเดตได้

วิธีที่คุณต้องการรายละเอียดงานมีดังนี้ หากข้อมูลโค้ดด้านล่างนี้ดูคุ้นเคย นั่นเป็นเพราะเราใช้เมธอด "get_company" จากส่วนก่อนหน้าและแทนที่ "company" ด้วย "job" และเพิ่มในตัวแปร Jobs_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)   

ข้อมูลโค้ด 2 รายการข้างต้นมีการทํางานเหมือนกัน นั่นคือ อัปเดตตําแหน่งงานที่เฉพาะเจาะจงด้วยตําแหน่งงาน "Rogue Llama Acquisition Engine" โปรดทราบด้วยว่าบรรทัดที่เรียกใช้ 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 มาไว้ใน C.R.U.D จะทําอย่างไรหากต้องการลบ ไม่ต้องกังวลผู้อ่าน ส่วนถัดไปจะครอบคลุมส่วนนี้โดยละเอียด

มาเริ่มกันกับบริษัทต่างๆ แทน โดยใช้เหตุผลในการฟังประมาณ 5 นาทีนับจากนี้

ลบบริษัท

การลบบริษัทนั้นง่ายนิดเดียว เมื่อคุณใช้คําสั่งนําเข้าเดียวกันกับที่คุณใช้สร้างหรืออัปเดตบริษัท ให้เรียกเมธอด delete โดยส่งเฉพาะชื่อบริษัท (ไม่ต้องร้องขอเนื้อหา)

   # 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==">

เพียงเท่านี้ก็เรียบร้อยแล้ว เรียบร้อยแล้ว รอสักครู่ สิ่งนั้นคืออะไร ข้อผิดพลาด "ยังมีงานว่างอยู่ไหม"?

แน่นอน คุณทราบกฎแรกสําหรับการลบบริษัทแล้ว ก็จะไม่สําเร็จตราบใดที่บริษัทนั้นยังมีตําแหน่งงานว่างอยู่ เราจะจัดการกับเรื่องนี้อย่างไร เราต้องลบและลบงานที่เปิดอยู่ทั้งหมดที่เกี่ยวข้องกับบริษัทนั้น

ทีนี้เหตุผลที่สมเหตุสมผลก็ให้คิดว่า "I'จะลบงานที่เพิ่งสร้างไป แล้วลบบริษัทนั้นออก ผู้อ่านเข้าใจแล้ว มาเริ่มกันเลย

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 เหล่านี้ควรเป็นค่า "company" และ "job" ปัจจุบันที่ควรเป็นค่าว่าง

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')))

ตอนนี้คุณสร้างและจัดการข้อมูลบริษัทและงานโดยใช้ Google Cloud Talent Solutions Job Search API ได้แล้ว

สิ่งที่เราพูดถึง

  • การสร้างและจัดการบริษัท
  • การสร้างและจัดการรายการงานสําหรับบริษัทเหล่านั้น
  • การตั้งค่าบัญชีบริการเพื่อโต้ตอบกับ API ในนามของคุณ

ดูข้อมูลเพิ่มเติม