Skip to content

Commit

Permalink
Make it possible to make link to a post in story [#412] Done
Browse files Browse the repository at this point in the history
  • Loading branch information
adw0rd committed Oct 11, 2021
1 parent 0d2c8ea commit 5c7db25
Show file tree
Hide file tree
Showing 10 changed files with 190 additions and 78 deletions.
14 changes: 6 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,25 +58,23 @@ medias = cl.user_medias(user_id, 20)

```python
from instagrapi import Client
from instagrapi.types import Location, StoryMention, StoryLocation, StoryLink, StoryHashtag
from instagrapi.types import StoryMention, StoryMedia, StoryLink, StoryHashtag

cl = Client()
cl.login(USERNAME, PASSWORD, verification_code="<2FA CODE HERE>")

media_path = cl.video_download(
cl.media_pk_from_url('https://www.instagram.com/p/CGgDsi7JQdS/')
)
media_pk = cl.media_pk_from_url('https://www.instagram.com/p/CGgDsi7JQdS/')
media_path = cl.video_download(media_pk)
adw0rd = cl.user_info_by_username('adw0rd')
loc = cl.location_complete(Location(name='Test', lat=42.0, lng=42.0))
ht = cl.hashtag_info('dhbastards')
hashtag = cl.hashtag_info('dhbastards')

cl.video_upload_to_story(
media_path,
"Credits @adw0rd",
mentions=[StoryMention(user=adw0rd, x=0.49892962, y=0.703125, width=0.8333333333333334, height=0.125)],
locations=[StoryLocation(location=loc, x=0.33, y=0.22, width=0.4, height=0.7)],
links=[StoryLink(webUri='https://github.com/adw0rd/instagrapi')],
hashtags=[StoryHashtag(hashtag=ht, x=0.23, y=0.32, width=0.5, height=0.22)],
hashtags=[StoryHashtag(hashtag=hashtag, x=0.23, y=0.32, width=0.5, height=0.22)],
medias=[StoryMedia(media_pk=media_pk, x=0.5, y=0.5, width=0.6, height=0.8)]
)
```
</details>
Expand Down
16 changes: 7 additions & 9 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,25 +45,23 @@ medias = cl.user_medias(user_id, 20)

``` python
from instagrapi import Client
from instagrapi.types import Location, StoryMention, StoryLocation, StoryLink, StoryHashtag
from instagrapi.types import StoryMention, StoryMedia, StoryLink, StoryHashtag

cl = Client()
cl.login(USERNAME, PASSWORD, verification_code='123456') # with 2FA verification_code
cl.login(USERNAME, PASSWORD, verification_code="<2FA CODE HERE>")

media_path = cl.video_download(
cl.media_pk_from_url('https://www.instagram.com/p/CGgDsi7JQdS/')
)
media_pk = cl.media_pk_from_url('https://www.instagram.com/p/CGgDsi7JQdS/')
media_path = cl.video_download(media_pk)
adw0rd = cl.user_info_by_username('adw0rd')
loc = cl.location_complete(Location(name='Test', lat=42.0, lng=42.0))
ht = cl.hashtag_info('dhbastards')
hashtag = cl.hashtag_info('dhbastards')

cl.video_upload_to_story(
media_path,
"Credits @adw0rd",
mentions=[StoryMention(user=adw0rd, x=0.49892962, y=0.703125, width=0.8333333333333334, height=0.125)],
locations=[StoryLocation(location=loc, x=0.33, y=0.22, width=0.4, height=0.7)],
links=[StoryLink(webUri='https://github.com/adw0rd/instagrapi')],
hashtags=[StoryHashtag(hashtag=ht, x=0.23, y=0.32, width=0.5, height=0.22)],
hashtags=[StoryHashtag(hashtag=hashtag, x=0.23, y=0.32, width=0.5, height=0.22)],
medias=[StoryMedia(media_pk=media_pk, x=0.5, y=0.5, width=0.6, height=0.8)]
)
```

Expand Down
21 changes: 7 additions & 14 deletions docs/usage-guide/story.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,35 +48,27 @@ Common arguments:
| photo_upload_to_story(path: Path, caption: str, upload_id: str, mentions: List[Usertag], locations: List[StoryLocation], links: List[StoryLink], hashtags: List[StoryHashtag], stickers: List[StorySticker], extra_data: Dict[str, str] = {}) | Story | Upload photo (Support JPG files)
| video_upload_to_story(path: Path, caption: str, thumbnail: Path, mentions: List[Usertag], locations: List[StoryLocation], links: List[StoryLink], hashtags: List[StoryHashtag], stickers: List[StorySticker], extra_data: Dict[str, str] = {}) | Story | Upload video (Support MP4 files)

In `extra_data`, you can pass additional media settings, for example:

| Method | Type | Description
| ----------------------------- | ------ | ------------------
| reshared_media_id | String | Link to post (str(media_pk), e.g. "2682056022293521200")

Examples:

``` python
from instagrapi import Client
from instagrapi.types import Location, StoryMention, StoryLocation, StoryLink, StoryHashtag
from instagrapi.types import StoryMention, StoryMedia, StoryLink, StoryHashtag

cl = Client()
cl.login(USERNAME, PASSWORD)

media_pk = cl.media_pk_from_url('https://www.instagram.com/p/CGgDsi7JQdS/')
media_path = cl.video_download(media_pk)
adw0rd = cl.user_info_by_username('adw0rd')
loc = cl.location_complete(Location(name='Test', lat=42.0, lng=42.0))
ht = cl.hashtag_info('dhbastards')
hashtag = cl.hashtag_info('dhbastards')

cl.video_upload_to_story(
media_path,
"Credits @adw0rd",
mentions=[StoryMention(user=adw0rd, x=0.49892962, y=0.703125, width=0.8333333333333334, height=0.125)],
locations=[StoryLocation(location=loc, x=0.33, y=0.22, width=0.4, height=0.7)],
links=[StoryLink(webUri='https://github.com/adw0rd/instagrapi')],
hashtags=[StoryHashtag(hashtag=ht, x=0.23, y=0.32, width=0.5, height=0.22)],
extra_data={"reshared_media_id": str(media_pk)}
hashtags=[StoryHashtag(hashtag=hashtag, x=0.23, y=0.32, width=0.5, height=0.22)],
medias=[StoryMedia(media_pk=media_pk, x=0.5, y=0.5, width=0.6, height=0.8)],
)
```

Expand All @@ -93,7 +85,8 @@ If you want to format your story correctly (correct resolution, user mentions, e
Example:

``` python
from instagrapi.story import StoryBuilder, StoryMention
from instagrapi.types import StoryMention, StoryMedia
from instagrapi.story import StoryBuilder

media_pk = cl.media_pk_from_url('https://www.instagram.com/p/CGgDsi7JQdS/')
media_path = cl.video_download(media_pk)
Expand All @@ -111,7 +104,7 @@ cl.video_upload_to_story(
"Credits @adw0rd",
mentions=buildout.mentions,
links=[StoryLink(webUri='https://github.com/adw0rd/instagrapi')],
extra_data={"reshared_media_id": str(media_pk)}
medias=[StoryMedia(media_pk=media_pk)]
)
```

Expand Down
29 changes: 21 additions & 8 deletions instagrapi/extractors.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
Resource,
Story,
StoryLink,
StoryMedia,
StoryMention,
User,
UserShort,
Expand Down Expand Up @@ -305,7 +306,7 @@ def extract_story_v1(data):
story["video_versions"], key=lambda o: o["height"] * o["width"]
)[-1]["url"]
if story["media_type"] == 2 and not story.get("product_type"):
story["product_type"] = "feed"
story["product_type"] = "story"
if "image_versions2" in story:
story["thumbnail_url"] = sorted(
story["image_versions2"]["candidates"],
Expand All @@ -317,6 +318,12 @@ def extract_story_v1(data):
story["locations"] = []
story["hashtags"] = []
story["stickers"] = []
feed_medias = []
story_feed_medias = data.get('story_feed_media') or []
for feed_media in story_feed_medias:
feed_media["media_pk"] = int(feed_media["media_id"])
feed_medias.append(StoryMedia(**feed_media))
story["medias"] = feed_medias
story["links"] = []
for cta in story.get("story_cta", []):
for link in cta.get("links", []):
Expand All @@ -333,15 +340,21 @@ def extract_story_gql(data):
story["video_url"] = sorted(
story["video_resources"], key=lambda o: o["config_height"] * o["config_width"]
)[-1]["src"]
# if story["tappable_objects"] and "GraphTappableFeedMedia" in [x["__typename"] for x in story["tappable_objects"]]:
story["product_type"] = "feed"
story["product_type"] = "story"
story["thumbnail_url"] = story.get("display_url")
story["mentions"] = []
for mention in story.get("tappable_objects", []):
if mention["__typename"] == "GraphTappableMention":
mention["id"] = 1
mention["user"] = extract_user_short(mention)
story["mentions"].append(StoryMention(**mention))
story["medias"] = []
for item in story.get("tappable_objects", []):
if item["__typename"] == "GraphTappableMention":
item["id"] = 1
item["user"] = extract_user_short(item)
story["mentions"].append(StoryMention(**item))
if item["__typename"] == "GraphTappableFeedMedia":
media = item.get("media")
if media:
item["media_pk"] = int(media["id"])
item["media_code"] = media["shortcode"]
story["medias"].append(StoryMedia(**item))
story["locations"] = []
story["hashtags"] = []
story["stickers"] = []
Expand Down
32 changes: 32 additions & 0 deletions instagrapi/mixins/photo.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
StoryHashtag,
StoryLink,
StoryLocation,
StoryMedia,
StoryMention,
StorySticker,
Usertag,
Expand Down Expand Up @@ -297,6 +298,7 @@ def photo_upload_to_story(
links: List[StoryLink] = [],
hashtags: List[StoryHashtag] = [],
stickers: List[StorySticker] = [],
medias: List[StoryMedia] = [],
extra_data: Dict[str, str] = {},
) -> Story:
"""
Expand All @@ -320,6 +322,8 @@ def photo_upload_to_story(
List of hashtags to be tagged on this upload, default is empty list.
stickers: List[StorySticker], optional
List of stickers to be tagged on this upload, default is empty list.
medias: List[StoryMedia], optional
List of medias to be tagged on this upload, default is empty list.
extra_data: Dict[str, str], optional
Dict of extra data, if you need to add your params, like {"share_to_facebook": 1}.
Expand All @@ -343,6 +347,7 @@ def photo_upload_to_story(
links,
hashtags,
stickers,
medias,
extra_data=extra_data
):
media = self.last_json.get("media")
Expand All @@ -353,6 +358,7 @@ def photo_upload_to_story(
hashtags=hashtags,
locations=locations,
stickers=stickers,
medias=medias,
**extract_media_v1(media).dict()
)
raise PhotoConfigureStoryError(
Expand All @@ -370,6 +376,7 @@ def photo_configure_to_story(
links: List[StoryLink] = [],
hashtags: List[StoryHashtag] = [],
stickers: List[StorySticker] = [],
medias: List[StoryMedia] = [],
extra_data: Dict[str, str] = {},
) -> Dict:
"""
Expand All @@ -395,6 +402,8 @@ def photo_configure_to_story(
List of hashtags to be tagged on this upload, default is empty list.
stickers: List[StorySticker], optional
List of stickers to be tagged on this upload, default is empty list.
medias: List[StoryMedia], optional
List of medias to be tagged on this upload, default is empty list.
extra_data: Dict[str, str], optional
Dict of extra data, if you need to add your params, like {"share_to_facebook": 1}.
Expand Down Expand Up @@ -507,6 +516,29 @@ def photo_configure_to_story(
story_sticker_ids.append(str_id)
if sticker.type == "gif":
data["has_animated_sticker"] = "1"
if medias:
for feed_media in medias:
assert feed_media.media_pk, 'Required StoryMedia.media_pk'
# if not feed_media.user_id:
# user = self.media_user(feed_media.media_pk)
# feed_media.user_id = user.pk
item = {
'x': feed_media.x,
'y': feed_media.y,
'z': feed_media.z,
'width': feed_media.width,
'height': feed_media.height,
'rotation': feed_media.rotation,
'type': 'feed_media',
'media_id': str(feed_media.media_pk),
'media_owner_id': str(feed_media.user_id or ""),
'product_type': 'feed',
'is_sticker': True,
'tap_state': 0,
'tap_state_str_id': 'feed_post_sticker_square'
}
tap_models.append(item)
data["reshared_media_id"] = str(feed_media.media_pk)
data["tap_models"] = dumps(tap_models)
data["static_models"] = dumps(static_models)
data["story_sticker_ids"] = dumps(story_sticker_ids)
Expand Down
15 changes: 9 additions & 6 deletions instagrapi/mixins/story.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,13 +110,16 @@ def story_delete(self, story_pk: int) -> bool:
self._stories_cache.pop(self.media_pk(media_id), None)
return self.media_delete(media_id)

def users_stories_gql(self, user_ids: List[int]) -> List[UserShort]:
def users_stories_gql(self, user_ids: List[int], amount: int = 0) -> List[UserShort]:
"""
Get a user's stories (Public API)
Parameters
----------
user_ids: List[int]
List of users
amount: int
Max amount of stories
Returns
-------
Expand All @@ -141,10 +144,10 @@ def _userid_chunks():
users = []
for media in stories_un['reels_media']:
user = extract_user_short(media['owner'])
user.stories = [
extract_story_gql(m)
for m in media['items']
]
items = media['items']
if amount:
items = items[:amount]
user.stories = [extract_story_gql(m) for m in items]
users.append(user)
return users

Expand All @@ -163,7 +166,7 @@ def user_stories_gql(self, user_id: int, amount: int = None) -> List[UserShort]:
List[UserShort]
A list of objects of UserShort for each user_id
"""
user = self.users_stories_gql([user_id])[0]
user = self.users_stories_gql([user_id], amount=amount)[0]
stories = deepcopy(user.stories)
if amount:
stories = stories[:amount]
Expand Down
Loading

0 comments on commit 5c7db25

Please sign in to comment.