Instagram2Fedi/src/main.py

149 lines
4.1 KiB
Python
Raw Normal View History

2021-08-31 14:03:06 +00:00
import os
import sys
import requests
2021-08-31 20:44:43 +00:00
import time
2021-09-01 13:31:33 +00:00
import hashlib
import json
2021-08-31 14:03:06 +00:00
from mastodon import Mastodon
2021-08-31 15:47:21 +00:00
from colorama import Fore, Back, Style
from instaloader import Profile, Instaloader, LatestStamps
2021-08-31 14:03:06 +00:00
2021-08-31 14:45:42 +00:00
id_filename = "/app/already_posted.txt"
with open(id_filename, "a") as f:
f.write("\n")
2021-08-31 14:03:06 +00:00
fetched_user = sys.argv[1]
2021-08-31 20:57:31 +00:00
mastodon_instance = sys.argv[2]
mastodon_token = sys.argv[3]
2021-08-31 14:03:06 +00:00
post_limit = 1
time_interval_sec = 86400
post_interval = 10
using_mastodon = True;
mastodon_carousel_size = 4
2021-08-31 20:35:05 +00:00
print(Fore.GREEN + '🚀 > Connecting to Instagram...')
2021-08-31 15:47:21 +00:00
print(Style.RESET_ALL)
2021-08-31 20:35:05 +00:00
L = Instaloader()
profile = Profile.from_username(L.context, fetched_user)
2021-08-31 14:03:06 +00:00
2021-08-31 18:57:12 +00:00
print(Fore.GREEN + '🚀 > Connecting to Mastodon/Pixelfed...')
2021-08-31 15:47:21 +00:00
print(Style.RESET_ALL)
2021-08-31 14:03:06 +00:00
mastodon = Mastodon(
access_token = mastodon_token,
2021-08-31 20:57:31 +00:00
api_base_url = mastodon_instance
2021-08-31 18:57:12 +00:00
# api_base_url = 'https://pixelfed.tokyo/'
2021-08-31 14:03:06 +00:00
)
2021-08-31 20:35:05 +00:00
def get_image(url):
2021-09-01 04:14:05 +00:00
try:
2021-08-31 20:35:05 +00:00
print(Fore.YELLOW + "🚀 > Downloading Image...", url)
print(Style.RESET_ALL)
2021-08-31 14:03:06 +00:00
response = requests.get(url)
response.raw.decode_content = True
2021-08-31 20:35:05 +00:00
print(Fore.GREEN + "✨ > Downloaded!")
print(Style.RESET_ALL)
return response.content
except:
print(Fore.RED + "💥 > Failed to download image.")
print(Style.RESET_ALL)
2021-08-31 14:03:06 +00:00
2021-09-01 13:31:33 +00:00
2021-08-31 14:03:06 +00:00
def already_posted(id):
with open(id_filename) as file:
content = file.read().split("\n")
sha1 = hashlib.sha1(bytes(id, "utf-8")).hexdigest()
if sha1 in content:
2021-09-01 13:31:33 +00:00
return True
return False
2021-08-31 14:03:06 +00:00
2021-08-31 20:35:05 +00:00
def mark_as_posted(id):
with open(id_filename, 'a') as file:
sha1 = hashlib.sha1(bytes(id, "utf-8")).hexdigest()
file.write(sha1+'\n')
2021-08-31 14:03:06 +00:00
2021-08-31 20:35:05 +00:00
def upload_image_to_mastodon(url):
try:
print(Fore.YELLOW + "🐘 > Uploading Image...")
print(Style.RESET_ALL)
media = mastodon.media_post(media_file = get_image(url), mime_type = "image/jpeg") # sending image to mastodon
print(Fore.GREEN + "✨ > Uploaded!")
print(Style.RESET_ALL)
except:
print(Fore.RED + "💥 > failed to upload image to mastodon")
print(Style.RESET_ALL)
return media["id"]
def toot(urls, title ):
2021-08-31 20:35:05 +00:00
try:
print(Fore.YELLOW + "🐘 > Creating Toot...", title)
print(Style.RESET_ALL)
ids = []
for url in urls:
ids.append(upload_image_to_mastodon(url))
2021-08-31 20:50:06 +00:00
post_text = str(title) + "\n" + "crosposted from https://instagram.com/"+fetched_user # creating post text
print(ids)
mastodon.status_post(post_text, media_ids = ids)
2021-08-31 14:03:06 +00:00
2021-08-31 20:35:05 +00:00
except:
print(Fore.RED + "😿 > Failed to create toot")
print(Style.RESET_ALL)
def none_convert(title):
if title == None:
return ""
else:
return str(title)
def try_to_get_carousel(arr, post):
try:
urls = list(map(lambda arr: arr['node']['display_url'], vars(post)['_node']['edge_sidecar_to_children']['edges']))
return urls
print("Found carousel")
except:
print("No carousel")
return arr
def split_array(arr, size):
count = len(arr) // size + 1
new_arr = []
for i in range(count):
new_arr.append(arr[i*size:(i+1)*mastodon_carousel_size])
return new_arr
2021-08-31 20:35:05 +00:00
posts = profile.get_posts()
2021-08-31 20:44:43 +00:00
def get_new_posts():
2021-08-31 20:50:06 +00:00
stupidcounter = 0
2021-08-31 20:44:43 +00:00
for post in posts:
2021-09-01 04:14:05 +00:00
stupidcounter += 1
url_arr = try_to_get_carousel([post.url], post), mastodon_carousel_size
2021-09-01 13:31:33 +00:00
if stupidcounter <= post_limit:
if already_posted(str(post.mediaid)):
2021-09-01 13:31:33 +00:00
print(Fore.YELLOW + "🐘 > Already Posted ", post.url)
2021-08-31 20:44:43 +00:00
print(Style.RESET_ALL)
continue
2021-09-01 13:31:33 +00:00
print("Posting... ", post.url)
if using_mastodon:
urls_arr = split_array(url_arr)
for urls in urls_arr:
toot(urls, post.caption)
else:
toot(url_arr, post.caption)
mark_as_posted(str(post.mediaid))
time.sleep(post_interval)
2021-08-31 20:44:43 +00:00
else:
2021-09-01 04:14:05 +00:00
return
2021-08-31 20:44:43 +00:00
2021-08-31 20:50:06 +00:00
while True:
2021-08-31 20:44:43 +00:00
get_new_posts()
2021-09-01 04:14:05 +00:00
time.sleep(time_interval_sec)