
Python предоставляет несколько способов взаимодействия с контактами на мобильных устройствах, включая использование стандартных библиотек и сторонних модулей. На Android наиболее популярным инструментом является kivy вместе с plyer, который позволяет получать список контактов с их именами, номерами и адресами электронной почты. Для iOS часто применяется pyobjc, дающий доступ к нативному API AddressBook.
Работа с контактами требует разрешений, поэтому при разработке приложений необходимо учитывать политику безопасности платформ. На Android нужно добавить READ_CONTACTS в манифест и обрабатывать запрос разрешений через ActivityCompat. На iOS доступ к контактам возможен только после явного согласия пользователя, иначе методы возвращают пустой список.
Для быстрого получения данных удобно использовать JSON или SQLite для хранения контактов, что упрощает их фильтрацию и сортировку. Например, можно выбрать контакты по домену электронной почты или по коду страны номера телефона, что позволяет создавать целевые рассылки или интегрировать контакты в CRM-систему.
Кроме того, Python позволяет автоматизировать синхронизацию контактов с внешними сервисами, такими как Google Contacts через API. Это дает возможность обновлять телефонную книгу на нескольких устройствах одновременно и создавать резервные копии в структурированном формате, пригодном для последующей аналитики.
Установка библиотеки для работы с контактами Android

Для доступа к контактам на Android с помощью Python оптимально использовать библиотеку adb совместно с pydroid или pure-python-adb. Установка производится через pip. Выполните в терминале:
pip install pure-python-adb
Для работы требуется активированная отладка по USB на устройстве Android и установленный ADB на компьютере. На Windows ADB скачивается с официального сайта Android SDK Platform Tools, для Linux и macOS доступны пакеты через менеджеры apt или brew.
Проверка соединения с устройством:
adb devices
| Компонент | Назначение | Примечания |
|---|---|---|
| pure-python-adb | Обеспечивает подключение к устройству и выполнение ADB-команд из Python | Работает на Windows, Linux, macOS |
| ADB (Android Debug Bridge) | Связь компьютера с Android | Необходим для синхронизации и выполнения команд |
| Отладка по USB | Разрешает подключение сторонних приложений | Активируется в настройках разработчика Android |
После установки библиотеки и настройки ADB можно использовать Python-скрипты для чтения, добавления и удаления контактов через команды ADB с использованием Content Provider URI content://contacts/.
Подключение телефона через ADB к Python
Для взаимодействия Python с контактами телефона через ADB необходимо сначала установить Android Debug Bridge. На Windows скачайте платформенные инструменты с официального сайта Android, распакуйте их в папку и добавьте путь к adb.exe в системную переменную PATH. На Linux используйте пакетный менеджер: sudo apt install adb. На macOS доступна установка через Homebrew: brew install android-platform-tools.
Подключите телефон через USB, включив режим разработчика и отладку по USB. Выполните команду adb devices для подтверждения подключения; устройство должно отображаться как «device». Для беспроводного подключения используйте adb tcpip 5555 и adb connect IP_устройства:5555.
В Python рекомендуется использовать библиотеку subprocess для выполнения ADB-команд. Например, subprocess.run(["adb", "shell", "content", "query", "--uri", "content://contacts/phones/"]) позволяет получить список контактов. Для больших объёмов данных применяйте чтение через subprocess.Popen с потоковой обработкой stdout, чтобы избежать переполнения памяти.
Для прямой работы с SQLite-базой контактов используйте команду adb pull /data/data/com.android.providers.contacts/databases/contacts2.db ./, после чего открывайте базу с помощью sqlite3 в Python. Учтите, что доступ к системным папкам требует root-права или временного предоставления разрешений через adb shell pm grant.
Рекомендуется проверять версию ADB через adb version и обновлять инструменты, чтобы избежать несовместимости команд. При написании скриптов используйте явные пути и обрабатывайте исключения, чтобы скрипт корректно реагировал на отсутствие подключения или отказ в доступе.
Чтение списка контактов с устройства Android
Пример получения списка контактов с именами и номерами телефонов через pyjnius:
from jnius import autoclass
Context = autoclass('android.content.Context')
PythonActivity = autoclass('org.kivy.android.PythonActivity')
activity = PythonActivity.mActivity
content_resolver = activity.getContentResolver()
ContactsContract = autoclass('android.provider.ContactsContract$Contacts')
Cursor = content_resolver.query(ContactsContract.CONTENT_URI, None, None, None, None)
while Cursor.moveToNext():
name_index = Cursor.getColumnIndex(ContactsContract.DISPLAY_NAME)
contact_name = Cursor.getString(name_index)
print(contact_name)
Cursor.close()
Для получения телефонных номеров требуется дополнительный запрос к ContactsContract.CommonDataKinds.Phone.CONTENT_URI, используя CONTACT_ID каждого контакта. Это гарантирует корректное сопоставление нескольких номеров одному контакту.
Необходимо обеспечить разрешение READ_CONTACTS в AndroidManifest.xml и динамическое запрашивание через requestPermissions на Android 6.0 и выше, иначе доступ к данным будет невозможен.
Для обработки большого числа контактов рекомендуется использовать потоковую обработку курсора, чтобы снизить нагрузку на память и избежать зависаний интерфейса.
Дополнительно можно фильтровать контакты по наличию номера или электронной почты, используя параметры selection и selectionArgs в методе query, что ускоряет выборку и уменьшает объем обрабатываемых данных.
Экспорт контактов в CSV с помощью Python

Для извлечения контактов с телефона и сохранения их в формате CSV оптимально использовать библиотеку pandas совместно с csv или напрямую работать с vobject для парсинга vCard-файлов. Ниже приведён рабочий пример.
1. Чтение контактов из файла vCard:
import vobject
contacts = []
with open('contacts.vcf', 'r', encoding='utf-8') as f:
for vcard in vobject.readComponents(f):
contact = {
'Имя': vcard.fn.value if hasattr(vcard, 'fn') else '',
'Телефон': vcard.tel.value if hasattr(vcard, 'tel') else '',
'Email': vcard.email.value if hasattr(vcard, 'email') else ''
}
contacts.append(contact)
2. Сохранение контактов в CSV с использованием pandas:
import pandas as pd
df = pd.DataFrame(contacts)
df.to_csv('contacts.csv', index=False, encoding='utf-8-sig')
3. Рекомендации при экспорте:
- Использовать
utf-8-sig, чтобы CSV корректно открывался в Excel. - Проверять наличие полей
telиemailдля предотвращения ошибок. - Для большого объёма контактов лучше использовать чтение файла построчно, чтобы не загружать всю vCard в память.
- Если контакты хранятся в Google Contacts, можно использовать API Google People API с библиотекой
google-api-python-clientдля прямого экспорта в CSV.
4. Советы по структуре CSV:
- Использовать заголовки:
Имя,Телефон,Email,ОрганизацияиДолжностьдля удобства импорта в почтовые клиенты. - Удалять дубликаты перед сохранением с помощью
df.drop_duplicates(subset=['Телефон']). - Для международных номеров нормализовать формат с
+код_страны.
Такой подход позволяет быстро формировать CSV-файл, совместимый с любыми приложениями для работы с контактами. Экспорт становится повторяемым и легко автоматизируемым в скриптах Python.
Фильтрация контактов по имени и номеру

Для выборки контактов по имени используйте метод сравнения строк с учетом регистра или без него. В Python это удобно реализовать через условие с оператором `in` или `startswith`. Например, для поиска всех контактов, где имя содержит «Иван»:
filtered_contacts = [c for c in contacts if "Иван".lower() in c["name"].lower()]
Для фильтрации по номеру применяется проверка вхождения подстроки. Чтобы найти контакты с кодом города «+7 495»:
filtered_contacts = [c for c in contacts if "+7 495" in c["phone"]]
Для комбинированной фильтрации по имени и номеру можно использовать логический оператор `and`. Например, контакты с именем «Мария» и номером, содержащим «999»:
filtered_contacts = [c for c in contacts if "Мария".lower() in c["name"].lower() and "999" in c["phone"]]
Если база контактов большая, эффективнее применять фильтрацию с использованием генераторов вместо списков, чтобы уменьшить потребление памяти:
filtered_contacts = (c for c in contacts if "Алексей".lower() in c["name"].lower() and c["phone"].startswith("+7"))
При поиске нескольких вариантов имени или номера применяют регулярные выражения с модулем `re`. Пример для поиска всех контактов с именами «Анна» или «Аня»:
import re
pattern = re.compile(r"Анна|Аня", re.IGNORECASE)
filtered_contacts = [c for c in contacts if pattern.search(c["name"])]
Для номеров удобно нормализовать формат, удаляя пробелы, скобки и дефисы перед фильтрацией:
normalized_contacts = [{"name": c["name"], "phone": re.sub(r"[\s()-]", "", c["phone"])} for c in contacts]
Такой подход обеспечивает точность поиска по любым комбинациям символов в номере и имени.
Обновление информации о контактах через скрипт
Для обновления данных контактов в Android можно использовать библиотеку `pyjnius` для взаимодействия с Java API. Основной объект для работы – `ContactsContract`. Чтобы изменить номер телефона, необходимо получить `content://contacts/phones/` через `ContentResolver` и выполнить метод `update()`, передав `ContentValues` с новым номером.
Пример изменения email:
from jnius import autoclass
ContentValues = autoclass('android.content.ContentValues')
resolver = autoclass('org.kivy.android.PythonActivity').mActivity.getContentResolver()
values = ContentValues()
values.put("data1", "new_email@example.com")
resolver.update(uri, values, "contact_id=?", ["123"])
Для массового обновления стоит использовать циклы по списку контактов и фильтры по имени или идентификатору. Изменение нескольких полей за один вызов уменьшает количество операций с базой и ускоряет скрипт.
На iOS прямой доступ через Python ограничен. Можно экспортировать контакты в формате vCard, редактировать поля через библиотеку `vobject` и импортировать обратно. Пример: создание нового объекта `vobject.vCard`, изменение `tel.value` и сохранение в файл для последующего импорта.
Перед обновлением рекомендуется делать резервную копию контактов. Для Android можно использовать `ContactsContract.Contacts.CONTENT_URI` с методом `query()`, сохранив результат в JSON. Это позволит откатить изменения при ошибках.
Оптимальная структура скрипта включает функции: чтение контактов, фильтрацию по критериям, обновление полей и логирование изменений. Для больших списков контактов стоит использовать батч-обновления через `applyBatch()` для уменьшения нагрузки на устройство.
Удаление выбранных контактов с помощью Python

Для удаления контактов сначала необходимо получить их уникальные идентификаторы. В Android это contact_id, в iOS – recordID. Без точного идентификатора удаление невозможно.
В Python удобен модуль pywhatkit для чтения контактов через Google Contacts API или contacts для iOS. Пример работы с Google Contacts:
Шаг 1: Подключение к Google API:
from googleapiclient.discovery import build
service = build('people', 'v1', credentials=creds)
Шаг 2: Получение списка контактов с их ID:
results = service.people().connections().list(
resourceName='people/me',
personFields='names,emailAddresses'
).execute()
connections = results.get('connections', [])
for person in connections:
print(person['resourceName'], person['names'][0]['displayName'])
Шаг 3: Удаление выбранного контакта по ID:
contact_id = 'people/c1234567890' service.people().deleteContact(resourceName=contact_id).execute()
Для массового удаления создайте список ID и используйте цикл. Важно проверять наличие контакта перед удалением, чтобы избежать ошибок.
На iOS через модуль contacts удаление выполняется так:
import contacts
c = contacts.get('John Doe')
if c:
c.delete()
После удаления рекомендуется синхронизировать контакты с облаком, чтобы изменения применились на всех устройствах. Логирование операций помогает отслеживать удалённые контакты и предотвращает случайные удаления.
Автоматизация резервного копирования контактов
Для регулярного резервного копирования контактов с телефона на Python используют стандартные библиотеки и сторонние API. На Android удобно работать через библиотеку adb или contacts, на iOS – через pyicloud.
Примерный алгоритм автоматизации включает следующие шаги:
- Подключение устройства к ПК и проверка доступа к контактам.
- Извлечение списка контактов в формате JSON или CSV.
- Сохранение файла в локальную папку или на облачный сервис (Google Drive, Dropbox, OneDrive).
- Регулярное выполнение скрипта через планировщик задач (
cronна Linux/Mac или Планировщик заданий Windows).
Рекомендации по реализации:
- Использовать уникальные идентификаторы контактов для предотвращения дублирования при повторных сохранениях.
- Сохранять резервные копии с временной меткой:
contacts_YYYYMMDD_HHMM.json. - Шифровать файлы резервных копий, если они содержат чувствительные данные.
- При работе с облачными сервисами применять официальные API и токены доступа, избегая сохранения паролей в коде.
- Тестировать восстановление из резервной копии для проверки корректности экспорта и импорта контактов.
Пример простого кода на Python для извлечения контактов с Android через adb:
import subprocess
import json
result = subprocess.run(['adb', 'shell', 'content', 'query', '--uri', 'content://contacts/phones/'], capture_output=True, text=True)
contacts = [line.split(',') for line in result.stdout.strip().split('\n')]
with open('contacts_backup.json', 'w', encoding='utf-8') as f:
json.dump(contacts, f, ensure_ascii=False, indent=2)
Автоматизация с таким подходом позволяет ежедневно создавать актуальные копии контактов без ручного вмешательства, обеспечивая сохранность данных при смене устройства или сбое системы.
Вопрос-ответ:
Как получить список контактов с телефона через Python?
Для доступа к контактам чаще всего используют библиотеки, которые умеют взаимодействовать с базой данных телефона или API. На Android, например, можно использовать библиотеку `kivy` вместе с модулем `pyjnius`, чтобы обращаться к системному провайдеру контактов. Основная идея — подключиться к источнику контактов, запросить нужные поля (имя, номер телефона, email) и обработать их в Python. Важно учитывать разрешения, так как без них доступ будет невозможен.
Можно ли редактировать контакты телефона через Python?
Да, это возможно, но сложнее, чем просто чтение. На Android для этого можно использовать `pyjnius` или `adb`-команды, чтобы отправлять изменения в системный провайдер контактов. Обычно процесс включает идентификацию нужного контакта по уникальному ID и изменение его полей. На iOS прямой доступ через Python ограничен, чаще используют синхронизацию с iCloud через API.
Нужны ли особые разрешения для доступа к контактам через Python?
Да, без разрешений получить список контактов нельзя. На Android приложения должны запрашивать разрешение `READ_CONTACTS` для чтения и `WRITE_CONTACTS` для записи. Эти разрешения указываются в манифесте приложения, а в новых версиях Android их нужно дополнительно запросить у пользователя во время работы приложения. На iOS подобные действия требуют авторизации через системные API или доступ к iCloud.
Какие библиотеки Python подходят для работы с контактами?
Для Android используют `kivy` + `pyjnius` или `adb` для удалённого взаимодействия. Можно также применять `contacts` в KivyMD для упрощённого интерфейса. На десктопе для синхронизации с телефонами часто используют `pyicloud` для iCloud или `google-api-python-client` для доступа к контактам Google через API. Выбор зависит от того, где находятся контакты и нужен ли прямой доступ с устройства или через облако.
Как безопасно хранить и использовать полученные контакты в Python?
После получения данных контактов их лучше хранить в защищённом формате. Можно использовать зашифрованные базы данных, например SQLite с шифрованием, или хранить данные в JSON с последующим шифрованием через библиотеки вроде `cryptography`. Также важно ограничивать доступ к скриптам и файлам, чтобы данные не могли быть случайно прочитаны другими приложениями или пользователями.
Как получить список контактов с телефона на Python без установки сторонних приложений?
Для доступа к контактам на Android можно использовать библиотеку `adb` и Python. С помощью команды `adb shell content query —uri content://contacts/phones/` можно вывести список всех контактов в терминал. После этого данные можно обработать в Python: разделить строки, извлечь имя и номер, сохранить в словарь или файл. Такой подход работает без установки дополнительных приложений на телефон, но требует включенного режима отладки USB.
Можно ли изменить контакт в телефоне через Python и как это сделать?
Да, изменение контактов возможно через `adb` или через скрипт на Python, использующий Android API. С помощью команды `adb shell content update —uri content://contacts/phones/ —bind display_name:s:НовоеИмя —where «contact_id=1″` можно изменить имя контакта с определённым ID. В Python команды `subprocess` позволяют отправлять эти команды на телефон. Важно правильно указать идентификатор контакта и формат данных, иначе изменения не будут применены.
