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
相关产品推荐
相关产品推荐

