You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP对接Indeed API实现双向职位同步遇权限错误求助

解决Indeed职位发布权限错误及双向同步实现方案

一、当前发布失败的核心问题及修复

你遇到的FORBIDDEN错误主要由请求格式不符合GraphQL规范、冗余认证参数干扰导致,同时需确认权限配置是否到位。

1. 修正请求格式与冗余参数

你的代码在发送GraphQL请求时存在两个关键错误:

  • 错误使用x-www-form-urlencoded格式传递GraphQL数据,GraphQL要求用JSON格式提交
  • 重复传递grant_type、client_id等Token获取参数,这些在Bearer认证阶段已无需携带

修正后的发布职位代码片段:

// 获取token后的发布逻辑
$access_token = $result['access_token'];
echo 'Access Token: ' . $access_token."<br><br><br>";

// 仅保留GraphQL mutation数据
$job_mutation = [
    "mutation" => [
        "jobsIngest" => [
            "createSourcedJobPostings" => [
                "jobPostings" => [
                    [
                        "body" => [
                            "title" => "Test Job From local",
                            "description" => "Lorem Ipsum dolor sit amet",
                            "location" => [
                                "country" => "US",
                                "cityRegionPostal" => "US, NY 12345",
                            ],
                            "benefits" => [],
                        ],
                        "metadata" => [
                            "jobSource" => [
                                "companyName" => "Test Company",
                                "sourceName" => "TestCompany",
                                "sourceType" => "Employer",
                            ],
                            "jobPostingId" => "JobId1",
                            "datePublished" => "2024-03-18T12:00Z",
                            "url" => "http://example.com/careers/job1.html",
                            "contacts" => [
                                [
                                    "contactType" => ["contact", "recruiter"],
                                    "contactInfo" => [
                                        "contactEmail" => "test@gmail.com",
                                        "contactPhone" => "+91324354",
                                        "contactName" => "SL1",
                                    ],
                                ],
                            ],
                        ],
                    ],
                ],
            ],
        ],
    ],
];

$ch1 = curl_init('https://apis.indeed.com/graphql');
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch1, CURLOPT_POST, true);
// 用JSON格式传递请求体
curl_setopt($ch1, CURLOPT_POSTFIELDS, json_encode($job_mutation));
curl_setopt($ch1, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer ' . $access_token,
    'Content-Type: application/json', // 修正Content-Type
    'Key: 99f022474d7****' // 规范请求头首字母大写
]);
$response1 = curl_exec($ch1);
$http_status1 = curl_getinfo($ch1, CURLINFO_HTTP_CODE);

if ($http_status1 == 200) {
    echo 'Job posted successfully.';
} else {
    echo 'Error posting job: ' . $response1;
}
curl_close($ch1);

2. 权限配置排查

如果修正格式后仍报错,需检查以下几点:

  • 确认你的Indeed应用已申请并获得createSourcedJobPostings权限:employer_access是基础范围,部分操作需额外提交审核申请
  • 验证应用是否关联了真实的雇主账户:Indeed要求发布职位的应用必须绑定已验证的雇主资料
  • 检查API Key、Client ID/Secret是否与Indeed开发者平台的应用信息完全匹配,避免字符遗漏或输入错误

二、双向同步的完整实现思路

1. 门户→Indeed发布(已修复上述问题)

  • 用Cron定时触发脚本,从MySQL中读取标记为「未同步」的职位数据
  • 按Indeed GraphQL API要求格式化数据,发送请求完成发布
  • 同步成功后更新MySQL中对应职位的同步状态,避免重复发布

2. Indeed→门户同步

  • 使用Indeed的职位搜索API(需申请job_search权限),按地区、关键词、发布时间等条件拉取职位数据
  • 解析返回的JSON数据,提取职位ID、标题、描述、地点、公司等核心字段
  • 去重处理:通过Indeed职位ID判断是否已存在于MySQL中,避免重复插入
  • 将新职位插入MySQL,或更新已有职位的信息(如描述、状态变更)

示例拉取Indeed职位的核心代码片段:

// 拉取Indeed职位示例
$access_token = "你的有效access token";
$search_url = "https://apis.indeed.com/graphql";
$search_query = [
    "query" => "query {
        jobs(q: \"developer\", l: \"New York, NY\", limit: 10, fromage: 24) {
            results {
                jobId
                title
                description
                location {
                    city
                    state
                    country
                }
                companyName
                url
                datePosted
            }
        }
    }"
];

$ch = curl_init($search_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($search_query));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer ' . $access_token,
    'Content-Type: application/json',
    'Key: 你的API Key'
]);
$response = curl_exec($ch);
$result = json_decode($response, true);

// 处理拉取到的职位数据,插入/更新MySQL
if (!empty($result['data']['jobs']['results'])) {
    // 假设已建立MySQL连接$conn
    foreach ($result['data']['jobs']['results'] as $job) {
        $job_id = mysqli_real_escape_string($conn, $job['jobId']);
        $title = mysqli_real_escape_string($conn, $job['title']);
        $description = mysqli_real_escape_string($conn, $job['description']);
        $location = mysqli_real_escape_string($conn, $job['location']['city'] . ', ' . $job['location']['state']);
        $company = mysqli_real_escape_string($conn, $job['companyName']);
        $url = mysqli_real_escape_string($conn, $job['url']);
        $date_posted = mysqli_real_escape_string($conn, $job['datePosted']);

        // 插入或更新数据
        $sql = "INSERT INTO jobs (indeed_job_id, title, description, location, company, url, date_posted) 
                VALUES ('$job_id', '$title', '$description', '$location', '$company', '$url', '$date_posted') 
                ON DUPLICATE KEY UPDATE title='$title', description='$description', date_posted='$date_posted'";
        mysqli_query($conn, $sql);
    }
}

3. Cron Job配置

在服务器上设置Cron定时任务,比如每小时执行一次同步脚本:

0 * * * * /usr/bin/php /path/to/your/indeed_sync_script.php >> /var/log/indeed_sync.log 2>&1

内容的提问来源于stack exchange,提问作者Adarsh Bhatt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 11:04:52