sekolah_adiwiyata/app/Http/Controllers/Api/ApiController.php

319 lines
12 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use App\Models\Master\Provinsi;
use App\Models\Master\Kabupaten;
use App\Models\Master\Kecamatan;
use App\Models\Master\Sekolah;
use App\Models\Master\MasterTingkatSekolah;
use GuzzleHttp\Client;
use Symfony\Component\DomCrawler\Crawler;
class ApiController extends Controller
{
public function getProvince()
{
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://dapo.dikdasmen.go.id/rekap/dataSekolah?id_level_wilayah=0&kode_wilayah=000000&semester_id=20242',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response);
$_data = [];
foreach($data as $k => $val){
$_data = Provinsi::updateOrCreate([
'kode_wilayah' => str_replace(' ', '', $val->kode_wilayah)
],[
'name' => str_replace('Prov. ','',$val->nama),
'kode_wilayah' => str_replace(' ', '', $val->kode_wilayah),
]);
}
echo "-- DONE --";
}
public function getKabupaten()
{
$prov = Provinsi::where('kode_wilayah','010000')->first();
$curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_URL => 'https://dapo.dikdasmen.go.id/rekap/dataSekolah?id_level_wilayah=1&kode_wilayah=010000&semester_id=20242',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => '',
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 0,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => 'GET',
));
$response = curl_exec($curl);
curl_close($curl);
$data = json_decode($response);
$_data = [];
foreach($data as $k => $val){
$_data = Kabupaten::updateOrCreate([
'kode_wilayah' => str_replace(' ', '', $val->kode_wilayah),
],[
'ms_provinsi_id' => $prov->MsProvinsiId,
'name' => str_replace('Kab. ','',$val->nama),
'kode_wilayah' => str_replace(' ', '', $val->kode_wilayah),
]);
}
echo "-- DONE --";
}
public function getKecamatan()
{
//get kabupaten jakarta
$prov = Provinsi::where('kode_wilayah','010000')->first();
$kab = Kabupaten::where('ms_provinsi_id',$prov->MsProvinsiId)->get();
foreach($kab as $data){
$response = Http::timeout(300)->withoutVerifying()->get('https://dapo.dikdasmen.go.id/rekap/dataSekolah?id_level_wilayah=2&kode_wilayah='.$data->kode_wilayah.'&semester_id=20242');
$kec = json_decode($response->body());
foreach($kec as $val){
$_data = Kecamatan::updateOrCreate([
'kode_wilayah' => str_replace(' ', '', $val->kode_wilayah),
],[
'ms_provinsi_id' => $prov->MsProvinsiId,
'ms_kabupaten_id' => $data->MsKabupatenId,
'name' => str_replace('Kec. ','',$val->nama),
'kode_wilayah' => str_replace(' ', '', $val->kode_wilayah),
]);
}
}
echo "-- DONE --";
}
public function getSekolah()
{
$type = request()->type;
$level = MasterTingkatSekolah::where('name',strtoupper($type))->first();
//get kabupaten jakarta
$prov = Provinsi::where('kode_wilayah','010000')->first();
$kab = Kabupaten::where('ms_provinsi_id',$prov->MsProvinsiId)->get();
foreach($kab as $data){
$kec = Kecamatan::where('ms_kabupaten_id',$data->MsKabupatenId)->get();
foreach($kec as $dataKec){
$response = Http::timeout(300)->withoutVerifying()->get('https://dapo.dikdasmen.go.id/rekap/progresSP?id_level_wilayah=3&kode_wilayah='.$dataKec->kode_wilayah.'&semester_id=20242&bentuk_pendidikan_id='.$type);
$dataSekolah = json_decode($response->body());
foreach($dataSekolah as $val){
$_data = Sekolah::updateOrCreate([
'npsn' => $val->npsn,
],[
'ms_provinsi_id' => $prov->MsProvinsiId,
'ms_kabupaten_id' => $data->MsKabupatenId,
'ms_kecamatan_id' => $dataKec->MsKecamatanId,
'ms_tingkat_sekolah_id' => $level->MsTingkatSekolahId,
'status' => $val->status_sekolah,
'nama_sekolah' => $val->nama,
'npsn' => $val->npsn,
]);
}
}
}
echo "-- DONE --";
}
public function scrappingMI(Request $request)
{
$prov = Provinsi::where('kode_wilayah','010000')->first();
$kab = Kabupaten::where('ms_provinsi_id',$prov->MsProvinsiId)->get();
$jenjang = $request->input('jenjang', '3'); // SD = 3
$jenis = $request->input('jenis', 'jf'); // jenjang formal
//9 = MI, 10 = Mts
$status = $request->input('status'); // semua status
$level = $request->input('level', 'all'); // semua level
$dataScrapping = [];
foreach($kab as $data){
$kec = Kecamatan::where('ms_kabupaten_id',$data->MsKabupatenId)->get();
foreach($kec as $dataKec){
$provinsi = $request->input('provinsi', $dataKec->kode_wilayah); // default Kep. Seribu Selatan
$url = "https://referensi.data.kemdikbud.go.id/pendidikan/dikdas/{$provinsi}/{$jenjang}/{$jenis}/{$status}/{$level}";
$response = Http::timeout(300)->withoutVerifying()->get($url);
// $client = new Client();
// $res = $client->get($url);
$html = $response->body();
$crawler = new Crawler($html);
$table = $crawler->filter('table')->first();
$headers = $table->filter('tr')->first()->filter('th')->each(function ($node) {
return trim($node->text());
});
$table->filter('tr')->each(function ($tr, $i) use (&$dataScrapping, $headers) {
if ($i === 0) return; // skip header row
$row = $tr->filter('td')->each(function ($td) {
return trim($td->text());
});
if (count($row) === count($headers)) {
$dataScrapping[] = array_combine($headers, $row);
}
});
// dd($dataScrapping);
if($status == 9){
$tingkat = 5;
}elseif($status == 10){
$tingkat = 6;
}
foreach($dataScrapping as $val){
$_data = Sekolah::updateOrCreate([
'npsn' => $val['NPSN'],
],[
'ms_provinsi_id' => $prov->MsProvinsiId,
'ms_kabupaten_id' => $data->MsKabupatenId,
'ms_kecamatan_id' => $dataKec->MsKecamatanId,
'ms_tingkat_sekolah_id' => $tingkat,
'status' => ucwords($val['Status']),
'nama_sekolah' => $val['Nama Satuan Pendidikan'],
'alamat_sekolah' => $val['Alamat'],
'npsn' => $val['NPSN'],
]);
}
}
}
return response()->json([
'message' => 'Scraping selesai',
'jumlah_data' => count($dataScrapping),
'data' => $dataScrapping,
]);
}
public function scrappingMA(Request $request)
{
$prov = Provinsi::where('kode_wilayah','010000')->first();
$kab = Kabupaten::where('ms_provinsi_id',$prov->MsProvinsiId)->get();
$jenjang = $request->input('jenjang', '3'); // SD = 3
$jenis = $request->input('jenis', 'jf'); // jenjang formal
$status = $request->input('status', '16'); // semua status
$level = $request->input('level', 'all'); // semua level
$dataScrapping = [];
foreach($kab as $data){
$kec = Kecamatan::where('ms_kabupaten_id',$data->MsKabupatenId)->get();
foreach($kec as $dataKec){
$provinsi = $request->input('provinsi', $dataKec->kode_wilayah); // default Kep. Seribu Selatan
$url = "https://referensi.data.kemdikbud.go.id/pendidikan/dikmen/{$provinsi}/{$jenjang}/{$jenis}/{$status}/{$level}";
$response = Http::timeout(300)->withoutVerifying()->get($url);
// $client = new Client();
// $res = $client->get($url);
$html = $response->body();
$crawler = new Crawler($html);
$table = $crawler->filter('table')->first();
$headers = $table->filter('tr')->first()->filter('th')->each(function ($node) {
return trim($node->text());
});
$table->filter('tr')->each(function ($tr, $i) use (&$dataScrapping, $headers) {
if ($i === 0) return; // skip header row
$row = $tr->filter('td')->each(function ($td) {
return trim($td->text());
});
if (count($row) === count($headers)) {
$dataScrapping[] = array_combine($headers, $row);
}
});
// dd($dataScrapping);
foreach($dataScrapping as $val){
$_data = Sekolah::updateOrCreate([
'npsn' => $val['NPSN'],
],[
'ms_provinsi_id' => $prov->MsProvinsiId,
'ms_kabupaten_id' => $data->MsKabupatenId,
'ms_kecamatan_id' => $dataKec->MsKecamatanId,
'ms_tingkat_sekolah_id' => 7,
'status' => ucwords($val['Status']),
'nama_sekolah' => $val['Nama Satuan Pendidikan'],
'alamat_sekolah' => $val['Alamat'],
'npsn' => $val['NPSN'],
]);
}
}
}
return response()->json([
'message' => 'Scraping selesai',
'jumlah_data' => count($dataScrapping),
'data' => $dataScrapping,
]);
}
public function testScrapping()
{
$client = new Client();
$url = "https://ww1.anoboy.app/2016/10/one-piece-indonesia";
$response = Http::timeout(300)->withoutVerifying()->get($url);
$html = $response->body();
$crawler = new Crawler($html);
$table = $crawler->filter('table')->first();
$episodes = [];
$crawler->filter('ul#lcp_instance_0 li a')->each(function ($node) use (&$episodes) {
$title = $node->text();
$url = $node->attr('href');
// Hanya ambil link yang berkaitan dengan One Piece
// if (stripos($title, 'One Piece') !== false) {
$episodes[] = [
'title' => $title,
'url' => $url,
];
// }
});
return response()->json($episodes);
}
}