常用场景

下面介绍神箭手GraphQL接口的三种常用场景:“遍历某数据源的所有数据”“搜索某数据源符合条件的所有数据”“获取列表+详情页数据”

遍历某数据源的所有数据

<?php

// 可在神箭手"用户中心"查看
$user_key = '用户Key';
// 可在神箭手"用户中心"查看
$user_secret = '用户密钥';
// 可在每个数据源的"数据"页查看
$source_id = <数据源ID>;

// 下面按"__id"正序的方式遍历
$cursor = 0;
$has_next_page = false;
$try = 0;
do {
// 1. 拼接graphql的请求url
$timestamp = time();
$sign = md5($user_key . $timestamp . $user_secret);
// 组装query, 一次查询100条
$query = "source(__id:{gt:{$cursor}},limit:100,sort:\"asc\")".
"{data{},page_info{end_cursor,has_next_page}}";
$url = "https://graphql.shenjian.io/?".
"user_key={$user_key}&timestamp={$timestamp}&sign={$sign}".
"&source_id={$source_id}&query=" . urlencode($query);

// 2. 发送请求并解析结果
$content = file_get_contents($url);
$result = json_decode($content, true);
if ($result && $result['code'] == 0) {
$try = 0;
$page_info = $result['result']['page_info'];
// 更新cursor, 下次从新的cursor开始查
$cursor = $page_info['end_cursor'];
$has_next_page = $page_info['has_next_page'];
$items = $result['result']['data'];
foreach ($items as $item) {
// TODO 这里写处理单条数据的逻辑
// 这里仅打印
print_r($item);
}
} else {// graphql请求失败, 重试
$try++;
// 重试3次还是失败, 退出前记录cursor, 以便下次继续
if ($try > 3) {
echo "try too many times, cursor: {$cursor}\n";
break;
}
}
if (!$has_next_page) {// 遍历完了
echo "no more data\n";
break;
}
} while(true);

搜索某数据源符合条件的所有数据

“遍历某数据源的所有数据” 的写法类似,只需调整query查询语句,增加 字段筛选条件 即可。

获取列表+详情页数据

“获取微信文章列表页+详情页数据” 为例,以下是获取微信文章列表页数据的示例代码:

<?php
// 获取微信文章列表

// 可在神箭手"用户中心"查看
$user_key = '用户Key';
// 可在神箭手"用户中心"查看
$user_secret = '用户密钥';
// 可在每个数据源的"数据"页查看
$source_id = <数据源ID>;

// 下面按"__id"正序的方式遍历
$cursor = 0;
$has_next_page = false;
$try = 0;
do {
// 1. 拼接graphql的请求url
$timestamp = time();
$sign = md5($user_key . $timestamp . $user_secret);
// 组装query, 一次查询100条
$query = "source(__id:{gt:{$cursor}},limit:100,sort:\"asc\")".
"{data{__id,weixin_id,title,author,publish_time,thumbnail}".
",page_info{end_cursor,has_next_page}}";
$url = "https://graphql.shenjian.io/?".
"user_key={$user_key}&timestamp={$timestamp}&sign={$sign}".
"&source_id={$source_id}&query=" . urlencode($query);

// 2. 发送请求并解析结果
$content = file_get_contents($url);
$result = json_decode($content, true);
if ($result && $result['code'] == 0) {
$try = 0;
$page_info = $result['result']['page_info'];
// 更新cursor, 下次从新的cursor开始查
$cursor = $page_info['end_cursor'];
// 查询是否包含下一页数据
$has_next_page = $page_info['has_next_page'];
$items = $result['result']['data'];
foreach ($items as $item) {
// TODO 这里是微信文章的每一条列表数据
// 这里仅打印
print_r($item);
}
} else {// graphql请求失败, 重试
$try++;
// 重试3次还是失败, 退出前记录cursor, 以便下次继续
if ($try > 3) {
echo "try too many times, cursor: {$cursor}\n";
break;
}
}
if (!$has_next_page) {// 遍历完了
echo "no more data\n";
break;
}
} while(true);

获取到微信文章列表页数据后,通过每篇文章对应的__id可以得到文章详情页数据,以下是获取微信文章详情页数据的示例代码:

<?php
// 根据"__id"查询单条微信文章

// 可在神箭手"用户中心"查看
$user_key = '用户Key';
// 可在神箭手"用户中心"查看
$user_secret = '用户密钥';
// 可在每个数据源的"数据"页查看
$source_id = <数据源ID>;
// __id
$id = <数据ID>;

$timestamp = time();
$sign = md5($user_key . $timestamp . $user_secret);
$query = "source(__id:{eq:{$id}}){}";
$url = "https://graphql.shenjian.io/?".
"user_key={$user_key}&timestamp={$timestamp}&sign={$sign}".
"&source_id={$source_id}&query=" . urlencode($query);

$content = file_get_contents($url);
$result = json_decode($content, true);

if ($result && $result['code'] == 0) {
print_r($result['result']['data'][0]);
} else {
echo "query fail";
}