grapper betsapi bet365 wip

This commit is contained in:
salam committed 2026-01-01 18:42:14 +01:00
1 parent e90a6c71f6
commit b1a724061f
19 files changed
+93 -51

No files matched your search

+6 -1
View File
@@ -2,6 +2,8 @@
namespace App\Console\Commands\Grapper;
use App\Console\Commands\Grapper\Betsapi\Bet365;
use App\Console\Commands\Grapper\Betsapi\Betfair;
use App\Console\Commands\Grapper\Betsapi\Bwin;
use App\Console\Commands\Grapper\Betsapi\Fixtures;
use App\Console\Commands\Grapper\Betsapi\Odds;
@@ -27,9 +29,12 @@ class Betsapi
case 'Bwin':
Bwin::grap();
break;
case 'Bwin':
case 'Bet365':
Bet365::grap();
break;
case 'Betfair':
Betfair::grap();
break;
default:
Notice::note('prosses name does not exist', 'r', 1);
break;
+46 -13
View File
@@ -5,7 +5,10 @@ namespace App\Console\Commands\Grapper\Betsapi;
use App\Console\Commands\Curl;
use App\Console\Commands\Nuh;
use App\Models\Event;
use App\Utilities\Notice;
use App\Models\Odds3way;
use App\Models\OddsDc;
use App\Utilities\Margin;
use Illuminate\Support\Carbon;
class Bet365
{
@@ -18,29 +21,59 @@ class Bet365
*/
$bookmaker_id = 126;
$res = Event::where('bet365_id', '>', 0)->pluck('id', 'bet365_id');
$events = Event::where('bet365_id', '>', 0)->where('events.starttime', '>', Carbon::now())->get();
foreach ($res as $bet365_id => $txodds_id) {
foreach ($events as $event) {
/**
* BET365 ODDS (per event)
*/
$url = 'https://api.b365api.com/v4/bet365/prematch?token='.config('env.betsapi_token').'&FI='.$bet365_id;
$url = 'https://api.b365api.com/v4/bet365/prematch?token='.config('env.betsapi_token').'&FI='.$event->bet365_id;
$data = Curl::load($url);
dd($data);
$offer = $data['results'][0]['main']['sp'];
$betsapi_id = $data['results'][0]['id'] ?? 0;
$bet365_id = $data['results'][0]['bet365_id'] ?? 0;
/**
* 1X2
*/
$odds = [];
$odds['h3w'] = $offer['full_time_result']['odds'][0]['odds'];
$odds['d3w'] = $offer['full_time_result']['odds'][1]['odds'];
$odds['a3w'] = $offer['full_time_result']['odds'][2]['odds'];
$odds['margin'] = (float) Margin::calculate([$odds['h3w'], $odds['d3w'], $odds['a3w']], 1);
$odds['sport_id'] = $event->sport_id;
$odds['provider_id'] = Nuh::$options['provider_id'];
$odds['bmoid'] = $event->bet365_id;
$odds['flag'] = 1;
$odds['last_check_at'] = Carbon::now();
if ($debug) {
Notice::note(["TXdds ID : $txodds_id", "Betsapi ID : $betsapi_id", "Bet365 ID : $bet365_id", "Willhill ID : $willhill_id"], 'b');
}
Odds3way::updateOrCreate([
'event_id' => $event->id,
'bookmaker_id' => $bookmaker_id,
], $odds);
/**
* DC
*/
$odds = [];
$odds['dc1x'] = $offer['full_time_result']['odds'][0]['odds'];
$odds['dc12'] = $offer['full_time_result']['odds'][1]['odds'];
$odds['dcx2'] = $offer['full_time_result']['odds'][2]['odds'];
$odds['margin'] = (float) Margin::calculate([$odds['dc1x'], $odds['dc12'], $odds['dcx2']], 1);
$odds['sport_id'] = $event->sport_id;
$odds['provider_id'] = Nuh::$options['provider_id'];
$odds['bmoid'] = $event->bet365_id;
$odds['flag'] = 1;
$odds['last_check_at'] = Carbon::now();
OddsDc::updateOrCreate([
'event_id' => $event->id,
'bookmaker_id' => $bookmaker_id,
], $odds);
dd($odds);
if ($betsapi_id) {
Event::where('id', (int) $txodds_id)->update(['betsapi_id' => $betsapi_id, 'bet365_id' => $bet365_id]);
}
}
}
}
@@ -14,8 +14,9 @@ class Betfair
$debug = Nuh::$options['d'] ?? 0;
/**
* Bet365
* Betfair
*/
exit;
$bookmaker_id = 126;
$res = Event::where('bet365_id', '>', 0)->pluck('id', 'bet365_id');
@@ -32,6 +32,7 @@ class Willhill
$res = Odds3way::join('events', 'odds_3ways.event_id', 'events.id')
->where('odds_3ways.bookmaker_id', $bookmaker_id)
->where('events.starttime', '>', Carbon::now())
->where('events.betsapi_id', 0)
->where('events.sport_id', $sport_id)
->where('odds_3ways.bmoid', '>', 0)->pluck('odds_3ways.event_id', 'odds_3ways.bmoid');
+1 -1
View File
@@ -15,7 +15,7 @@ use App\Models\Element;
use App\Models\Event;
use App\Models\Group;
use App\Utilities\Notice;
use Carbon\Carbon;
use Illuminate\Support\Carbon;
class Odds
{
@@ -0,0 +1 @@
{"success":1,"results":[{"FI":"186071623","event_id":"10119813","asian_lines":{"updated_at":"1767284567","key":"#AC#B1#C1#D8#E186071623#F3#I3#","sp":{"asian_handicap":{"id":"938","name":"Asian Handicap","odds":[{"id":"136626627","odds":"2.050","header":"1","handicap":"0.0,-0.5"},{"id":"136626629","odds":"1.800","header":"2","handicap":"0.0,+0.5"}]},"goal_line":{"id":"10143","name":"Goal Line","odds":[{"id":"136626630","odds":"1.875","name":"2.5","header":"Over"},{"id":"136626631","odds":"1.975","name":"2.5","header":"Under"}]},"alternative_asian_handicap":{"id":"50138","name":"Alternative Asian Handicap","odds":[],"open":0},"alternative_goal_line":{"id":"50139","name":"Alternative Goal Line","odds":[],"open":0},"1st_half_asian_handicap":{"id":"50137","name":"1st Half Asian Handicap","odds":[],"open":0},"1st_half_goal_line":{"id":"50136","name":"1st Half Goal Line","odds":[],"open":0},"alternative_1st_half_asian_handicap":{"id":"50265","name":"Alternative 1st Half Asian Handicap","odds":[],"open":0},"alternative_1st_half_goal_line":{"id":"50266","name":"Alternative 1st Half Goal Line","odds":[],"open":0},"asian_total_corners":{"id":"10164","name":"Asian Total Corners","odds":[],"open":0},"asian_handicap_corners":{"id":"10165","name":"Asian Handicap Corners","odds":[],"open":0},"1st_half_asian_corners":{"id":"10233","name":"1st Half Asian Corners","odds":[],"open":0},"asian_total_cards":{"id":"10166","name":"Asian Total Cards","odds":[],"open":0},"asian_handicap_cards":{"id":"10239","name":"Asian Handicap Cards","odds":[],"open":0}}},"cards":{"updated_at":"1767285348","key":"#AC#B1#C1#D8#E186071623#F3#I4#","sp":{"number_of_cards_in_match":{"id":"10542","name":"Number of Cards In Match","odds":[{"id":"270679284","odds":"1.833","name":"3.5","header":"Over"},{"id":"270679291","odds":"1.833","name":"3.5","header":"Under"}]},"both_teams_to_receive_cards":{"id":"50942","name":"Both Teams to Receive Cards","odds":[{"id":"270707239","odds":"1.333","name":"a Card","header":"Yes"},{"id":"270707258","odds":"2.625","name":"2+ Cards","header":"Yes"},{"id":"271036182","odds":"67.000","name":"a Red Card","header":"Yes"},{"id":"270707249","odds":"3.250","name":"a Card","header":"No"},{"id":"270707269","odds":"1.444","name":"2+ Cards","header":"No"},{"id":"271036197","odds":"1.001","name":"a Red Card","header":"No"}]},"player_cards":{"id":"50135","name":"Player Cards","odds":[{"id":"270709742","odds":"3.100","name":"Joao Palhinha","name2":"2","header":"Booked","team":"Player\/Last 5"},{"id":"270709610","odds":"3.100","name":"Rodrigo Bentancur","name2":"2","header":"Booked","team":"Player\/Last 5"},{"id":"270709691","odds":"3.250","name":"Cristian Romero","name2":"2","header":"Booked","team":"Player\/Last 5"},{"id":"270709622","odds":"4.333","name":"Igor Thiago","name2":"1","header":"Booked","team":"Player\/Last 5"},{"id":"270709699","odds":"4.500","name":"Aaron Hickey","name2":"1","header":"Booked","team":"Player\/Last 5"},{"id":"270709615","odds":"5.000","name":"Archie Gray","name2":"2","header":"Booked","team":"Player\/Last 5"},{"id":"270709578","odds":"9.500","name":"Joao Palhinha","name2":"2","header":"1st Card","team":"Player\/Last 5"},{"id":"270709559","odds":"9.500","name":"Rodrigo Bentancur","name2":"2","header":"1st Card","team":"Player\/Last 5"},{"id":"270709576","odds":"10.000","name":"Cristian Romero","name2":"2","header":"1st Card","team":"Player\/Last 5"},{"id":"270709597","odds":"13.000","name":"Igor Thiago","name2":"1","header":"1st Card","team":"Player\/Last 5"},{"id":"270709602","odds":"15.000","name":"Aaron Hickey","name2":"1","header":"1st Card","team":"Player\/Last 5"},{"id":"270709560","odds":"17.000","name":"Archie Gray","name2":"2","header":"1st Card","team":"Player\/Last 5"},{"id":"270709942","odds":"29.000","name":"Joao Palhinha","name2":"2","header":"Red Card","team":"Player\/Last 5"},{"id":"270709906","odds":"29.000","name":"Rodrigo Bentancur","name2":"2","header":"Red Card","team":"Player\/Last 5"},{"id":"270709924","odds":"34.000","name":"Cristian Romero","name2":"2","header":"Red Card","team":"Player\/Last 5"},{"id":"270709938","odds":"34.000","name":"Igor Thiago","name2":"1","header":"Red Card","team":"Player\/Last 5"},{"id":"270709844","odds":"41.000","name":"Aaron Hickey","name2":"1","header":"Red Card","team":"Player\/Last 5"},{"id":"270709834","odds":"41.000","name":"Archie Gray","name2":"2","header":"Red Card","team":"Player\/Last 5"}]},"either_to_be_booked":{"id":"177938","name":"Either to be Booked","odds":[],"open":0},"card_handicap":{"id":"10240","name":"Card Handicap","odds":[],"open":0},"alternative_card_handicap":{"id":"10241","name":"Alternative Card Handicap","odds":[],"open":0},"first_card_received":{"id":"476","name":"First Card Received","odds":[],"open":0},"time_of_first_card":{"id":"1183","name":"Time of First Card","odds":[],"open":0},"team_cards":{"id":"10242","name":"Team Cards","odds":[],"open":0},"red_card_in_match_half":{"id":"50241","name":"Red Card in Match\/Half","oLine truncated
@@ -122,6 +122,7 @@ class EventsTable
return $table
->striped()
->deferLoading()
->columns([
IconColumn::make('sport.icon')
->label('')
@@ -132,7 +133,7 @@ class EventsTable
->tooltip(fn ($record) => $record->id)
->visibleFrom('lg'),
MatchIds::make('match_ids')->grow(false)->visibleFrom('xl'),
// MatchIds::make('match_ids')->grow(false)->visibleFrom('xl'),
TextColumn::make('starttime')
->label('Start')
@@ -162,43 +163,37 @@ class EventsTable
->visible(fn () => in_array(1, self::$bettype_settings))
->verticalAlignment(VerticalAlignment::Start)
->width(225)
->label('1 X 2')
->extraCellAttributes(['class' => 'border-l border-gray-200 dark:border-gray-800']),
->label('1 X 2'),
ColumnDc::make('oddsdc')->bookmakers(self::$odds_dc)
->visible(fn () => in_array(2, self::$bettype_settings))
->verticalAlignment(VerticalAlignment::Start)
->width(225)
->label('Double Chance')
->extraCellAttributes(['class' => 'border-l border-gray-200 dark:border-gray-800']),
->label('Double Chance'),
ColumnDnb::make('oddsdnb')->bookmakers(self::$odds_dnb)
->visible(fn () => in_array(3, self::$bettype_settings))
->verticalAlignment(VerticalAlignment::Start)
->width(190)
->label('Draw No Bet')
->extraCellAttributes(['class' => 'border-l border-gray-200 dark:border-gray-800']),
->label('Draw No Bet'),
ColumnGgng::make('oddsggng')->bookmakers(self::$odds_ggng)
->visible(fn () => in_array(4, self::$bettype_settings))
->verticalAlignment(VerticalAlignment::Start)
->width(190)
->label('Goal No Goal')
->extraCellAttributes(['class' => 'border-l border-gray-200 dark:border-gray-800']),
->label('Goal No Goal'),
ColumnTq::make('oddstq')->bookmakers(self::$odds_tq)
->visible(fn () => in_array(5, self::$bettype_settings))
->verticalAlignment(VerticalAlignment::Start)
->width(190)
->label('To Qualify')
->extraCellAttributes(['class' => 'border-l border-gray-200 dark:border-gray-800']),
->label('To Qualify'),
ColumnTotal::make('oddstotal')->bookmakers(self::$odds_totals)
->visible(fn () => in_array(6, self::$bettype_settings))
->verticalAlignment(VerticalAlignment::Start)
->width(225)
->label('Totals')
->extraCellAttributes(['class' => 'border-l border-gray-200 dark:border-gray-800']),
->label('Totals'),
])->searchable(['id', 'betsapi_id', 'betradar_id', 'bet365_id', 'bwin_id'])
->poll('10s')
->defaultSort('starttime', 'ASC')
@@ -18,6 +18,12 @@ class SupervisorsTable
->striped()
->columns([
TextColumn::make('id')->badge(),
TextColumn::make('provider.name')->badge()
->color(fn ($record): string => match ($record->provider_id) {
1 => 'danger',
2 => 'success',
default => 'warning',
}),
SelectColumn::make('name')
->options([
'Fixtures' => 'Fixtures',
@@ -27,8 +33,7 @@ class SupervisorsTable
'Bet365' => 'Bet365',
'Betfair' => 'Betfair',
]),
TextColumn::make('provider.name')->badge(),
TextColumn::make('sport.name')->label('Sport'),
TextColumn::make('sport.name')->label('Sport')->color(fn ($record): string => $record->sport->color),
TextColumn::make('sleep')->numeric(),
TextColumn::make('runtime')->label('Run Time'),
TextColumn::make('maxsconds')->label('Max Time'),
+3 -1
View File
@@ -19,7 +19,9 @@ class SupervisorSeeder extends Seeder
(3, 'Fixtures', 2, 0, 15, 0, NULL, 1800, 0, 1, 1, '2025-12-19 11:42:35', '2025-12-22 06:41:47'),
(4, 'Willhill', 2, 0, 15, 0, '0.235', 1800, 0, 1, 1, '2025-12-19 11:48:05', '2025-12-22 06:41:51'),
(5, 'Bwin', 2, 0, 15, 0, NULL, 1800, 0, 1, 1, '2025-12-22 06:41:18', '2025-12-22 06:41:52'),
(6, 'Fixtures', 4, 1, 10, 0, '0', 30, 0, 1, 1, '2025-12-18 17:44:33', '2025-12-22 06:41:48');
(6, 'Bet365', 2, 0, 10, 0, '0', 30, 0, 0, 1, '2025-12-18 17:44:33', '2026-01-01 17:09:28'),
(7, 'Betfair', 2, 0, 10, 0, '0', 30, 0, 0, 1, '2025-12-18 17:44:33', '2026-01-01 17:09:35'),
(8, 'Fixtures', 4, 0, 10, 0, '0', 30, 0, 1, 1, '2025-12-18 17:44:33', '2026-01-01 17:08:53');
";
DB::unprepared($sql);
-1
View File
@@ -32,7 +32,6 @@ button[wire\:click="resetTableFiltersForm"] {
@apply !text-center
}
#mapper {
@layer components {
.fi-ta-ctn {
@@ -1,7 +1,7 @@
@if ($hasData())
<div x-data="{ message: 'loading..' }" class="mx-3 my-auto">
<div class="mx-3 my-auto">
<template x-ref="template">
<div class="grid grid-cols-5 grid-rows-5 gap-1 m-5">
<div class="grid grid-cols-5 grid-rows-5 gap-1 m-5 z-10">
@foreach ($getData() as $item)
@include('filament.tables.columns.multiline.bkm', [
@@ -1,7 +1,7 @@
@if ($hasData())
<div x-data="{ message: 'loading..' }" class="mx-3 my-auto">
<div class="mx-3 my-auto">
<template x-ref="template">
<div class="grid grid-cols-5 grid-rows-5 gap-1 m-5">
<div class="grid grid-cols-5 grid-rows-5 gap-1 m-5 z-10">
@foreach ($getData() as $item)
@include('filament.tables.columns.multiline.bkm', [
@@ -1,7 +1,7 @@
@if ($hasData())
<div x-data="{ message: 'loading..' }" class="mx-3 my-auto">
<div class="mx-3 my-auto">
<template x-ref="template">
<div class="grid grid-cols-4 grid-rows-5 gap-1 m-5">
<div class="grid grid-cols-4 grid-rows-5 gap-1 m-5 z-10">
@foreach ($getData() as $item)
@include('filament.tables.columns.multiline.bkm', [
@@ -1,7 +1,7 @@
@if ($hasData())
<div x-data="{ message: 'loading..' }" class="mx-3 my-auto">
<div class="mx-3 my-auto">
<template x-ref="template">
<div class="grid grid-cols-4 grid-rows-5 gap-1 m-5">
<div class="grid grid-cols-4 grid-rows-5 gap-1 m-5 z-10">
@foreach ($getData() as $item)
@include('filament.tables.columns.multiline.bkm', [
@@ -1,7 +1,7 @@
@if ($hasData())
<div x-data="{ message: 'loading..' }" class="mx-3 my-auto">
<div class="mx-3 my-auto">
<template x-ref="template">
<div class="grid grid-cols-5 grid-rows-5 gap-1 m-5">
<div class="grid grid-cols-5 grid-rows-5 gap-1 m-5 z-10">
@foreach ($getData() as $item)
@include('filament.tables.columns.multiline.bkm', [
@@ -1,7 +1,7 @@
@if ($hasData())
<div x-data="{ message: 'loading..' }" class="mx-3 my-auto">
<div class="mx-3 my-auto">
<template x-ref="template">
<div class="grid grid-cols-4 grid-rows-5 gap-1 m-5">
<div class="grid grid-cols-4 grid-rows-5 gap-1 m-5 z-10">
@foreach ($getData() as $item)
@include('filament.tables.columns.multiline.bkm', [
@@ -1,5 +1,5 @@
<li class="bg-white dark:bg-gray-900 w-full h-full overflow-hidden p-1 cursor-grab flex space-x-4 drag-and-drop__item px-4"
x-data="{ moveoverleft: false }" id={{ $record->id }}
<li class="w-full h-full overflow-hidden p-1 cursor-grab flex space-x-4 drag-and-drop__item px-4" x-data="{ moveoverleft: false }"
id={{ $record->id }}
x-on:dragstart.self="
dragging = true;
event.dataTransfer.effectAllowed = 'move';
@@ -1,6 +1,6 @@
<li class="bg-white dark:bg-gray-900 w-full h-full overflow-hidden p-1 cursor-grab flex
space-x-4 drag-and-drop__item px-4"
x-data="{ moveoverright: false }" id={{ $record->event_id }}
<li class="h-full overflow-hidden p-1 cursor-grab flex
space-x-4 drag-and-drop__item px-4" x-data="{ moveoverright: false }"
id={{ $record->event_id }}
x-on:dragstart.self="
dragging = true;
event.dataTransfer.effectAllowed = 'move';
@@ -3,7 +3,7 @@
@endphp
@if (isset($icon))
<div class="h-4 m-0 bg-contain bg-center bg-no-repeat my-auto" title="{{ $bookmaker_id }}"
<div class="h-4 m-0 bg-contain bg-center bg-no-repeat my-auto dark:opacity-80" title="{{ $bookmaker_id }}"
style="background-image: url('{{ BkmIconMap::get($icon) }}')">
</div>
@endif