본문 바로가기
  • True knowledge exists in knowing that you know nothing. -Socrates-
개발

SNS 검색 플젝(Sherlock)을 분석&개발해보자 [0]

by intadd 2019. 9. 19.

 

안녕하세요 오랜만입니다. 

 

최근 매우 흥미로운 프로그램을 찾았습니다. 

Sherlock 이라는 프로그램인데, Username을 입력받아 소셜 네트워크를 검색해주는 기능을 갖고있습니다.

약 161개 SNS 서비스에서 해당 계정이 있는지 판별하여 결과를 보여준다. 

 

https://github.com/sherlock-project/sherlock

 

sherlock-project/sherlock

🔎 Find usernames across social networks. Contribute to sherlock-project/sherlock development by creating an account on GitHub.

github.com

원본 프로젝트입니다. 

 

제가 아는 셜록형님

처음 볼 때도 잘생겨 보였음

 

실제 프로그램 구동 

특정 Username으로 검색

플젝 개요 

첫 번째는 신기해서 분석했고, 두 번째는 좀더 간편하게(내가 쓰기 편하게) 만들어보자고 생각했고,

세 번째는 서비스로 제공하면 어떨까의 순서로 개발하게 되었습니다.

 

 

원본 프로젝트는 배포용이다보니까 사용자가 쓸 기능들, 옵션들을 많이 넣어두었습니다. 예를 들어 프록시기능이라던가

등등 일단 분석한내용을 간략하게 정리해보겠습니다. 

 

위 프로그램 기능 중 SNS 검색 기능의 핵심은 "data.json" 파일 입니다. 

data.json 에는 조회할 SNS Server에서 User 존재 유무를 파악에 필요한 것들이 json 형식으로 저장되어 있습니다.

data.json

1) errorType

특정 URL로 username을 전송했을 때, 응답코드 혹은 에러 메시지 혹은 redirect 유무로 판별하는지

작성되어있습니다.

2) 판단 URL

1)에서 언급했던 특정URL에 해당합니다. Tistory의 경우 {}.tistory.com 가 되고, naver의 경우 blog.naver.com/{}

가 됩니다.  ( .format을 사용하기 때문에 때문에 {}로 표시합니다.)

3) main URL

사용자들이 특정 계정을 찾았을때 판단URL이 아닌 실제 서비스 계정이 출력되는 것을 담고있습니다. 

 

위 3가지 내용을 통해서 아래와 같이 조금 다른 방식으로 cui 프로그램을 개발했습니다.

달라진 내용으로는 python requests 모듈을 사용할 때 쓰레드 형식으로 구현했습니다. (속도를 높이기 위해)

requests timewait 시간도 줄였습니다. 

 

소스코드들도 사용 안하는 것들은 다 제거했고, 기능으로 사용할 코드만 남겼습니다. 

 

https://github.com/intadd/sherlcok_fastsimple

 

intadd/sherlcok_fastsimple

Contribute to intadd/sherlcok_fastsimple development by creating an account on GitHub.

github.com

아마 sherlock 의 전체적인 구조와 기능은 위에 코드를 보시면 이해 할 수 있을 것 같습니다.

 

sherlock 원본 코드 시간 측정
sherlock fast simple 코드 시간 측정 

결과값은 동일하며, 시간 차이만 조금 있습니다. 

 

웹서비스를 통해 제공하기 위해 공부가 필요했습니다.

 

python 언어로 작성된 언어이기 때문에 장고를 선택했습니다.

 

처음 생각했던 내용은 

1. views.py 내에서 thread 를 돌린 후 결과 값을 주는 방식

입니다.

 

위 cui 프로그램 개발에서 약 4초 정도 걸리기 때문에 view에서 돌리고 return 값 list로 해도

충분히 가능하겠다고 판단 했었습니다.

 

개발 해서 직접 사용해봤는데 1,2 번 (1번에 161개의 requests 생성) 돌리고 다시 실행하면

can't start new thread 라는 에러와 함께 서버가 죽어버렸습니다. (정확히 따지면 장고가 죽습니다.)

 

https://stackoverflow.com/questions/1834919/error-cant-start-new-thread

 

error: can't start new thread

I have a site that runs with follow configuration: Django + mod-wsgi + apache In one of user's request, I send another HTTP request to another service, and solve this by httplib library of pytho...

stackoverflow.com

프로그램에서 돌릴 수 있는 최대 thread 수를 초과해서 그렇다고 합니다...

 

view에서는 웬만하면 thread를 직접 돌리지 않는 것으로 교훈을 얻었습니다. 

다른 방식으로도 Thread 돌렸는데도 동일하게 위에서 발생하는 에러가 나오더라구여. 

아무튼 저는 안쓰기로했습니다.

 

해결책을 찾아보다가 

Celery 를 찾아버렸습니다. (분석봇 형님이 알려주심)

 

"셀러리는 분산 메시지 전달에 기반을 둔 오픈 소스 비동기 태스크 큐, 잡 큐이다. 스케줄링을 지원하지만 실시간 운영에 초점을 두고 있다" 라고 합니다. 

 

즉 메시지 브로커를 통해 Celery한테 작업을 위임? 하고 다음 응답 페이지로 사용자를 넘긴다.

이 때 Celery의 id key값들을 list로 반환 하여 응답페이지로 전달하며, 응답 페이지에서는 해당 list를 이용해

ajax로 Key값들을 api로 조회하여 결과값을 비동기 적으로 출력해준다.

 

가 전체적인 프로그램 프로세스입니다.

 

1. 사용자가 intadd 닉네임을 검색(요청)한다.

2. view에서는 메시지 브로커를 통해 Celery를 호출한 후 이에 해당하는 key 값들을 list 형태로 응답페이지 넘긴다.

호출만 한 상태이고 Celery 에서 작업이 이루어질 때에는 비동기 형식으로 이루어지기 때문에 key값만 받는다,

이 때 해당하는 key값들의 작업은 아마 request를 날리고 있거나, 순서를 기다리고 있거나 완료된 상태일 것이다.

--> Celery가 작업하고 있는 것들 :

'data.json'에서 읽어온 request주소에 해당 username을 포멧으로 각각 request를 날린다. 이 후 결과값을 가지고 

User가 존재하는지 아닌지를 판단한다.

3.  응답페이지에서는 list를 이용해서 ajax를 사용하여 api로 key값을 조회한다. 조회가 완료된 key들에 한하여 비동기 형식으로 결과를 출력해준다.

 

메시지 브로커는 redis를 사용했습니다.

 

완성된 WEB Sherlock 

http://intadd11.run.goorm.io 

 

Cover Template for Bootstrap

Home Features Contact Search Social Network Sherlock looks for users on 161 social network sites. It's still beta. I hope you use it well.

intadd11.run.goorm.io

 

메인 페이지

메인 페이지

조회 중

ajax 실행 중 결과값 모두 완료되지 않아, 기다릴때 페이지 화면 
모든 결과값이 확인 된 페이지 

 

매우 재밌게한 플젝이기에 남겨봤습니다.

수행 기간은 약 한달 정도 걸렸습니다. 

감사합니다.

 

 

후기.

 

어디에 사용할 것인가. 

머 어디선가는(누군가) 사용할 것 같습니다. 예를 들어 기업들이나 등등 

닉네임으로 구글링해서 가입 서비스 일일이 찾는 것도 귀찮으니까 ㅎㅎ,, 

 

배운것

1. Celery + redis + 짱고 

 

추후 고칠 점.

data.json 에 기입된 것들 중 완벽하게 기능 조회가 안되는 것들이 있습니다.

유저 없는데도 있다고 나오는,, 아마 사이트들이 페이지를 업데이트 했거나 하는 이유인것 같습니다.

분석해서 고치면 더욱 좋겠지만,, 지금도 만족하기 때문에 ㅎㅎ,, 

 

동아리원에게 기능 리뷰를 부탁했지만, input값으로 피자시킴을 입력해줌
동아리원에게 기능 리뷰를 부탁했는데 SSTI가 입력 되어 있음 
Script 캡처도 보내주셨습니다.

 

 

 

감사합니다.

'개발' 카테고리의 다른 글

Mac iterm2 전체 화면 설정  (0) 2021.02.10
Tor 프록시를 타는 Port Scanner를 만들자. [0]  (0) 2019.07.01
DarkWeb Research [1]  (2) 2019.06.07
DarkWeb Research [0]  (0) 2019.02.10
python 파씽 requests,BeautifulSoup  (1) 2017.09.13

댓글