Linkedin_Automation / Linkedin_post.py
gathnex's picture
Update Linkedin_post.py
ae79df5
raw
history blame contribute delete
No virus
6.4 kB
import re, requests, json, os, openai
from bs4 import BeautifulSoup
from openai import OpenAI
class LinkedinAutomate:
def __init__(self, access_token, medium_url, openai_api):
self.access_token = access_token
self.openai_api = openai_api
#self.yt_url = yt_url
self.medium_url = medium_url
self.python_group_list = []
self.headers = {
'Authorization': f'Bearer {self.access_token}'
}
def get_page_content(self):
response = requests.get(self.medium_url)
soup = BeautifulSoup(response.text, 'html.parser')
for script in soup(["script", "style"]):
script.extract()
text = soup.get_text()
text = '\n'.join(line.strip() for line in text.split('\n'))
text = '\n'.join(line for line in text.split('\n') if line)
return text
def get_title_description(self):
def extract_title_and_description(input_text):
title_pattern = r"Title:(.+?)(?=Description:)"
description_pattern = r"Description:(.+)"
title_match = re.search(title_pattern, input_text, re.DOTALL)
description_match = re.search(description_pattern, input_text, re.DOTALL)
if title_match and description_match:
title = title_match.group(1).strip()
description = description_match.group(1).strip()
return title, description
else:
return None, None
x = self.get_page_content()
client = OpenAI(api_key = self.openai_api)
DEFAULT_SYSTEM_PROMPT = "You are a content title and description generator. Your task is to create compelling and engaging titles for various types of content, such as articles, blogs, videos, and products. Additionally, you are responsible for generating concise and informative descriptions that capture the essence of the content. Focus on creating attention-grabbing titles that pique the interest of the audience and descriptions that provide a clear overview of the content's key points. If additional context is needed, ask for clarification to generate more accurate titles and descriptions. Your goal is to assist users in creating captivating and informative content titles and descriptions."
response = client.chat.completions.create(
model= "gpt-3.5-turbo-0613",
messages=[
{f"role": "system", "content": DEFAULT_SYSTEM_PROMPT},
{f"role": "user", "content": "Content :'" + x + "'. Create one title and description of the content and no other content"},
]
)
mod_output = response.choices[0].message.content
title, description = extract_title_and_description(mod_output)
return title, description
def common_api_call_part(self, feed_type = "feed", group_id = None):
x, y = self.get_title_description()
payload_dict = {
"author": f"urn:li:person:{self.user_id}",
"lifecycleState": "PUBLISHED",
"specificContent": {
"com.linkedin.ugc.ShareContent": {
"shareCommentary": {
"text": y
},
"shareMediaCategory": "ARTICLE",
"media": [
{
"status": "READY",
"description": {
"text": y
},
"originalUrl": self.medium_url,
"title": {
"text": x
},
"thumbnails": [
{
"url": self.extract_medium_thumbnail()
}
]
}
]
}
},
"visibility": {
"com.linkedin.ugc.MemberNetworkVisibility": "PUBLIC" if feed_type == "feed" else "CONTAINER"
}
}
if feed_type == "group":
payload_dict["containerEntity"] = f"urn:li:group:{group_id}"
return json.dumps(payload_dict)
#Extract the thumbnail of youtube video
def extract_thumbnail_url_from_YT_video_url(self):
exp = "^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*"
s = re.findall(exp,self.yt_url)[0][-1]
return f"https://i.ytimg.com/vi/{s}/maxresdefault.jpg"
#Extract the thumbnail of medium blog
def fetch_blog_html(self, url):
response = requests.get(url)
if response.status_code == 200:
return response.text
else:
return None
def extract_medium_thumbnail(self):
def extract_thumbnail_url_from_medium_blog(blog_html):
soup = BeautifulSoup(blog_html, 'html.parser')
thumbnail_meta_tag = soup.find('meta', property='og:image')
if thumbnail_meta_tag:
thumbnail_url = thumbnail_meta_tag['content']
return thumbnail_url
return None
blog_html = self.fetch_blog_html(self.medium_url)
if blog_html:
thumbnail_url = extract_thumbnail_url_from_medium_blog(blog_html)
return thumbnail_url
else:
return None
def get_user_id(self):
url = "https://api.linkedin.com/v2/userinfo"
response = requests.request("GET", url, headers=self.headers)
jsonData = json.loads(response.text)
return jsonData["sub"]
def feed_post(self):
url = "https://api.linkedin.com/v2/ugcPosts"
payload = self.common_api_call_part()
return requests.request("POST", url, headers=self.headers, data=payload)
def group_post(self, group_id):
url = "https://api.linkedin.com/v2/ugcPosts"
payload = self.common_api_call_part(feed_type = "group", group_id=group_id)
return requests.request("POST", url, headers=self.headers, data=payload)
def main_func(self):
self.user_id = self.get_user_id()
#print(self.user_id)
feed_post = self.feed_post()
print(feed_post)
for group_id in self.python_group_list:
print(group_id)
group_post = self.group_post(group_id)
print(group_post)
return str(feed_post)