vechnokrainii
@vechnokrainii
ну почти всегда(

Как сделать автоматическую смену ключей Dadata?

Всем здравствуйте! Я начинающий разработчик, стаж с мая 20-ого, поэтому если ошибка глупая не ругайте сильно)
Есть сервис Dadata который служит для стандартизации адресов. Он платный, но есть 10.000 бесплатных запросов в день. Моя задача взять адреса из базы и стандартизировать их. В базе около 80.000 адресов. Для обращения к Dadate я использовал API ( https://github.com/hflabs/dadata-php ) класс взял отсюда ( https://dadata.ru/api/clean/address/ ). Dadata требует 2 ключа для работы через API. Поэтому мы собрали ключи у всех сотрудников нашей фирмы и закинули их в массив ( $key ). Теперь сама суть проблемы. Мне нужно чтобы скрипт в том моменте когда 10.000 запросов кончатся подменял старый ключ на новый и продолжал работу. В том случае если все ключи кончились прекращал свою работу.
Вот код который у меня получился. Он работает, но когда заканчивается 10.000( хотя записывает он только по 3000) скрпит останвливает работу, а не подменяет ключ. Что делать?
$key = dadataKey($file);
$n = 0;
$token = $key[$n]['api'];
$secret = $key[$n]['secret'];

	$dadata = new Dadata($token, $secret);
	$dadata->init();
foreach($itog as $dates){
	$result = $dadata->clean("address", $dates['ADDRESS']);
	
	if($result['error'] != false) {
		if($n <= $maxKey) {
			for($i = $n;$n<=$maxKey;$i++){
				$dadata->close();
				$n++;
				$token = changeToken($key, $n);
				$secret = changeSecret($key, $n);

				$dadata = new Dadata($token, $secret);
				$dadata->init();

				$result = $dadata->clean("address", $dates['ADDRESS']);
		
				if($result['error'] != false){
					continue;	
				} else {
					break;
				}
			}
		}else {
			return;
		}
  • Вопрос задан
  • 332 просмотра
Решения вопроса 1
cr1gger
@cr1gger
Все дороги ведут в Рим — встретимся в Риме!
Во-первых я не вижу в коде где определена переменная $maxKey
Логика должна быть такая:
Есть переменная
$currentKey = 0; // в ней мы указываем индекс текущего ключа из массива

Есть массив с ключами: $keys = [key,key,key];
Есть функция:
function changeKey(){
    $currentKey++;
    if ((count($keys) - 1) > $currentKey)
    {
        // завершаем работу скрипта, ключи кончились
    }
}


И два варианта на твой выбор как будешь определять когда менять ключ:
1. Отлавливать ошибку, что ключ исчерпал дневной лимит и вызывать changeKey();
2. Завести переменную которая будет считать кол-во сделанных запросов. И при достижении 10к запросов вызывать changeKey();

Ключ получать так: $keys[$currentKey];
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы