코딩 연습/코딩배우기

파이썬 pyshorteners 라이브러리로 단축 URL(단축 링크) 만들기

good4me 2022. 2. 16. 19:35

유튜브 영상 주소(URL), 쿠팡 파트너스 등 제휴 마케팅 사이트의 긴 주소(URL)를 네이버 블로그, SNS, 이메일, 문자메시지 등에 삽입할 수 있도록 파이썬 pyshorteners 라이브러리 활용하여 단축 URL을 만드는 방법을 설명하려고 한다.

 

 

파이썬 라이브러리로 단축 URL 만들어보기

네이버 블로그, SNS 등에 쿠팡 파트너스 등의 제휴 마케팅 사이트 주소(광고 배너 링크나 키워드 링크 URL 등)를 넣으면 검색에서 불이익을 받는 경우가 있다고 하여 긴 URL을 짧게 만드는 단축 URL을 많이 사용한다.

그런데, 단축 URL을 사용할 때 주의해야 할 점이 있다.

한 번 사용하고 버릴 단축 URL이라면 상관없지만, 중요한 사이트이거나 계속해서 사용할 경우에는 이름이 있거나 오랜 기간 서비스를 하고 있는 단축 URL 사이트를 사용해야 한다.

파이썬에서는 단축 URL 서비스를 하는 여러 사이트에 대해 라이브러리(패키지) 형태로 제공하고 있는데, 이를 사용하면 해당 사이트에 접속하지 않고도 쉽게 단축 URL을 생성하여 사용할 수 있다.  

다만, 제공하는 사이트가 한국이 아니라는 점과 API_KEY를 받고 이를 이용해야만 서비스를 이용할 수 있는 사이트가 있다는 단점은 있다. 그러나 나름 인지도가 있는 사이트이고, 단발성 또는 단기간의 사용을 위해서는 괜찮은 것 같다.

 

파이썬 pyshorteners 라이브러리 관련 웹 사이트(https://pyshorteners.readthedocs.io/en/latest/)를 방문해보면, 이용할 수 있는 단축 URL 사이트로 Adf.ly, Bit.ly, Chilp.it, Clck.ru, Cutt.ly, Da.gd, Git.io, Is.gd, Os.db, Ow.ly, Po.st, Qps.ru, Short.cm, Tiny.cc, TinyURL.com, Git.io, Tiny.cc 등을 제공하고 있다.

 

이 중에서 매개변수로 API_KEY를 받는 것은 임의 사용이 안되기 때문에 제외하고, 임의 사용이 가능한 것만 사용하여 코드를 짜보았다.

 

파이썬 pyshorteners 라이브러리를 활용한 단축 URL 소스 코드

import pyshorteners
import os
import openpyxl
import datetime


def save_urls(title, short_url, link_url):
    # 엑셀 파일 열고 단축 URL 내역 저장하기
    wb = openpyxl.load_workbook('shorten_log.xlsx')
    ws = wb['Sheet']
    maxRow = ws.max_row  # 최대 row
    print(f'maxRow: {maxRow}')

    today = datetime.datetime.today()
    print(today.strftime('%Y-%m-%d'))

    ws.cell(maxRow + 1, 1).value = maxRow
    ws.cell(maxRow + 1, 2).value = today.strftime('%Y-%m-%d')
    ws.cell(maxRow + 1, 3).value = title
    ws.cell(maxRow + 1, 4).value = '=HYPERLINK("{}", "{}")'.format(short_url, short_url)
    ws.cell(maxRow + 1, 5).value = link_url
    ws.cell(maxRow + 1, 6).value = ''
    wb.save('shorten_log.xlsx')
    print(f'"{title}" - 저장완료!')
    wb.close()


def shorten_url(link_url, title):
    # 단축 URL 관리할 엑셀 파일 생성
    if not os.path.exists('shorten_log.xlsx'):
        wb = openpyxl.Workbook()
        ws = wb['Sheet']
        ws.cell(1, 1).value = 'No'
        ws.cell(1, 2).value = '생성 일자'
        ws.cell(1, 3).value = '관리 명칭'
        ws.cell(1, 4).value = '단축 URL'        
        ws.cell(1, 5).value = 'Long URL(단축 대상 URL)'   
        ws.cell(1, 6).value = '비고'   
        wb.save('shorten_log.xlsx')
        wb.close()

    shortener = pyshorteners.Shortener()

    try:            
        short_url = shortener.tinyurl.short(link_url)  # https://tinyurl.com
        if short_url:
            print(short_url)
            save_urls(title, short_url, link_url)
            return        
    except Exception as e:
        print(f'Error: {e}')
        pass

    try:
        short_url = shortener.clckru.short(link_url)  # https://clck.ru
        if short_url:
            print(short_url)
            save_urls(title, short_url, link_url)
            return        
    except Exception as e:
        print(f'Error: {e}')
        pass

    try:
        short_url = shortener.dagd.short(link_url)  # https://da.gd
        if short_url:
            print(short_url)
            save_urls(title, short_url, link_url)
            return        
    except Exception as e:
        print(f'Error: {e}')
        pass

    try:
        short_url = shortener.isgd.short(link_url)  # https://is.gd
        if short_url:
            print(short_url)
            save_urls(title, short_url, link_url)
            return        
    except Exception as e:
        print(f'Error: {e}')
        pass

    try:
        short_url = shortener.osdb.short(link_url)  # http://osdb.link
        if short_url:
            print(short_url)
            save_urls(title, short_url, link_url)
            return        
    except Exception as e:
        print(f'Error: {e}')
        pass

    try:      
        short_url = shortener.chilpit.short(link_url)  # http://chilp.it
        if short_url:
            print(short_url)
            save_urls(title, short_url, link_url)
            return        
    except Exception as e:
        print(f'Error: {e}')
        pass


if __name__ == '__main__':
    link_url = 'https://www.youtube.com/shorts/VFixJ1ldAcg'
    management_title = '케스코 모먼트 동영상'
    shorten_url(link_url, management_title)

사용 방식은 아주 간단하다.

pyshorteners 설치(pip install pyshorteners) 후 import 하고,

Shortener() 클래스를 사용하여 해당 단축 URL 사이트의 short() 메서드의 매개변수에 URL을 넘겨주기만 하면 된다.

이때, 임의 사용이 가능한 사이트가 API_KEY를 받도록 기능이 변경되면 에러가 발생하여 이용할 수 없기 때문에 이를 회피하도록 예외 처리 조건을 주어 에러가 나지 않도록 하였다.

 

good4me.co.kr

 

save_urls() 함수는 생성된 엑셀 파일에 단축 URL 관련 내용을 저장한다.

수 개가 아닌, 수 십 수 백 개가 넘는 단축url을 생성할 때 단축 URL이 어떤 URL인지 관리하기 위해 엑셀 파일을 생성하고 내용을 저장하게 된다.

또한, 단축URL을 엑셀 파일에 저장할 때 파일 내에서 클릭으로 사이트에 접속할 수 있도록 하이퍼링크도 지정되게 했다.

shorten_url() 함수에서는,

맨 위 if 문은 shorten_log.xlsx 파일이 없을 경우, 파일을 만들고 시트(Sheet)에 No, 생성 일자, 관리 명칭, 단축 URL, 단축 대상 URL 등의 컬럼 제목을 붙이게 하고,

임의 사용이 가능한 6개의 사이트(tinyurl.com, clck.ru, da.gd, is.gd, osdb.link, chilp.it)를 이용하여 단축 URL를 생성하도록 하되, 첫 번째 사이트가 에러가 나면 두 번째, 두 번째가 에러 나면 세 번째,... 식으로 단축 URL이 출력되도록 했다.

(첫 번째 사이트에서 에러가 없으면 첫 번째 사이트만 계속 나옴)

 

 

[결과 - VS Code 터미널]

https://tinyurl.com/ydg7m7f6
maxRow: 1
2022-02-16
"서울지역 아파트명, 관리사무소 연락처" - 저장완료!

https://tinyurl.com/yagfergk
maxRow: 2 
2022-02-16
"케스코 베란다 하이샤시 설치" - 저장완료!

https://tinyurl.com/ybt56u4y
maxRow: 3
2022-02-16
"케스코 모먼트 동영상" - 저장완료!

 

 

[결과 - 'shorten_log.xlsx' 엑셀 파일 생성]

엑셀 파일 생성
엑셀 파일 생성

 

[결과 - 저장된 엑셀 파일 내용]

엑셀 파일 내용
엑셀 파일 내용