Verificare key dacă este bun


(Gab) #1

Am nevoie de un cod php care să verifice dintr-o listă array de keys care este bun.
De exemplu, am domain.com/api/key și când verifică acel key să returneze conținutul, dacă key-ul respectiv nu este bun, să treacă la următorul până când va returna unul bun și tot așa.

Scuze dacă nu m-am exprimat ok mai pe înțeles…


(cosmos) #2

Cum care este bun ? :slight_smile:

Daca te referi in a verifica daca cheia exista intr-un array, in php poti folosi array_key_exists()

http://php.net/manual/ro/function.array-key-exists.php

Asta daca inteleg eu bine


un api key, de obicei previne ca un api sa fie folosit in mod abuziv

Bun esste un criteriu pe care tu il definesti


(Gab) #3

Să facă verificare la domeniul respectiv cu api key-ul dacă este valid sau nu, iar dacă nu, să ia din lista array până găsește unul bun.


(Gab) #5

De exemplu: Google, am 5 conturi, deci, îmi fac 5 api key-uri. La fiecare api key am o limită de 1000 de requesturi, apoi îmi returneză că am atins limita maximă, atunci când returnează acea chestie, să treacă la următorul api key din array-ul cu cele 5, asta ca să previn vreo eroare pe site unde folosesc api-ul de la Google.


(cosmos) #6

aaaaa

pai google nu cred ca iti returneaza vreo cheie. Dupa cum ti-am zis si mai sus. Acela este unul din scopurile unui api-key.

Parerea mea este ca mai bine platesti daca este un site cu ceva trafic.


Invata sa spui problema reala de la inceput. Astfel vor curge mesaje in care lumea o sa te intrebe “Dar care este problema ta ?”

Posibil


(Gab) #7

Nu ai înțeles


(Vladimir) #8

De ce nu schimbi cheia cand nu returneaza 200?


(Gab) #9

Pentru că nu vreau să fac asta manual și să stau să verific constant daca api-ul respectiv a depășit limita sau a dat vreo eroare, de asta și vreau un array cu mai multe key-uri.


(Vladimir) #10

Cand faci cererea se intoarce un header cu un status cod, verifici acel status cod si daca nu este 200 scoti cheia din array si apelezi iar functia care face cererea. Probabil au un cod si pentru depasirea limitei, il verifici pe ala.

Sau poate are altcineva o idee mai buna.


(Gab) #11
$keys = array("4OqXX","6izIQ","PHZwk","uMChJ","oogh7");

foreach ($keys as $key) {
	$get = file_get_contents("https://paste.ee/r/".$key."/0");
	
	if ($get == "true")
		$result = "ok ".$key; // putem folosi api-ul
	   else
		$result = null;
}


echo $result;

Ceva de genul, nu e prea corect ce am făcut eu aici… am pus asta să vă dați seama cam cum aș vrea eu codul


(Eduard-Dan Stanescu) #12

Ia primul api-key din array-ul keys, verifica-l, daca nu este bun, sterge-l. Repeta instructiunea pana cand da de un api-key bun ce poate fi exploatat.

Nu ai de ce sa faci foreach la array-ul keys.


(Gab) #13

Nu ai înțeles ce vreau eu.


#14

Așa ?

<?php
$limit_requests = 1000;

$keys = array("4OqXX","6izIQ","PHZwk","uMChJ","oogh7");

$result = null;
foreach($keys as $key)
{
	for($i = 1; $i <= $limit_requests; $i++)
	{
		$get = @file_get_contents("https://paste.ee/r/".$key."/0");
		
		if($get !== false)
		{
			$result = [
				'key'		=> $key,
				'response'	=> $get,
			];
			break 2;
		}
	}
}

if($result)
{
	// Result found :)
}

Dacă ăsta e codul așteptat, să știi că nu este cea mai bună variantă să faci asta. În mod normal ar trebui să interpretezi statusul http (automat, nu e nevoie de nimic manual aici).

De fapt, în codul de mai sus se va verifica dacă există un răspuns (oricare ar fi el). Iar dacă da, atunci este setat $result și ieșim din loop-uri cu break 2 (pentru ambele). Deci, în mod sigur nu e asta soluția, dar asta îmi pare că ai cerut…

PS: Și bănuiesc că 1000 este doar un exemplu. Orice site care se așteaptă la lucruri de genul ăsta, te va bloca în scurt timp. Ar fi recomandat și un sleep sau usleep.

Edit: Verifică codul. Nu l-am testat.


(Alex) #15

1000 requesturi pe? ora? zi? an?
eu le-as tine in db si as face un update la ele (sa zicem ca pun un camp unde tin ziua in care au fost folosite)… Cand ating limita fac un update la campul respectiv pt ziua urmatoare si caut prima cheie care sa fie valida pt ziua in curs.


(cosmos) #17

Se poate folosi codul http 429. Cel putin api-ul acelui serviciu suporta codul.
https://pastee.github.io/docs/#errors

https://developers.google.com/maps/premium/previous-licenses/articles/usage-limits
Cei de la google ofera un exemplu in python pt situatia la limita. Se poate adapta usor si pt php :slight_smile:


(Gab) #18

Da, am verificat codul și dă răspuns doar la primul key indiferent de rezultat, eu vreau să treacă la următorul key dacă primul returnează false


(Bogdan Ciubotariu) #19

Păi și ai încercat să modifici codul astfel încât să meargă?

În altă ordine de idei, ce încerci tu să faci? Bruteforce la un API ca să vezi dacă ghicești o cheie? Eu zic să cauți lucruri mai bune de făcut, că n-ai nicio șansă…


(Eduard-Dan Stanescu) #20
$keys = array("4OqXX","6izIQ","PHZwk","uMChJ","oogh7");
$api_key = null;

foreach($keys as $key) {
	$get = @file_get_contents("https://paste.ee/r/".$key."/0");
	if($get !== "false") {
		$api_key = $key;
		break;
	}
}

echo $api_key; //6izIQ

(Alex) #21

are n chei. vrea sa verifice toate cheile pana gaseste una care n-a atins limita de requesturi.


(Gab) #22

Merge și nu mergem, dacă la key-ul 2 pun unul greșit nu trece la următorul, rămâne același greșit.