๐[Python] instagrapi๋?
instagrapi?
ํ์ฌ ์ธ์คํ๊ทธ๋จ์์ ์ ๊ณตํ๋ api๋ Instagram ๊ทธ๋ํ API์ Instagram ๊ธฐ๋ณธ ๋์คํ๋ ์ด API๊ฐ ์กด์ฌํ๋ค.
์ด ์ค, ์ผ๋ฐ ์ฌ์ฉ์
๊ฐ ์ฌ์ฉ๊ฐ๋ฅํ API์ Meta์ ์ฑ๊ณผ ๊ณ์ ์ ๊ฒ์ ๋ฐ ์ธ์ฆ๋ฐ์ ๋น์ฆ๋์ค ๋ฐ ํฌ๋ฆฌ์์ดํฐ ๊ณ์
API๋ก ๋๋์ด์ ธ์๋ค.
์ผ๋ฐ ์ฌ์ฉ์๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ API๋ Instagram ๊ธฐ๋ณธ ๋์คํ๋ ์ด API
์ด๊ณ , ๋น์ฆ๋์ค ๋ฐ ํฌ๋ฆฌ์์ด์ด ๊ณ์ ๋ง ์ฌ์ฉ ๊ฐ๋ฅํ API๋ Instagram ๊ทธ๋ํ API
์ด๋ค.
Instagram ๊ธฐ๋ณธ ๋์คํ๋ ์ด API๋ก๋ ๊ฒ์๋ฌผ์ ์ ๋ณด์ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์ฝ์ด์ค๊ธฐ๋ง
๊ฐ๋ฅํ๋ค.
์ฆ, Instagram ๊ทธ๋ํ API๋ง ์ฌ์ฉ์์ ๊ณ์ ์ ๊ฒ์๋ฌผ์ ์
๋ก๋ํ ์ ์๋ ๊ฒ์ด๋ค.
Instagram ๊ทธ๋ํ API = Instagram ๊ธฐ๋ณธ ๋์คํ๋ ์ด API + ๊ฒ์๋ฌผ ์
๋ก๋ ๊ธฐ๋ฅ ์ ๋๋ก ์๊ณ ์์ผ๋ฉด ๋ ๋ฏ
์ด๋ฐ ๋ถํธํจ์ ํด์ํ๊ณ ์ Python์ ์ฌ์ฉํ๋ ์ธ๊ณ ์ฌ๋ฌ ๊ฐ๋ฐ์๋ค์ด ์ธ์คํ๊ทธ๋จ์ ๊ฒ์๋ฌผ์ ์
๋ก๋ ๋ฐ ๋ค์ด๋ก๋์ ๊ฐ์ ๊ฐ์ข
๊ธฐ๋ฅ์ ๊ตฌํํด๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ด ์กด์ฌํ๋ค.
๊ทธ ์ค ํ๋๊ฐ ๋ฐ๋ก instagrapi
์ด๋ค.
๋ด๊ฐ ์ฌ์ฉํด๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- instagrapi
- instabot
๊ทธ ์ค, instagrapi๊ฐ ๋ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ , ์กฐ๊ธ ๋ ์ฌ์ฉํ๊ธฐ ์ฌ์ ์ด์ instagrapi์ ๋ํด ์์ฑํ๋ค.
instagrapi ๊ณต์ docs
instagrapi๋ ์ธ์คํ๊ทธ๋จ์์ ๊ณต์์ ์ผ๋ก ์ง์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ ๋น๊ณต์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ ์ฃผ์ํ์. (๋ฒ์ ํธํ์ ๋ฌธ์ ๊ฐ ์์ ์๋..)
instagrapi ์ค์น
pip install instagrapi
์ ๋ช ๋ น์ด๋ก ๋จผ์ instagrapi๋ฅผ ์ค์นํ๋ค.
๊ทธ๋ฆฌ๊ณ , ์๋์ ๊ฐ์ด ๋ชจ๋์ import ํด์ฃผ๊ธฐ๋ง ํ๋ฉด๋๋ค.
from instagrapi import Client
client = Client()
๊ทธ๋ฌ๋ฉด ์ฌ์ฉํ ์ค๋น๋ ๋๋ฌ๋ค. ๊ฐ๊ฟ
๊ณ์ ๋ก๊ทธ์ธ
from instagrapi import Client
client = Client()
client.login(username, password)
- username: ์ธ์คํ๊ทธ๋จ์์ ์ฌ์ฉํ๋ ์ฌ์ฉ์ ์์ด๋ - @hellojunho ์์ @๋ฅผ ์ ์ธํ ๋ถ๋ถ
- password: ์ธ์คํ๊ทธ๋จ ๊ณ์ ์ ๋น๋ฐ๋ฒํธ
๊ณ์ ๋ก๊ทธ์์
from instagrapi import Client
client = Client()
client.logout()
๊ฒ์๋ฌผ ์ ๋ก๋
๊ฒ์๋ฌผ์๋ ์ฌ๋ฌ ๊ฒฝ์ฐ๊ฐ ์กด์ฌํ๋ค.
์ด๋ฏธ์ง 1์ฅ, ์ด๋ฏธ์ง 2์ฅ ์ด์, ๋น๋์ค 1์ฅ, ๋น๋์ค 2์ฅ ์ด์, ์ด๋ฏธ์ง 1์ฅ + ๋น๋์ค 1์ฅ ๋ฑโฆ
๊ฐ ๊ฒฝ์ฐ์ ๋ํด ์์ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
์ด๋ฏธ์ง 1์ฅ ์ ๋ก๋
from instagrapi import Client
client = Client()
client.login(username, password)
media_path = "/Users/hellojunho/instagrapi_test/image/media1.jpeg"
caption = "hellojunho์ ์ด๋ฏธ์ง ์
๋ก๋ ์์ 1"
client.photo_upload(media_path, caption)
์ด๋ฏธ์ง๊ฐ 1์ฅ์ธ ๊ฒฝ์ฐ์๋ photo_upload(media_path, caption)
์ ์ฌ์ฉํด์ฃผ๋ฉด ๋๋ค.
์ด๋ฏธ์ง 2์ฅ ์ด์ ์ ๋ก๋
from instagrapi import Client
client = Client()
client.login(username, password)
media_path = ["/Users/hellojunho/instagrapi_test/image/media1.jpeg", ""/Users/hellojunho/instagrapi_test/image/media2.jpeg", ...]
caption = "hellojunho์ ์ด๋ฏธ์ง ์
๋ก๋ ์์ 2"
client.album_upload(media_path, caption)
์ด๋ฏธ์ง๊ฐ 2์ฅ ์ด์์ธ ๊ฒฝ์ฐ์๋ album_upload(media_path, caption)
์ ์ฌ์ฉํ๋ฉด ๋๋ค.
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ media_path
๊ฐ list ๋ก ๋ฐ๋์๋ค๋ ์ ์ด๋ค.
๋น๋์ค 1๊ฐ ์ ๋ก๋
from instagrapi import Client
client = Client()
client.login(username, password)
media_path = "/Users/hellojunho/instagrapi_test/video/media3.mp4"
caption = "hellojunho์ ์ด๋ฏธ์ง ์
๋ก๋ ์์ 3"
client.video_upload(media_path, caption)
๋น๋์ค์ ๊ฒฝ์ฐ์๋ ์ด๋ฏธ์ง 1์ฅ๊ณผ ๋น์ทํ๊ฒ media_path
๊ฐ str์ด๊ณ , video_upload(media_path, caption)
์ ์ฌ์ฉํ๋ฉด ๋๋ค.
๋ง์ฝ ๋น๋์ค ์ ๋ก๋์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค๋ฉด MacOS์ ๊ฒฝ์ฐ์๋
brew install ffmpeg
์ ํด๋ณด๊ธฐโฆ
๋น๋์ค 2๊ฐ ์ด์ ์ ๋ก๋
from instagrapi import Client
client = Client()
client.login(username, password)
media_path = ["/Users/hellojunho/instagrapi_test/video/media3.mp4", "/Users/hellojunho/instagrapi_test/video/media4.mp4", ... ]
caption = "hellojunho์ ์ด๋ฏธ์ง ์
๋ก๋ ์์ 4"
client.album_upload(media_path, caption)
๋น๋์ค ์ฌ๋ฌ ๊ฐ๋ video_upload()
๋์ ์ album_upload(media_path, caption)
์ ์ฌ์ฉํ๋ค.
ํผํฉ ๋ฏธ๋์ด (์ฌ์ง + ๋น๋์ค)
from instagrapi import Client
client = Client()
client.login(username, password)
media_path = ["/Users/hellojunho/instagrapi_test/image/media1.jpeg", "/Users/hellojunho/instagrapi_test/image/media2.jpeg", "/Users/hellojunho/instagrapi_test/video/media3.mp4", "/Users/hellojunho/instagrapi_test/video/media4.mp4", ... ]
caption = "hellojunho์ ์ด๋ฏธ์ง ์
๋ก๋ ์์ 5"
client.album_upload(media_path, caption)
ํผํฉ ๋ฏธ๋์ด์ ๊ฒฝ์ฐ์๋ album_upload(media_path, capion)
์ ์ฌ์ฉํ๋ค.
์ด ๋, ์ฃผ์ํ ์ ์ media_path
๊ฐ list๋ผ๋ ์ ๊ณผ media_path์ ์
๋ ฅ๋ ๋ฏธ๋์ด์ ์์๋๋ก ๊ฒ์๋๋ค๋ ์ ์ด๋ค.
ํ์ฌ ์์์๋ [์ด๋ฏธ์ง1, ์ด๋ฏธ์ง2, ๋น๋์ค1, ๋น๋์ค2]์ ์์ผ๋ก ์ง์ ๋์ด์์ผ๋, ์ธ์คํ๊ทธ๋จ ๊ฒ์๋ฌผ์๋ ์ด ์์์ ๋์ผํ๊ฒ ์
๋ก๋ ๋๋ค๋ ๊ฒ์ด๋ค.
๋ด๊ฐ ์ฌ์ฉํ ์์
๋๋ instagrapi๋ฅผ ๋ถ๋ฌ์ ์ฌ์ฉํ๋ ๋ถ๋ถ์ class๋ก ์ ์ํ๊ณ , ์คํํ python ํ์ผ์์๋ ํจ์๋ก ๊ตฌ๋ถํด์ ๋จ์ ๊ธฐ๋ฅ ๋ณ๋ก ํ ์คํธ๋ฅผ ์งํํ๋ค. ๋ชจ๋ ํ ์คํธ์ ์ฑ๊ณตํ๋ค.
insta_post.py
from instagrapi import Client
import os
from dotenv import load_dotenv
load_dotenv()
class InstaPost():
def __init__(self) -> None:
self.client = Client()
self.isLogined = False
def instaLogin(self, username, password):
try:
self.client.login(username, password)
self.isLogined = True
message = "๋ก๊ทธ์ธ์ ์ฑ๊ณตํ์ต๋๋ค."
print(message)
return "๋ก๊ทธ์ธ์ ์ฑ๊ณตํ์ต๋๋ค."
except Exception as e:
if "We couldn't find an account with the username" in str(e):
print("์์ด๋ ํน์ ๋น๋ฐ๋ฒํธ๋ฅผ ํ์ธํ์ธ์.")
else:
print("๋ก๊ทธ์ธ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค:", e)
def get_profile_image(self):
if self.isLogined:
profile_img = self.client.user_info_by_username(self.client.username).profile_pic_url
return profile_img
# ์ด๋ฏธ์ง ํ ์ฅ ์
๋ก๋
def image_upload_one(self, media_path, caption):
if self.isLogined:
try:
self.client.photo_upload(media_path, caption)
message = "๊ฒ์๋ฌผ ์
๋ก๋๋ฅผ ์๋ฃํ์ต๋๋ค."
return message
except Exception as e:
print("๊ฒ์๋ฌผ ์
๋ก๋ ์ค ๋ฌธ์ ๊ฐ ์๊ฒผ์ต๋๋ค.", e)
else:
message = "๋ก๊ทธ์ธ ๋จผ์ ํด์ฃผ์ธ์."
return message
# ๋น๋์ค ํ ๊ฐ ์
๋ก๋
def video_upload_one(self, media_path, caption):
if self.isLogined:
try:
self.client.video_upload(media_path, caption)
message = "๊ฒ์๋ฌผ ์
๋ก๋๋ฅผ ์๋ฃํ์ต๋๋ค."
return message
except Exception as e:
print("๊ฒ์๋ฌผ ์
๋ก๋ ์ค ๋ฌธ์ ๊ฐ ์๊ฒผ์ต๋๋ค.", e)
else:
message = "๋ก๊ทธ์ธ ๋จผ์ ํด์ฃผ์ธ์."
return message
# ์ฌ๋ฌ ๊ฐ์ ๋ฏธ๋์ด ์
๋ก๋(์ด๋ฏธ์ง ์ฌ๋ฌ ์ฅ, ๋น๋์ค ์ฌ๋ฌ ๊ฐ, ์ฌ์ง + ๋น๋์ค ๋ฑ...)
def album_upload(self, media_path, caption):
if self.isLogined:
try:
self.client.album_upload(media_path, caption)
message = "๊ฒ์๋ฌผ ์
๋ก๋๋ฅผ ์๋ฃํ์ต๋๋ค."
return message
except Exception as e:
print("๊ฒ์๋ฌผ ์
๋ก๋ ์ค ๋ฌธ์ ๊ฐ ์๊ฒผ์ต๋๋ค.", e)
else:
message = "๋ก๊ทธ์ธ ๋จผ์ ํด์ฃผ์ธ์."
return message
# ๋ฏธ๋์ด ํ์ผ์ ๋ถ๋ฌ์ ์ ์ฅ (media_path๊ฐ str์ธ ๊ฒฝ์ฐ)
def save_media(self, media_path):
folder_path = os.path.join(os.path.dirname(__file__), "", "media")
media_name = os.path.basename(media_path)
destination_path = os.path.join(folder_path, media_name)
try:
with open(media_path, "rb") as f_source:
with open(destination_path, "wb") as f_dest:
f_dest.write(f_source.read())
print(f"Media saved to: {destination_path}")
return destination_path
except Exception as e:
print("Error saving media:", e)
def save_media_by_list(self, media_path):
folder_path = os.path.join(os.path.dirname(__file__), "media")
try:
for m_path in media_path:
media_name = os.path.basename(m_path)
destination_path = os.path.join(folder_path, media_name)
with open(m_path, "rb") as f_source:
with open(destination_path, "wb") as f_dest:
f_dest.write(f_source.read())
print(f"Media saved to: {destination_path}")
return folder_path # ์ ์ฅ๋ ํด๋ ๊ฒฝ๋ก๋ฅผ ๋ฐํํ ์๋ ์์ต๋๋ค.
except Exception as e:
print("Error saving media:", e)
insta_post_ex.py
from insta_post import InstaPost
from datetime import datetime
import os
from dotenv import load_dotenv
load_dotenv()
username = os.getenv("INSTAGRAM_USER_ID")
password = os.getenv("INSTAGRAM_USER_PASSWORD")
contents_path = os.getenv("CONTENTS_PATH")
client = InstaPost()
client.instaLogin(username, password)
def photo_upload():
media_filename = "photo1.jpeg"
media_path = contents_path + media_filename
caption = f"ํ์ฌ ์๊ฐ: {datetime.now()}"
if client.isLogined:
try:
saved_media_path = client.save_media(media_path)
except Exception as e:
print("์ด๋ฏธ์ง ์ ์ฅ ์คํจ", e)
else:
print("Login first.")
client.image_upload_one(media_path, caption)
def video_upload():
media_filename = "video1.mp4"
media_path = contents_path + media_filename
caption = f"{datetime.now()} upload test"
if client.isLogined:
try:
saved_media_path = client.save_media(media_path)
except Exception as e:
print("์ด๋ฏธ์ง ์ ์ฅ ์คํจ", e)
else:
print("Login first.")
client.video_upload_one(media_path, caption)
def album_upload():
media_filename = ["video1.mp4", "video2.mp4", "photo1.jpeg", "photo2.jpeg"]
prefix_path = contents_path
media_path = [prefix_path + i for i in media_filename]
caption = f"ํ์ฌ ์๊ฐ: {datetime.now()}"
# print(media_path)
if client.isLogined:
try:
saved_media_path = client.save_media_by_list(media_path)
except Exception as e:
print("์ด๋ฏธ์ง ์ ์ฅ ์คํจ", e)
else:
print("Login first.")
client.album_upload(media_path, caption)
album_upload()
๋๊ธ๋จ๊ธฐ๊ธฐ