Skip to content

Instantly share code, notes, and snippets.

@bzz0217
Last active December 12, 2015 19:17
Show Gist options
  • Save bzz0217/d8ae39ee5fb1d8fba468 to your computer and use it in GitHub Desktop.
Save bzz0217/d8ae39ee5fb1d8fba468 to your computer and use it in GitHub Desktop.
QiitaAPIで取得した記事情報・ユーザ情報をDB登録
<?php
ini_set("display_errors", 1);
error_reporting(-1);
ini_set("max_execution_time", 0);
require 'vendor/autoload.php';
$app = new \Slim\Slim(array(
'debug' => true
));
function dbInsert($row, $user){
ORM::configure(array(
'connection_string' => 'mysql:host=localhost;dbname=qiita',
'username' => 'xxxx',
'password' => 'xxxx',
'driver_options', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'),
'error_mode', PDO::ERRMODE_WARNING,
'logging', true
));
//記事登録
$items = ORM::for_table('items')->where_equal('item_id', $row['item_id'])->find_one();
if (!$items){
//未登録の記事は登録
$items = ORM::for_table('items')->create();
$items->set($row);
$items->save();
}
//ユーザ情報登録
$users = ORM::for_table('users')->where_equal('user_id', $user['user_id'])->find_one();
if (!$users){
//未登録のユーザは登録
$users = ORM::for_table('users')->create();
$users->set($user);
echo " 登録<br>";
}else{
//登録済のユーザは更新
$users->set($user);
echo " 更新<br>";
}
$users->save();
}
$app->get('/batch/today', function(){
//qiita 1日分投稿情報取得
$context = stream_context_create(array(
"http" => array(
'method' => 'GET',
'header' => implode("\r\n", array(
'Content-Type: application/x-www-form-urlencoded',
'Authorization: Bearer xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
))
)
));
//取得する投稿範囲
$yesterday = date("Y-m-d", strtotime('-1 day'));
$start = strtotime( $yesterday . ' 00:00:00' );
$end = strtotime( $yesterday . ' 23:59:59' );
$target_items = array();
$loop_end_flg = 0;
//Qiitaでのページ数制限が100(最大10000記事取得)
//前日投稿された記事を取得する
for ($p=1; $p<=100; $p++){
$api_url = 'http://qiita.com/api/v2/items?per_page=100&page=' . $p;
$items = file_get_contents($api_url, false, $context);
if (!empty($items)){
$items_arr = json_decode($items, true);
for ($itm=0; $itm<count($items_arr); $itm++){
//作成日時の形式を変換
$created_at_unixtime = strtotime( $items_arr[$itm]['created_at'] );
if ($start<=$created_at_unixtime && $end>=$created_at_unixtime){
$target_items[] = $items_arr[$itm];
}
if ($start>$created_at_unixtime){
//昨日分の範囲から外れた為終了
$loop_end_flg = 1;
break;
}
}
}
if ($loop_end_flg==1){
break;
}
}
function tag_csv($tags){
$csv = "";
for ($t=0; $t<count($tags); $t++){
if ($csv!=""){
$csv .= ",";
}
$csv .= $tags[$t]['name'];
}
return $csv;
}
if (!empty($target_items)){
//DBへ記事情報の登録
for ($tgt=0; $tgt<count($target_items); $tgt++){
$tag_csv = tag_csv($target_items[$tgt]['tags']);
//作成日時の形式を変換
$date = new DateTime($target_items[$tgt]['created_at']);
$item_created_at = $date->format('Y-m-d h:i:s');
//更新日時の形式を変換
$date = new DateTime($target_items[$tgt]['updated_at']);
$item_updated_at = $date->format('Y-m-d h:i:s');
$row = array(
"item_id" => $target_items[$tgt]['id'],
"title" => $target_items[$tgt]['title'],
"body" => $target_items[$tgt]['body'],
"tags" => $tag_csv,
"url" => $target_items[$tgt]['url'],
"user_id" => $target_items[$tgt]['user']['id'],
"item_created_at" => $item_created_at,
"item_updated_at" => $item_updated_at
);
//Insert時データないとNULL制約でエラーになるケースある為
//データなければセットしない
$user = array();
foreach ($target_items[$tgt]['user'] as $key => $value){
if ($key=="id"){
$user['user_id'] = $value;
}else{
if (!empty($value)){
$user[$key] = $value;
}
}
}
//DB登録処理(未登録の記事の場合)
dbInsert($row, $user);
}
}
});
$app->run();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment