멜론에서 카카오톡으로 공유하기를 선택하면 다음과 같은 url로 공유되는 것을 알 수 있다.
http://kko.to/dm5PDHW40
그런데 해당 url을 타고 들어가면 url이 바뀌는 것을 확인할 수 있다.
https://www.melon.com/song/detail.htm?songId=30810765&subType=&ref=etc&snsGate=Y
여기서 문제가 생기는데
아래 url은 jsoup을 통한 웹 파싱이 가능한데 위에 간략화된? 변조된 url은 jsoup을 통한 웹파싱이 불가능하다는 것이다.
위의 Url 을 통해 jsoup에 url로 전달하면
다음과 같은 Malformed URL 이라는 에러를 뱉는다.
Malform의 뜻을 검색해보니 기형 이라는 뜻이라 한다. url이 뭐 적절하지 않다라는 의미인 듯하다.
그러면 이제 어떻게 하면 해당 기형 url 을 원래의 url로 변환할 수 있을까
계속 검색을 해보던 중에 url expander 라는 키워드를 찾을 수 있었고, 그와 반대로 원래의 url을 압축하는, 짧게 만들어주는 방법, 웹사이트도 존재했다. 멜론은 이렇게 한번 압축시키고 공유할때 그 url을 던져주는 듯 하다. 그 이유는 잘 모르겠다.
검색을 통해 stackoverflow에서 변환 함수를 찾을 수 있었다. 그리고 그 함수를 이제 여러 패키지에서 사용하기 위해 확장함수의 형태로 변환해보았다.
fun String.expandUrl(): String {
val originUrl = URL(this)
val httpUrlConnection = originUrl.openConnection(Proxy.NO_PROXY) as HttpURLConnection
httpUrlConnection.instanceFollowRedirects = false
val expandedUrl = httpUrlConnection.getHeaderField("Location")
httpUrlConnection.disconnect()
return expandedUrl
}
해당 함수를 통해 원하는 형태의 url로 변환할 수 있었다.
한번 함수를 써봤는데 약간 다른 url이 반환되어 혹시나 하고 한번 더 넣어봤더니 원하는 url을 얻을 수 있었다.
이제 원하는 url을 얻었으니 웹파싱을 할 수 있다!!
PS 참고로 해당 함수를 안스 프로젝트 내에서 Activity 또는 Fragment에서 사용하기 위해선 약간의 변화를 주어야 한다. http 통신을 수행하는 코드이기때문에 MainThread에서 돌릴 수 없다. 코루탄의 Dispatchers.IO 와 같은 스코프를 감싸주어야 한다.