Skip to content

Instantly share code, notes, and snippets.

@nalgeon
Last active Jun 20, 2022
Embed
What would you like to do?
Определить ИНН по паспортным данным человека

Определить ИНН по паспортным данным человека

В поддержку «Дадаты» часто обращаются с вопросом «как получить ИНН по паспортным данным». Налоговая служба предоставляет такой сервис, но без API.

В интернете есть несколько сайтов, которые предоставляют сервис «узнать ИНН» через API. Насколько нам известно, все они используют «неофициальный» интерфейс взаимодействия с налоговой, потому что ни официального API, ни открытых данных по ИНН не существует.

Мы в «Дадате» не хотим подключать неофициальное API налоговой: оно не отличается стабильностью работы и имеет непонятные перспективы. Если вы очень хотите получать ИНН через API — вызывайте API налоговой напрямую. Мы подготовили примеры, как это сделать на самых популярных языках — Python, PHP и JavaScript.

API налоговой бесплатное, но используете его вы на свой страх и риск. Никто не гарантирует, что оно будет работать корректно и стабильно.

Пример ответа API налоговой, если ИНН найден:

{'inn': 'xxxxxxxxxxxx', 'captchaRequired': False, 'code': 1}

Ответ API, если ИНН не найден:

{'captchaRequired': False, 'code': 0}

Примеры вызова на JS, PHP и Python — ниже.

const fetch = require("node-fetch");
function suggestInn(
surname,
name,
patronymic,
birthdate,
doctype,
docnumber,
docdate
) {
const url = "https://service.nalog.ru/inn-proc.do";
const data = {
fam: surname,
nam: name,
otch: patronymic,
bdate: birthdate,
bplace: "",
doctype: doctype,
docno: docnumber,
docdt: docdate,
c: "innMy",
captcha: "",
captchaToken: ""
};
const encoded = encode(data);
resp = fetch(url, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: encoded
});
return resp;
}
function encode(data) {
encoded = Object.keys(data)
.map(
key => encodeURIComponent(key) + "=" + encodeURIComponent(data[key])
)
.join("&");
return encoded;
}
suggestInn(
"Иванов",
"Сергей",
"Владимирович",
"16.03.1982",
"21",
"45 12 229333",
"03.09.2012"
)
.then(response => {
return response.json();
})
.then(response => {
console.log(response);
});
<?php
function suggestInn($surname, $name, $patronymic, $birthdate, $doctype, $docnumber, $docdate)
{
$url = "https://service.nalog.ru/inn-proc.do";
$data = array(
"fam" => $surname,
"nam" => $name,
"otch" => $patronymic,
"bdate" => $birthdate,
"bplace" => "",
"doctype" => $doctype,
"docno" => $docnumber,
"docdt" => $docdate,
"c" => "innMy",
"captcha" => "",
"captchaToken" => ""
);
$options = array(
'http' => array(
'method' => 'POST',
'header' => array(
'Content-type: application/x-www-form-urlencoded',
),
'content' => http_build_query($data)
),
);
$context = stream_context_create($options);
$result = file_get_contents($url, false, $context);
return $result;
}
$resp = suggestInn("Иванов", "Сергей", "Владимирович", "16.03.1982", "21", "45 12 229333", "03.09.2012");
print_r($resp);
import requests
from enum import Enum
class DocumentType(Enum):
# Паспорт гражданина СССР
passport_ussr = "01"
# Свидетельство о рождении
birth_certificate = "03"
# Паспорт иностранного гражданина
passport_foreign = "10"
# Вид на жительство в России
residence_permit = "12"
# Разрешение на временное проживание в России
residence_permit_temp = "15"
# Свидетельство о предоставлении временного убежища на территории России
asylum_certificate_temp = "19"
# Паспорт гражданина России
passport_russia = "21"
# Свидетельство о рождении, выданное уполномоченным органом иностранного государства
birth_certificate_foreign = "23"
# Вид на жительство иностранного гражданина
residence_permit_foreign = "62"
def suggest_inn(surname, name, patronymic, birthdate, doctype, docnumber, docdate):
url = "https://service.nalog.ru/inn-proc.do"
data = {
"fam": surname,
"nam": name,
"otch": patronymic,
"bdate": birthdate,
"bplace": "",
"doctype": doctype,
"docno": docnumber,
"docdt": docdate,
"c": "innMy",
"captcha": "",
"captchaToken": "",
}
resp = requests.post(url=url, data=data)
resp.raise_for_status()
return resp.json()
if __name__ == "__main__":
response = suggest_inn(
surname="Иванов",
name="Сергей",
patronymic="Владимирович",
birthdate="16.03.1982",
doctype=DocumentType.passport_russia.value,
docnumber="45 12 229333",
docdate="03.09.2012",
)
print(response)
@z7FooN
Copy link

z7FooN commented Jan 26, 2022

Здравствуйте. Скрипт перестал работать... (

@Ichinya
Copy link

Ichinya commented Mar 3, 2022

Здравствуйте. Скрипт перестал работать... (

На php работает, главное передавать данные, как в примере. Форматы паспорта и дат должны совпадать

@Vlasenkoip
Copy link

Vlasenkoip commented Jun 6, 2022

На пост запросы с некорректными данными получаю 400, с корректными CORS

@Ichinya
Copy link

Ichinya commented Jun 7, 2022

На пост запросы с некорректными данными получаю 400, с корректными CORS

Я проверил, скрипт работает. Проверял php.

@Avryanta
Copy link

Avryanta commented Jun 8, 2022

Спасибо! Обращаюсь HTTP-запросом из 1С - прекрасно работает.

@hyxp3r
Copy link

hyxp3r commented Jun 19, 2022

Всем привет! Проверяю на Python, по какой-то причине не находит некоторых людей, возврат {'captchaRequired': False, 'code': 0}
Руками проверяю, ИНН находит

@Ichinya
Copy link

Ichinya commented Jun 20, 2022

Всем привет! Проверяю на Python, по какой-то причине не находит некоторых людей, возврат {'captchaRequired': False, 'code': 0} Руками проверяю, ИНН находит

Тоже заметил. Причем выполняешь запрос, не нашел ИНН, но если выполнить позже то может найти. Я думаю, что ошибки могут быть из-за большой нагрузки на их сервер.

@hyxp3r
Copy link

hyxp3r commented Jun 20, 2022

Всем привет! Проверяю на Python, по какой-то причине не находит некоторых людей, возврат {'captchaRequired': False, 'code': 0} Руками проверяю, ИНН находит

Тоже заметил. Причем выполняешь запрос, не нашел ИНН, но если выполнить позже то может найти. Я думаю, что ошибки могут быть из-за большой нагрузки на их сервер.

Я поразбирался, у них поменялась схема запросов. Прилагаю свой код, Python

def check_inn(surname, name, patronymic, birthdate, doctype, docnumber, docdate):
    urlDo = "https://service.nalog.ru/inn-new-proc.do"
    urlJson = "https://service.nalog.ru/inn-new-proc.json"

    dataDo = {
        "c": "find",
        "captcha": "",
        "captchaToken": "",
        "fam": surname,
        "nam": name,
        "otch": patronymic,
        "bdate": birthdate,
        "doctype": doctype,
        "docno": docnumber,
        "docdt": docdate,
    }
    
    resp = requests.post(url=urlJson, data=dataDo).json()
    resp = resp['requestId']

    dataJson = {
        "c": "get",
        "requestId": resp, 
    }
    time.sleep(1)
    resp = requests.post(url=urlDo, data=dataJson).json()
    return resp

Я закинул обращение к функции в цикл, используя try, раз 5 пробую передать запрос, иногда нужно 3-4 попытки)
Иногда по новой схеме запросов не находит ИНН, а по старой (как тут прикрепил автор) находит. Тогда после 5 попыток в except закидываю вызов старого запроса

def check_inn_old(surname, name, patronymic, birthdate, doctype, docnumber, docdate):

    urlDo = "https://service.nalog.ru/inn-proc.do"
    data = {
        "fam": surname,
        "nam": name,
        "otch": patronymic,
        "bdate": birthdate,
        "bplace": "",
        "doctype": doctype,
        "docno": docnumber,
        "docdt": docdate,
        "c": "innMy",
        "captcha": "",
        "captchaToken": "",
    }
    resp = requests.post(url=urlDo, data=data)
    return resp.json()
def main():
    dfINN = pd.DataFrame(columns=['personalNumber','surname', 'name', 'patronymic', 'birthday', 'docnumber', 'docdate', 'INN'])
    dict, countRow = getSql()
    i = 0
    k = 0
    
    
    while i < countRow:
        try:
            response = check_inn(
            surname = dict['surname'][i],
            name = dict['name'][i],
            patronymic = dict['patronymic'][i],
            birthdate = dict['birthdate'][i],
            doctype = '21',
            docnumber = dict['docnumber'][i],
            docdate = dict['docdate'][i],
            )
            dfINN.loc[len(dfINN.index)] = [dict['personalNumber'][i], dict['surname'][i], dict['name'][i], dict['patronymic'][i], dict['birthdate'][i],
                dict['docnumber'][i], dict['docdate'][i], response['inn']] 
            print(f'Done {i}')
            k = 0
            i += 1
        except:
            k += 1
            print(f'Try again k={k}')
            if k > 5:
                try:
                    response = check_inn_old(
                    surname = dict['surname'][i],
                    name = dict['name'][i],
                    patronymic = dict['patronymic'][i],
                    birthdate = dict['birthdate'][i],
                    doctype = '21',
                    docnumber = dict['docnumber'][i],
                    docdate = dict['docdate'][i],
                    )
                    dfINN.loc[len(dfINN.index)] = [dict['personalNumber'][i], dict['surname'][i], dict['name'][i], dict['patronymic'][i], dict['birthdate'][i],
                    dict['docnumber'][i], dict['docdate'][i], response['inn']] 
                    print(f'Done old {i}')
                    i += 1
                except:
                    dfINN.loc[len(dfINN.index)] = [dict['personalNumber'][i], dict['surname'][i], dict['name'][i], dict['patronymic'][i], dict['birthdate'][i],
                    dict['docnumber'][i], dict['docdate'][i], 'Not found']  
                    i += 1  
        time.sleep(10)

Как-то так )

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment