Google for Jobs についてのメモ

個人的なメモです。参考になれば幸いです。
近々実装するので更新していきます。

# Google for Jobs って？

## [Google Japan Blogより](https://japan.googleblog.com/2019/01/shigoto-search.html)

- ウェブ上の転職・求人情報サイトや企業の採用ページ等から求人情報を探して、検索結果に分かりやすく表示する機能です。
- [ 渋谷 バイト ] [ 本屋 アルバイト ] や、[ パンケーキ シェフ 募集 ] のように、希望する職種やエリア等を入力して検索すると、関連する求人情報が検索結果内にひと目で分かりやすく表示されます。
- 実際の応募は、それぞれの募集サイトから行って下さい。

とのこと。

---

# 実装方法

## 求人情報を作成する

### 求人情報の構造化データを求人情報のウェブページに埋め込む

可能な限り最も詳細なリーフページに実装するとのこと。
検索結果やリストページに実装すると構造化データのポリシー違反らしい。

- [構造化データタイプの定義
](https://developers.google.com/search/docs/data-types/job-posting#definitions)
- [チェックツール](https://search.google.com/structured-data/testing-tool)

```json:例
<script type="application/ld+json"> {
  "@context" : "https://schema.org/",
  "@type" : "JobPosting",
  "title" : "Software Engineer",
  "description" : "<p>Google aspires to be an organization that reflects the globally diverse audience that our products and technology serve. We believe that in addition to hiring the best talent, a diversity of perspectives, ideas and cultures leads to the creation of better products and services.</p>",
  "identifier": {
    "@type": "PropertyValue",
    "name": "MagsRUs Wheel Company",
    "value": "1234567"
  },
  "datePosted" : "2017-01-18",
  "validThrough" : "2017-03-18T00:00",
  "employmentType" : "CONTRACTOR",
  "hiringOrganization" : {
    "@type" : "Organization",
    "name" : "Google",
    "sameAs" : "http://www.google.com",
    "logo" : "http://www.example.com/images/logo.png"
  },
  "jobLocation": {
  "@type": "Place",
    "address": {
    "@type": "PostalAddress",
    "streetAddress": "1600 Amphitheatre Pkwy",
    "addressLocality": ", Mountain View",
    "addressRegion": "CA",
    "postalCode": "94043",
    "addressCountry": "US"
    }
  },
 "baseSalary": {
    "@type": "MonetaryAmount",
    "currency": "USD",
    "value": {
      "@type": "QuantitativeValue",
      "value": 40.00,
      "unitText": "HOUR"
    }
  }
}
</script>
```

nuxtで作ってたんだけどこんな感じでプレビューはOKだった

```
export default {
  head() {
    const order = this.order;
    return {
      script: [
        {
          type: "application/ld+json",
          innerHTML: JSON.stringify(
            {
              "@context": "https://schema.org/",
              "@type": "JobPosting",
              title: order.title,
              description: `<p>${order.detail}</p>`,
              datePosted: order.openDate, // 雇用主が求人情報を投稿した最初の日付
              validThrough: order.closeDate // 求人情報が期限切れになる日付
              employmentType: "PART_TIME",
              hiringOrganization: {
                "@type": "Organization",
                name: order.client.name, // 職位を提供している組織
                sameAs: order.client.url,
                logo: "/logo.png" // 求人媒体の場合は自分のロゴでもOK
              },
              jobLocation: {
                "@type": "Place",
                address: {
                  "@type": "PostalAddress",
                  streetAddress: order.address, // 番地　市区町村と番地で分けてなかったけど同じものでいけた
                  addressLocality: order.address, // 市区町村
                  addressRegion: order.pref, // 都道府県
                  postalCode: order.postcode, // 郵便番号 numberでもいけた
                  addressCountry: "JP"
                }
              },
              baseSalary: {
                "@type": "MonetaryAmount",
                currency: "JPY",
                value: {
                  "@type": "QuantitativeValue",
                  value: order.monetaryAmount,
                  unitText: "HOUR"
                }
              }
            }
          )
        }
      ],
      __dangerouslyDisableSanitizers: ["script"]
    };
  }
}
```

### 構造化データを埋め込んだURLをチェックする

[構造化データをテスト、プレビューする](https://developers.google.com/search/docs/guides/prototype)

上のチェックツールでエラーがないこと、プレビューは確認できているはずなので、ここではサーチコンソールの[URL検査ツール](https://support.google.com/webmasters/answer/9012289)を用いて、ページが正しく表示されることをチェックする。

開発時はローカルサーバーでホストしているページをテストするので、[ここ](https://developers.google.com/search/docs/guides/debug#testing-firewalled-pages)を参考に[ngrok](https://ngrok.com/)でトンネルして検査する。



### 

ここまではローカルで行うがここからは本番環境で行う

開発環境で構造化データを埋め込み、チェックが完了したので、下記は本番環境で行う。
手始めにインデックス登録を行う。

インデックス登録をリクエストすると、求人情報の構造化データが正しく読み込まれ、拡張の求人情報にて1件の有効なアイテムを検証しました。と表示されている。

<img width="721" alt="スクリーンショット 2019-05-31 11.33.25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204698/f053503c-bcc7-2cb4-eb57-a79ce277c759.png">


ページがインデックスに登録されたら、該当する[リッチリザルトのステータス レポート](https://support.google.com/webmasters/answer/7552505)を使用して、問題がないかチェックする。


画像には表示されていないが、しばらくすると赤枠の中に「求人情報」が表示されるはず。
![スクリーンショット 2019-05-13 19.36.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204698/4855414e-85da-4e7c-ec6a-ed63328b5095.png)


・ここで問題がなかった場合、サイトマップを送信したい。
・問題がある場合は正して URL 検査ツールでもう一度テストを実施し、インデックス登録をリクエストします。

```:よくあるエラー
・求人のマークアップが使用されているが、求人に関連するコンテンツがページ上にない
・求人に応募する方法が示されていない
・求人のマークアップがユーザーに表示される求人の説明と一致していない
・応募が有料である、または求人情報が偽のようである
・誤解を招くような求人の文書
```

---

## 求人情報を作成する

下記からは継続的にGoogleへの情報提供を続ける方法

Indexing API を使用して求人情報の作成、更新、削除をGoogleに伝え、クロールしてもらう必要がある。

[Indexing API クイックスタート](https://developers.google.com/search/apis/indexing-api/v3/quickstart)を見ればわかるが下記は流れの説明。

- [Indexing API を使用する前提条件
](https://developers.google.com/search/apis/indexing-api/v3/prereqs) ←サンプルコードもある

Indexing APIを叩くサービスアカウントと、サイトの所有者を紐づける必要があるので、サービスアカウントの作成と秘密鍵の取得を行い、作ったサービスアカウントをサーチコンソールのアカウントに追加する。(メールアドレスを追加する)


![スクリーンショット 2019-06-18 17.08.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204698/44e30dd5-a9a2-c877-d486-a48bc0167c43.png)

からの

![スクリーンショット 2019-06-18 17.09.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204698/b2ed8b2b-15ef-10cd-c034-320c839d52d8.png)

この画面で所有権が追加できる


Google が提供している [API クライアント ライブラリ](https://developers.google.com/api-client-library/)をサービスアカウントの作成時にゲットした秘密鍵と合わせて使うことでIndexing API叩けるようになる。


- [Indexing API の使用
](https://developers.google.com/search/apis/indexing-api/v3/using-api)

リクエストの本文で、URLとタイプを送り、新規or更新 もしくは 削除 の切り分けを行う。

```
{
  "url": "https://careers.google.com/jobs/google/technical-writer",
  "type": "URL_UPDATED"
}
```

```
{
  "url": "https://careers.google.com/jobs/google/technical-writer",
  "type": "URL_DELETED"
}
```

また、バッチ更新も可能とのこと。

---

# まとめ

・Googleにクローリングしてもらえるページに構造化データを置く
・サービスアカウントを作成、サーチコンソールのユーザーに追加
・ページの変更にトリガー or 時間指定で動くバッチなんかでIndexing API を叩く

っていう流れらしい。

まだ何も手を動かしていないのでですが、結構簡単なんじゃね？って思っています。