TelegramContract2vCard
jjh4450 • Updated Aug 7, 2023
만들게 된 계기
휴대폰이 갑작스럽게 고장 나게 되면서 내부 데이터에 접근할 수 없게 되었다. 그중 가장 급한 것은 연락처였는데, 복구할 방법이 없다고 생각해 좌절하던 도중 텔레그램과 연동된 연락처가 남아 있다는 것을 깨닫게 되었고 이를 이용할 방법을 모색하였다.
여러 방법이 있음에도 불구하고 파이썬 라이브러리 형태로 프로그램을 제작한 이유는 다음과 같다.
첫째, 복원을 계획할 당시(Telegram Desktop 4.8.10) 텔레그램의 내보내기 형식이 html/JSON 뿐이었다. 연락처로 저장하기 위해서는 vCard 형식이 필요한데, 텔레그램은 이를 지원하지 않았다.
둘째, 연락처가 너무 많았다. 복구할 연락처는 200건 정도로, 필요한 것들을 추리는 것도 상당한 시간이 필요했다.
셋째, 충분히 할만한 도전적인 상황이라는 생각이 들었다. beatifulsoup을 이용해 스크래핑을 해본 경험이 있었고, 스크래핑 기술이 적절하게 적용되는 좋은 상황이었다.
마지막으로, 변환과 관련된 적절한 자료가 없었다. 꼭 연락처 변환이 필요한 상황임에도 불구하고, 찾아본 자료들은
연락처 → 텔레그램
에 관한 자료들이었다. 있다고 해도 더 이상 작동하지 않거나, 민감한 연락처 파일을 인터넷으로 전처리를 해줘야 했다. 적절하지 않은 파일 형식, 자동화가 필요한 데이터양, 그리고 경험을 고려했을 때 파이썬을 통한 자동화가 제일 적절했다. 또한, 적절한 자료를 찾아볼 수 없었기에 혹시 필요한 사람들을 위해 파이썬 라이브러리 형태로 pip에 배포하기로 결정했다.
개발 과정
놀라운 코파일럿의 성능, 그리고 프롬프트 최적화(?)
이 라이브러리를 개발할 당시는 코파일럿을 처음 사용한 지 얼마 되지 않았을 때였다. 타이핑하던 도중 코파일럿이 상당히 적절한 코드를 추천했다. 비록 정확하지는 않았지만 매우 피곤한 스크래핑 과정을 어쩌면 자동화 해줄 거 같다는 생각이 들었다. 그래서 곧바로 필요한 부분을 복사해 문자열 변수로 선언해 넣어 보게 되었다.
crawl_this = """ <겹겹이 쌓인 html 태그들/> """
결과는 놀라웠다. 코파일럿이 정확히 작동하는 코드를 제시한 것이다. 비록 최종 배포 과정에서 수정하게 되었지만, 덕분에 미로를 거꾸로 도착 지점에서 풀듯이 html 구조를 단번에 이해하고 빠르게 스크래핑 코드를 완성할 수 있었다.
몰랐던 텔레그램의 기능
html/json이라 계속 말했지만, 처음에는 내보내기로 html만 알고 있었다. 그러나 텔레그램 내보내기 항목의 형식이 더 있다는 것을 개발 도중 발견했다! 이것은 두 번의 절망을 줬는데, 하나는 내보내기 항목이 늘어난 걸 보고 vCard로의 변환을 기대했으나 없다는 것이었고, 새로 발견한 항목이 처리 하기 매우 쉬운 json이였다는 것이다. 하지만 html 부분은 이미 상당 부분 완성되었고, 기왕 배포하는 거 모든 형식을 지원하자는 마음으로 html/json 형식을 모두 지원하기로 했다.

이름 정하기
단순하지만 중요한, 그리고 스트레스 받는 이름 정하기… 여러 후보를 정했으나 현재의 이름인 TelegramContract2vCard이름이 파이썬 답지 않고 검색에 잘 걸리지 않을 거 같다는 고민이 들었다. 그래서 다양한 후보를 뽑아 커뮤니티에 질문했고, 결과적으로 현재의 이름이 되었다.

만든지 4달쯤 되는 현재, 우려와 달리 검색이 잘된다.
배포, 그리고 시연의 저주(?)
배포는 인터넷의 자료들을 참고해 순조롭게 진행했고, 배포 후 테스트도 잘 되었다. 그래서 배포 이후기쁜 마음으로, 완성을 기념하며 시연을 진행했다. 그러나 멀쩡하던 라이브러리가 오류를 내뱉으며 작동하지 않는 게 아닌가? 원인을 찾아보니 모듈의
__init__.py
를 잘못 작성한 게 원인이었다. 테스트할 때는 __init__.py
를 무의식적 으로 수정 해놓고 수정 파일을 배포하지 않은 것이다.
이를 수정하고 다시 배포하니 정상적으로 작동 하였다.
결론
TelegramContract2vCard 개발에 이르는 계기와 과정을 살펴보았다. 코파일럿에 대한 재미있는 아이디어 덕분에, 빠른 시간 내에 적절한 스크래핑 코드를 작성했고, 위기를 적절히 대처해 라이브러리의 다양성을 확보하였다. 더불어, 이름 선택과 배포 과정에서의 난관을 극복해 보았다. 간단한 프로젝트였음에도 불구하고 많은 경험을 쌓을 기회를 가질 수 있었다.