Get long feed for current tag
// ==UserScript== // @name Medium Get Long Feed // @namespace http://tampermonkey.net/ // @version 5.2.0 // @description Get long feed for current tag // @author Thomas Theiner // @match https://medium.com/?tag=* // @match https://medium.com // @icon https://www.google.com/s2/favicons?sz=64&domain=medium.com // @license MIT // ==/UserScript== async function makeOutputPossible(delay = 0) { return new Promise(resolve => { setTimeout(resolve, delay); }); } async function fetchFeed(nextPaging, tag) { let bodyData = [ { "operationName": "WebInlineTopicFeedQuery", "variables": { "tagSlug": tag, "paging": nextPaging, "skipCache": false }, "query": "query WebInlineTopicFeedQuery($tagSlug: String!, $paging: PagingOptions!, $skipCache: Boolean) {\n personalisedTagFeed(tagSlug: $tagSlug, paging: $paging, skipCache: $skipCache) {\n items {\n ... on TagFeedItem {\n feedId\n reason\n moduleSourceEncoding\n post {\n ...PostPreview_post\n __typename\n }\n __typename\n }\n __typename\n }\n pagingInfo {\n next {\n source\n limit\n from\n to\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment PostPreview_post on Post {\n id\n creator {\n ...PostPreview_user\n __typename\n id\n }\n collection {\n ...CardByline_collection\n ...ExpandablePostByline_collection\n __typename\n id\n }\n ...InteractivePostBody_postPreview\n firstPublishedAt\n isLocked\n isSeries\n latestPublishedAt\n inResponseToCatalogR###lt {\n __typename\n }\n pinnedAt\n pinnedByCreatorAt\n previewImage {\n id\n focusPercentX\n focusPercentY\n __typename\n }\n readingTime\n sequence {\n slug\n __typename\n }\n title\n uniqueSlug\n ...CardByline_post\n ...PostFooterActionsBar_post\n ...InResponseToEntityPreview_post\n ...PostScrollTracker_post\n ...HighDensityPreview_post\n __typename\n}\n\nfragment PostPreview_user on User {\n __typename\n name\n username\n ...CardByline_user\n ...ExpandablePostByline_user\n id\n}\n\nfragment CardByline_user on User {\n __typename\n id\n name\n username\n mediumMemberAt\n socialStats {\n followerCount\n __typename\n }\n ...useIsVerifiedBookAuthor_user\n ...userUrl_user\n ...UserMentionTooltip_user\n}\n\nfragment useIsVerifiedBookAuthor_user on User {\n verifications {\n isBookAuthor\n __typename\n }\n __typename\n id\n}\n\nfragment userUrl_user on User {\n __typename\n id\n customDomainState {\n live {\n domain\n __typename\n }\n __typename\n }\n hasSubdomain\n username\n}\n\nfragment UserMentionTooltip_user on User {\n id\n name\n username\n bio\n imageId\n mediumMemberAt\n membership {\n tier\n __typename\n id\n }\n ...UserAvatar_user\n ...UserFollowButton_user\n ...useIsVerifiedBookAuthor_user\n __typename\n}\n\nfragment UserAvatar_user on User {\n __typename\n id\n imageId\n mediumMemberAt\n membership {\n tier\n __typename\n id\n }\n name\n username\n ...userUrl_user\n}\n\nfragment UserFollowButton_user on User {\n ...UserFollowButtonSignedIn_user\n ...UserFollowButtonSignedOut_user\n __typename\n id\n}\n\nfragment UserFollowButtonSignedIn_user on User {\n id\n name\n __typename\n}\n\nfragment UserFollowButtonSignedOut_user on User {\n id\n ...SusiClickable_user\n __typename\n}\n\nfragment SusiClickable_user on User {\n ...SusiContainer_user\n __typename\n id\n}\n\nfragment SusiContainer_user on User {\n ...SignInOptions_user\n ...SignUpOptions_user\n __typename\n id\n}\n\nfragment SignInOptions_user on User {\n id\n name\n __typename\n}\n\nfragment SignUpOptions_user on User {\n id\n name\n __typename\n}\n\nfragment ExpandablePostByline_user on User {\n __typename\n id\n name\n imageId\n ...userUrl_user\n ...useIsVerifiedBookAuthor_user\n}\n\nfragment CardByline_collection on Collection {\n name\n ...collectionUrl_collection\n __typename\n id\n}\n\nfragment collectionUrl_collection on Collection {\n id\n domain\n slug\n __typename\n}\n\nfragment ExpandablePostByline_collection on Collection {\n __typename\n id\n name\n domain\n slug\n}\n\nfragment InteractivePostBody_postPreview on Post {\n extendedPreviewContent(\n truncationConfig: {previewParagraphsWordCountThreshold: 400, minimumWordLengthForTruncation: 150, truncateAtEndOfSentence: true, showFullImageCaptions: true, shortformPreviewParagraphsWordCountThreshold: 30, shortformMinimumWordLengthForTruncation: 30}\n ) {\n bodyModel {\n ...PostBody_bodyModel\n __typename\n }\n isFullContent\n __typename\n }\n __typename\n id\n}\n\nfragment PostBody_bodyModel on RichText {\n sections {\n name\n startIndex\n textLayout\n imageLayout\n backgroundImage {\n id\n originalHeight\n originalWidth\n __typename\n }\n videoLayout\n backgroundVideo {\n videoId\n originalHeight\n originalWidth\n previewImageId\n __typename\n }\n __typename\n }\n paragraphs {\n id\n ...PostBodySection_paragraph\n __typename\n }\n ...normalizedBodyModel_richText\n __typename\n}\n\nfragment PostBodySection_paragraph on Paragraph {\n name\n ...PostBodyParagraph_paragraph\n __typename\n id\n}\n\nfragment PostBodyParagraph_paragraph on Paragraph {\n name\n type\n ...ImageParagraph_paragraph\n ...TextParagraph_paragraph\n ...IframeParagraph_paragraph\n ...MixtapeParagraph_paragraph\n ...CodeBlockParagraph_paragraph\n __typename\n id\n}\n\nfragment ImageParagraph_paragraph on Paragraph {\n href\n layout\n metadata {\n id\n originalHeight\n originalWidth\n focusPercentX\n focusPercentY\n alt\n __typename\n }\n ...Markups_paragraph\n ...ParagraphRefsMapContext_paragraph\n ...PostAnnotationsMarker_paragraph\n __typename\n id\n}\n\nfragment Markups_paragraph on Paragraph {\n name\n text\n hasDropCap\n dropCapImage {\n ...MarkupNode_data_dropCapImage\n __typename\n id\n }\n markups {\n ...Markups_markup\n __typename\n }\n __typename\n id\n}\n\nfragment MarkupNode_data_dropCapImage on ImageMetadata {\n ...DropCap_image\n __typename\n id\n}\n\nfragment DropCap_image on ImageMetadata {\n id\n originalHeight\n originalWidth\n __typename\n}\n\nfragment Markups_markup on Markup {\n type\n start\n end\n href\n anchorType\n userId\n linkMetadata {\n httpStatus\n __typename\n }\n __typename\n}\n\nfragment ParagraphRefsMapContext_paragraph on Paragraph {\n id\n name\n text\n __typename\n}\n\nfragment PostAnnotationsMarker_paragraph on Paragraph {\n ...PostViewNoteCard_paragraph\n __typename\n id\n}\n\nfragment PostViewNoteCard_paragraph on Paragraph {\n name\n __typename\n id\n}\n\nfragment TextParagraph_paragraph on Paragraph {\n type\n hasDropCap\n codeBlockMetadata {\n mode\n lang\n __typename\n }\n ...Markups_paragraph\n ...ParagraphRefsMapContext_paragraph\n __typename\n id\n}\n\nfragment IframeParagraph_paragraph on Paragraph {\n type\n iframe {\n mediaResource {\n id\n iframeSrc\n iframeHeight\n iframeWidth\n title\n __typename\n }\n __typename\n }\n layout\n ...Markups_paragraph\n __typename\n id\n}\n\nfragment MixtapeParagraph_paragraph on Paragraph {\n type\n mixtapeMetadata {\n href\n mediaResource {\n mediumCatalog {\n id\n __typename\n }\n __typename\n }\n __typename\n }\n ...GenericMixtapeParagraph_paragraph\n __typename\n id\n}\n\nfragment GenericMixtapeParagraph_paragraph on Paragraph {\n text\n mixtapeMetadata {\n href\n thumbnailImageId\n __typename\n }\n markups {\n start\n end\n type\n href\n __typename\n }\n __typename\n id\n}\n\nfragment CodeBlockParagraph_paragraph on Paragraph {\n codeBlockMetadata {\n lang\n mode\n __typename\n }\n __typename\n id\n}\n\nfragment normalizedBodyModel_richText on RichText {\n paragraphs {\n ...normalizedBodyModel_richText_paragraphs\n __typename\n }\n sections {\n startIndex\n ...getSectionEndIndex_section\n __typename\n }\n ...getParagraphStyles_richText\n ...getParagraphSpaces_richText\n __typename\n}\n\nfragment normalizedBodyModel_richText_paragraphs on Paragraph {\n markups {\n ...normalizedBodyModel_richText_paragraphs_markups\n __typename\n }\n codeBlockMetadata {\n lang\n mode\n __typename\n }\n ...getParagraphHighlights_paragraph\n ...getParagraphPrivateNotes_paragraph\n __typename\n id\n}\n\nfragment normalizedBodyModel_richText_paragraphs_markups on Markup {\n type\n __typename\n}\n\nfragment getParagraphHighlights_paragraph on Paragraph {\n name\n __typename\n id\n}\n\nfragment getParagraphPrivateNotes_paragraph on Paragraph {\n name\n __typename\n id\n}\n\nfragment getSectionEndIndex_section on Section {\n startIndex\n __typename\n}\n\nfragment getParagraphStyles_richText on RichText {\n paragraphs {\n text\n type\n __typename\n }\n sections {\n ...getSectionEndIndex_section\n __typename\n }\n __typename\n}\n\nfragment getParagraphSpaces_richText on RichText {\n paragraphs {\n layout\n metadata {\n originalHeight\n originalWidth\n id\n __typename\n }\n type\n ...paragraphExtendsImageGrid_paragraph\n __typename\n }\n ...getSeriesParagraphTopSpacings_richText\n ...getPostParagraphTopSpacings_richText\n __typename\n}\n\nfragment paragraphExtendsImageGrid_paragraph on Paragraph {\n layout\n type\n __typename\n id\n}\n\nfragment getSeriesParagraphTopSpacings_richText on RichText {\n paragraphs {\n id\n __typename\n }\n sections {\n ...getSectionEndIndex_section\n __typename\n }\n __typename\n}\n\nfragment getPostParagraphTopSpacings_richText on RichText {\n paragraphs {\n type\n layout\n text\n codeBlockMetadata {\n lang\n mode\n __typename\n }\n __typename\n }\n sections {\n ...getSectionEndIndex_section\n __typename\n }\n __typename\n}\n\nfragment CardByline_post on Post {\n ...DraftStatus_post\n ...Star_post\n ...shouldShowPublishedInStatus_post\n __typename\n id\n}\n\nfragment DraftStatus_post on Post {\n id\n pendingCollection {\n id\n creator {\n id\n __typename\n }\n ...BoldCollectionName_collection\n __typename\n }\n statusForCollection\n creator {\n id\n __typename\n }\n isPublished\n __typename\n}\n\nfragment BoldCollectionName_collection on Collection {\n id\n name\n __typename\n}\n\nfragment Star_post on Post {\n id\n creator {\n id\n __typename\n }\n __typename\n}\n\nfragment shouldShowPublishedInStatus_post on Post {\n statusForCollection\n isPublished\n __typename\n id\n}\n\nfragment PostFooterActionsBar_post on Post {\n id\n visibility\n allowResponses\n postResponses {\n count\n __typename\n }\n isLimitedState\n creator {\n id\n __typename\n }\n collection {\n id\n __typename\n }\n ...MultiVote_post\n ...PostSharePopover_post\n ...OverflowMenuButtonWithNegativeSignal_post\n ...PostPageBookmarkButton_post\n __typename\n}\n\nfragment MultiVote_post on Post {\n id\n creator {\n id\n ...SusiClickable_user\n __typename\n }\n isPublished\n ...SusiClickable_post\n collection {\n id\n slug\n __typename\n }\n isLimitedState\n ...MultiVoteCount_post\n __typename\n}\n\nfragment SusiClickable_post on Post {\n id\n mediumUrl\n ...SusiContainer_post\n __typename\n}\n\nfragment SusiContainer_post on Post {\n id\n __typename\n}\n\nfragment MultiVoteCount_post on Post {\n id\n __typename\n}\n\nfragment PostSharePopover_post on Post {\n id\n mediumUrl\n title\n isPublished\n isLocked\n ...usePostUrl_post\n ...FriendLink_post\n __typename\n}\n\nfragment usePostUrl_post on Post {\n id\n creator {\n ...userUrl_user\n __typename\n id\n }\n collection {\n id\n domain\n slug\n __typename\n }\n isSeries\n mediumUrl\n sequence {\n slug\n __typename\n }\n uniqueSlug\n __typename\n}\n\nfragment FriendLink_post on Post {\n id\n ...SusiClickable_post\n ...useCopyFriendLink_post\n __typename\n}\n\nfragment useCopyFriendLink_post on Post {\n ...usePostUrl_post\n __typename\n id\n}\n\nfragment OverflowMenuButtonWithNegativeSignal_post on Post {\n id\n visibility\n ...OverflowMenuWithNegativeSignal_post\n __typename\n}\n\nfragment OverflowMenuWithNegativeSignal_post on Post {\n id\n creator {\n id\n __typename\n }\n collection {\n id\n __typename\n }\n ...OverflowMenuItemUndoClaps_post\n ...AddToCatalogBase_post\n __typename\n}\n\nfragment OverflowMenuItemUndoClaps_post on Post {\n id\n clapCount\n ...ClapMutation_post\n __typename\n}\n\nfragment ClapMutation_post on Post {\n __typename\n id\n clapCount\n ...MultiVoteCount_post\n}\n\nfragment AddToCatalogBase_post on Post {\n id\n isPublished\n __typename\n}\n\nfragment PostPageBookmarkButton_post on Post {\n ...AddToCatalogBookmarkButton_post\n __typename\n id\n}\n\nfragment AddToCatalogBookmarkButton_post on Post {\n ...AddToCatalogBase_post\n __typename\n id\n}\n\nfragment InResponseToEntityPreview_post on Post {\n id\n inResponseToEntityType\n __typename\n}\n\nfragment PostScrollTracker_post on Post {\n id\n collection {\n id\n __typename\n }\n sequence {\n sequenceId\n __typename\n }\n __typename\n}\n\nfragment HighDensityPreview_post on Post {\n id\n title\n previewImage {\n id\n focusPercentX\n focusPercentY\n __typename\n }\n extendedPreviewContent(\n truncationConfig: {previewParagraphsWordCountThreshold: 400, minimumWordLengthForTruncation: 150, truncateAtEndOfSentence: true, showFullImageCaptions: true, shortformPreviewParagraphsWordCountThreshold: 30, shortformMinimumWordLengthForTruncation: 30}\n ) {\n subtitle\n __typename\n }\n ...HighDensityFooter_post\n __typename\n}\n\nfragment HighDensityFooter_post on Post {\n id\n readingTime\n tags {\n ...TopicPill_tag\n __typename\n }\n ...BookmarkButton_post\n ...ExpandablePostCardOverflowButton_post\n ...OverflowMenuButtonWithNegativeSignal_post\n __typename\n}\n\nfragment TopicPill_tag on Tag {\n __typename\n id\n displayTitle\n normalizedTagSlug\n}\n\nfragment BookmarkButton_post on Post {\n visibility\n ...SusiClickable_post\n ...AddToCatalogBookmarkButton_post\n __typename\n id\n}\n\nfragment ExpandablePostCardOverflowButton_post on Post {\n creator {\n id\n __typename\n }\n ...ExpandablePostCardReaderButton_post\n __typename\n id\n}\n\nfragment ExpandablePostCardReaderButton_post on Post {\n id\n collection {\n id\n __typename\n }\n creator {\n id\n __typename\n }\n clapCount\n ...ClapMutation_post\n __typename\n}\n" } ]; if(!tag) { bodyData = [ { "operationName": "WebInlineRecommendedFeedQuery", "variables": { "forceRank": false, "paging": nextPaging, }, "query": "query WebInlineRecommendedFeedQuery($paging: PagingOptions, $forceRank: Boolean) {\n webRecommendedFeed(paging: $paging, forceRank: $forceRank) {\n items {\n feedId\n ...HomeFeedItem_metadata\n post {\n ...PostPreview_post\n __typename\n }\n __typename\n }\n pagingInfo {\n next {\n limit\n to\n source\n __typename\n }\n __typename\n }\n __typename\n }\n}\n\nfragment HomeFeedItem_metadata on HomeFeedItem {\n reason\n moduleSourceEncoding\n reasonString\n postProviderExplanation {\n reason\n topic {\n name\n __typename\n }\n __typename\n }\n __typename\n}\n\nfragment PostPreview_post on Post {\n id\n creator {\n ...PostPreview_user\n __typename\n id\n }\n collection {\n ...CardByline_collection\n ...ExpandablePostByline_collection\n __typename\n id\n }\n ...InteractivePostBody_postPreview\n firstPublishedAt\n isLocked\n isSeries\n latestPublishedAt\n inResponseToCatalogR###lt {\n __typename\n }\n pinnedAt\n pinnedByCreatorAt\n previewImage {\n id\n focusPercentX\n focusPercentY\n __typename\n }\n readingTime\n sequence {\n slug\n __typename\n }\n title\n uniqueSlug\n ...CardByline_post\n ...PostFooterActionsBar_post\n ...InResponseToEntityPreview_post\n ...PostScrollTracker_post\n ...HighDensityPreview_post\n __typename\n}\n\nfragment PostPreview_user on User {\n __typename\n name\n username\n ...CardByline_user\n ...ExpandablePostByline_user\n id\n}\n\nfragment CardByline_user on User {\n __typename\n id\n name\n username\n mediumMemberAt\n socialStats {\n followerCount\n __typename\n }\n ...useIsVerifiedBookAuthor_user\n ...userUrl_user\n ...UserMentionTooltip_user\n}\n\nfragment useIsVerifiedBookAuthor_user on User {\n verifications {\n isBookAuthor\n __typename\n }\n __typename\n id\n}\n\nfragment userUrl_user on User {\n __typename\n id\n customDomainState {\n live {\n domain\n __typename\n }\n __typename\n }\n hasSubdomain\n username\n}\n\nfragment UserMentionTooltip_user on User {\n id\n name\n username\n bio\n imageId\n mediumMemberAt\n membership {\n tier\n __typename\n id\n }\n ...UserAvatar_user\n ...UserFollowButton_user\n ...useIsVerifiedBookAuthor_user\n __typename\n}\n\nfragment UserAvatar_user on User {\n __typename\n id\n imageId\n mediumMemberAt\n membership {\n tier\n __typename\n id\n }\n name\n username\n ...userUrl_user\n}\n\nfragment UserFollowButton_user on User {\n ...UserFollowButtonSignedIn_user\n ...UserFollowButtonSignedOut_user\n __typename\n id\n}\n\nfragment UserFollowButtonSignedIn_user on User {\n id\n name\n __typename\n}\n\nfragment UserFollowButtonSignedOut_user on User {\n id\n ...SusiClickable_user\n __typename\n}\n\nfragment SusiClickable_user on User {\n ...SusiContainer_user\n __typename\n id\n}\n\nfragment SusiContainer_user on User {\n ...SignInOptions_user\n ...SignUpOptions_user\n __typename\n id\n}\n\nfragment SignInOptions_user on User {\n id\n name\n __typename\n}\n\nfragment SignUpOptions_user on User {\n id\n name\n __typename\n}\n\nfragment ExpandablePostByline_user on User {\n __typename\n id\n name\n imageId\n ...userUrl_user\n ...useIsVerifiedBookAuthor_user\n}\n\nfragment CardByline_collection on Collection {\n name\n ...collectionUrl_collection\n __typename\n id\n}\n\nfragment collectionUrl_collection on Collection {\n id\n domain\n slug\n __typename\n}\n\nfragment ExpandablePostByline_collection on Collection {\n __typename\n id\n name\n domain\n slug\n}\n\nfragment InteractivePostBody_postPreview on Post {\n extendedPreviewContent(\n truncationConfig: {previewParagraphsWordCountThreshold: 400, minimumWordLengthForTruncation: 150, truncateAtEndOfSentence: true, showFullImageCaptions: true, shortformPreviewParagraphsWordCountThreshold: 30, shortformMinimumWordLengthForTruncation: 30}\n ) {\n bodyModel {\n ...PostBody_bodyModel\n __typename\n }\n isFullContent\n __typename\n }\n __typename\n id\n}\n\nfragment PostBody_bodyModel on RichText {\n sections {\n name\n startIndex\n textLayout\n imageLayout\n backgroundImage {\n id\n originalHeight\n originalWidth\n __typename\n }\n videoLayout\n backgroundVideo {\n videoId\n originalHeight\n originalWidth\n previewImageId\n __typename\n }\n __typename\n }\n paragraphs {\n id\n ...PostBodySection_paragraph\n __typename\n }\n ...normalizedBodyModel_richText\n __typename\n}\n\nfragment PostBodySection_paragraph on Paragraph {\n name\n ...PostBodyParagraph_paragraph\n __typename\n id\n}\n\nfragment PostBodyParagraph_paragraph on Paragraph {\n name\n type\n ...ImageParagraph_paragraph\n ...TextParagraph_paragraph\n ...IframeParagraph_paragraph\n ...MixtapeParagraph_paragraph\n ...CodeBlockParagraph_paragraph\n __typename\n id\n}\n\nfragment ImageParagraph_paragraph on Paragraph {\n href\n layout\n metadata {\n id\n originalHeight\n originalWidth\n focusPercentX\n focusPercentY\n alt\n __typename\n }\n ...Markups_paragraph\n ...ParagraphRefsMapContext_paragraph\n ...PostAnnotationsMarker_paragraph\n __typename\n id\n}\n\nfragment Markups_paragraph on Paragraph {\n name\n text\n hasDropCap\n dropCapImage {\n ...MarkupNode_data_dropCapImage\n __typename\n id\n }\n markups {\n ...Markups_markup\n __typename\n }\n __typename\n id\n}\n\nfragment MarkupNode_data_dropCapImage on ImageMetadata {\n ...DropCap_image\n __typename\n id\n}\n\nfragment DropCap_image on ImageMetadata {\n id\n originalHeight\n originalWidth\n __typename\n}\n\nfragment Markups_markup on Markup {\n type\n start\n end\n href\n anchorType\n userId\n linkMetadata {\n httpStatus\n __typename\n }\n __typename\n}\n\nfragment ParagraphRefsMapContext_paragraph on Paragraph {\n id\n name\n text\n __typename\n}\n\nfragment PostAnnotationsMarker_paragraph on Paragraph {\n ...PostViewNoteCard_paragraph\n __typename\n id\n}\n\nfragment PostViewNoteCard_paragraph on Paragraph {\n name\n __typename\n id\n}\n\nfragment TextParagraph_paragraph on Paragraph {\n type\n hasDropCap\n codeBlockMetadata {\n mode\n lang\n __typename\n }\n ...Markups_paragraph\n ...ParagraphRefsMapContext_paragraph\n __typename\n id\n}\n\nfragment IframeParagraph_paragraph on Paragraph {\n type\n iframe {\n mediaResource {\n id\n iframeSrc\n iframeHeight\n iframeWidth\n title\n __typename\n }\n __typename\n }\n layout\n ...Markups_paragraph\n __typename\n id\n}\n\nfragment MixtapeParagraph_paragraph on Paragraph {\n type\n mixtapeMetadata {\n href\n mediaResource {\n mediumCatalog {\n id\n __typename\n }\n __typename\n }\n __typename\n }\n ...GenericMixtapeParagraph_paragraph\n __typename\n id\n}\n\nfragment GenericMixtapeParagraph_paragraph on Paragraph {\n text\n mixtapeMetadata {\n href\n thumbnailImageId\n __typename\n }\n markups {\n start\n end\n type\n href\n __typename\n }\n __typename\n id\n}\n\nfragment CodeBlockParagraph_paragraph on Paragraph {\n codeBlockMetadata {\n lang\n mode\n __typename\n }\n __typename\n id\n}\n\nfragment normalizedBodyModel_richText on RichText {\n paragraphs {\n ...normalizedBodyModel_richText_paragraphs\n __typename\n }\n sections {\n startIndex\n ...getSectionEndIndex_section\n __typename\n }\n ...getParagraphStyles_richText\n ...getParagraphSpaces_richText\n __typename\n}\n\nfragment normalizedBodyModel_richText_paragraphs on Paragraph {\n markups {\n ...normalizedBodyModel_richText_paragraphs_markups\n __typename\n }\n codeBlockMetadata {\n lang\n mode\n __typename\n }\n ...getParagraphHighlights_paragraph\n ...getParagraphPrivateNotes_paragraph\n __typename\n id\n}\n\nfragment normalizedBodyModel_richText_paragraphs_markups on Markup {\n type\n __typename\n}\n\nfragment getParagraphHighlights_paragraph on Paragraph {\n name\n __typename\n id\n}\n\nfragment getParagraphPrivateNotes_paragraph on Paragraph {\n name\n __typename\n id\n}\n\nfragment getSectionEndIndex_section on Section {\n startIndex\n __typename\n}\n\nfragment getParagraphStyles_richText on RichText {\n paragraphs {\n text\n type\n __typename\n }\n sections {\n ...getSectionEndIndex_section\n __typename\n }\n __typename\n}\n\nfragment getParagraphSpaces_richText on RichText {\n paragraphs {\n layout\n metadata {\n originalHeight\n originalWidth\n id\n __typename\n }\n type\n ...paragraphExtendsImageGrid_paragraph\n __typename\n }\n ...getSeriesParagraphTopSpacings_richText\n ...getPostParagraphTopSpacings_richText\n __typename\n}\n\nfragment paragraphExtendsImageGrid_paragraph on Paragraph {\n layout\n type\n __typename\n id\n}\n\nfragment getSeriesParagraphTopSpacings_richText on RichText {\n paragraphs {\n id\n __typename\n }\n sections {\n ...getSectionEndIndex_section\n __typename\n }\n __typename\n}\n\nfragment getPostParagraphTopSpacings_richText on RichText {\n paragraphs {\n type\n layout\n text\n codeBlockMetadata {\n lang\n mode\n __typename\n }\n __typename\n }\n sections {\n ...getSectionEndIndex_section\n __typename\n }\n __typename\n}\n\nfragment CardByline_post on Post {\n ...DraftStatus_post\n ...Star_post\n ...shouldShowPublishedInStatus_post\n __typename\n id\n}\n\nfragment DraftStatus_post on Post {\n id\n pendingCollection {\n id\n creator {\n id\n __typename\n }\n ...BoldCollectionName_collection\n __typename\n }\n statusForCollection\n creator {\n id\n __typename\n }\n isPublished\n __typename\n}\n\nfragment BoldCollectionName_collection on Collection {\n id\n name\n __typename\n}\n\nfragment Star_post on Post {\n id\n creator {\n id\n __typename\n }\n __typename\n}\n\nfragment shouldShowPublishedInStatus_post on Post {\n statusForCollection\n isPublished\n __typename\n id\n}\n\nfragment PostFooterActionsBar_post on Post {\n id\n visibility\n allowResponses\n postResponses {\n count\n __typename\n }\n isLimitedState\n creator {\n id\n __typename\n }\n collection {\n id\n __typename\n }\n ...MultiVote_post\n ...PostSharePopover_post\n ...OverflowMenuButtonWithNegativeSignal_post\n ...PostPageBookmarkButton_post\n __typename\n}\n\nfragment MultiVote_post on Post {\n id\n creator {\n id\n ...SusiClickable_user\n __typename\n }\n isPublished\n ...SusiClickable_post\n collection {\n id\n slug\n __typename\n }\n isLimitedState\n ...MultiVoteCount_post\n __typename\n}\n\nfragment SusiClickable_post on Post {\n id\n mediumUrl\n ...SusiContainer_post\n __typename\n}\n\nfragment SusiContainer_post on Post {\n id\n __typename\n}\n\nfragment MultiVoteCount_post on Post {\n id\n __typename\n}\n\nfragment PostSharePopover_post on Post {\n id\n mediumUrl\n title\n isPublished\n isLocked\n ...usePostUrl_post\n ...FriendLink_post\n __typename\n}\n\nfragment usePostUrl_post on Post {\n id\n creator {\n ...userUrl_user\n __typename\n id\n }\n collection {\n id\n domain\n slug\n __typename\n }\n isSeries\n mediumUrl\n sequence {\n slug\n __typename\n }\n uniqueSlug\n __typename\n}\n\nfragment FriendLink_post on Post {\n id\n ...SusiClickable_post\n ...useCopyFriendLink_post\n ...UpsellClickable_post\n __typename\n}\n\nfragment useCopyFriendLink_post on Post {\n ...usePostUrl_post\n __typename\n id\n}\n\nfragment UpsellClickable_post on Post {\n id\n collection {\n id\n __typename\n }\n sequence {\n sequenceId\n __typename\n }\n creator {\n id\n __typename\n }\n __typename\n}\n\nfragment OverflowMenuButtonWithNegativeSignal_post on Post {\n id\n visibility\n ...OverflowMenuWithNegativeSignal_post\n __typename\n}\n\nfragment OverflowMenuWithNegativeSignal_post on Post {\n id\n creator {\n id\n __typename\n }\n collection {\n id\n __typename\n }\n ...OverflowMenuItemUndoClaps_post\n ...AddToCatalogBase_post\n __typename\n}\n\nfragment OverflowMenuItemUndoClaps_post on Post {\n id\n clapCount\n ...ClapMutation_post\n __typename\n}\n\nfragment ClapMutation_post on Post {\n __typename\n id\n clapCount\n ...MultiVoteCount_post\n}\n\nfragment AddToCatalogBase_post on Post {\n id\n isPublished\n __typename\n}\n\nfragment PostPageBookmarkButton_post on Post {\n ...AddToCatalogBookmarkButton_post\n __typename\n id\n}\n\nfragment AddToCatalogBookmarkButton_post on Post {\n ...AddToCatalogBase_post\n __typename\n id\n}\n\nfragment InResponseToEntityPreview_post on Post {\n id\n inResponseToEntityType\n __typename\n}\n\nfragment PostScrollTracker_post on Post {\n id\n collection {\n id\n __typename\n }\n sequence {\n sequenceId\n __typename\n }\n __typename\n}\n\nfragment HighDensityPreview_post on Post {\n id\n title\n previewImage {\n id\n focusPercentX\n focusPercentY\n __typename\n }\n extendedPreviewContent(\n truncationConfig: {previewParagraphsWordCountThreshold: 400, minimumWordLengthForTruncation: 150, truncateAtEndOfSentence: true, showFullImageCaptions: true, shortformPreviewParagraphsWordCountThreshold: 30, shortformMinimumWordLengthForTruncation: 30}\n ) {\n subtitle\n __typename\n }\n ...HighDensityFooter_post\n __typename\n}\n\nfragment HighDensityFooter_post on Post {\n id\n readingTime\n tags {\n ...TopicPill_tag\n __typename\n }\n ...BookmarkButton_post\n ...ExpandablePostCardOverflowButton_post\n ...OverflowMenuButtonWithNegativeSignal_post\n __typename\n}\n\nfragment TopicPill_tag on Tag {\n __typename\n id\n displayTitle\n normalizedTagSlug\n}\n\nfragment BookmarkButton_post on Post {\n visibility\n ...SusiClickable_post\n ...AddToCatalogBookmarkButton_post\n __typename\n id\n}\n\nfragment ExpandablePostCardOverflowButton_post on Post {\n creator {\n id\n __typename\n }\n ...ExpandablePostCardReaderButton_post\n __typename\n id\n}\n\nfragment ExpandablePostCardReaderButton_post on Post {\n id\n collection {\n id\n __typename\n }\n creator {\n id\n __typename\n }\n clapCount\n ...ClapMutation_post\n __typename\n}\n" } ]; } let response = await fetch(`https://medium.com/_/graphql?userscript`, { method: "POST", body: JSON.stringify(bodyData), headers: { Accept: "application/json", "Content-Type": "application/json", }, }); if(response.ok) { let r###lt = await response.json(); let items; let notLockedOnes; let nextPaging; if(tag) { items = r###lt[0].data.personalisedTagFeed.items; notLockedOnes = items.filter(item => !item.post.isLocked); nextPaging = {...r###lt[0].data.personalisedTagFeed.pagingInfo.next, __typename: undefined}; } else { items = r###lt[0].data.webRecommendedFeed.items; notLockedOnes = items.filter(item => !item.post.isLocked); nextPaging = {...r###lt[0].data.webRecommendedFeed.pagingInfo.next, __typename: undefined}; } return { items: notLockedOnes, nextPaging, originalR###ltCount: items.length}; } } function insertAfter(newNode, existingNode) { existingNode.parentNode.insertBefore(newNode, existingNode.nextSibling); } (async function() { 'use strict'; let allItems = []; let tagPart = window.location.href.match(/tag\=(.*)$/); let tag = ""; if(tagPart) { tag = tagPart[1]; } let progressElement; window.addEventListener("load", e => { setTimeout(() => { progressElement = document.createElement("div"); progressElement.className = "n o ay"; let header = document.querySelector("#root").querySelector("div").querySelectorAll("div")[2].querySelector("div").querySelectorAll("div")[1]; let afterThis = header.children[0]; insertAfter(progressElement, afterThis); }, 1000); }, false); let fullSection; setTimeout(() => { let allArticles = document.querySelectorAll("article"); console.log("Originally found", allArticles.length, "articles on the page, now removing all but first one with an image!"); // detect first article that has an image let articleToKeepIdx = -1; for(let i=0; i<allArticles.length; i++) { if(allArticles[i].querySelectorAll("img").length > 0) { articleToKeepIdx = i; break; } } console.log("First article with image is article #", articleToKeepIdx); for(let i=allArticles.length-1; i>=0; i--) { if(i !== articleToKeepIdx) { allArticles[i].parentNode.removeChild(allArticles[i]); } } fullSection = document.querySelector("article").parentNode.parentNode.parentNode.parentNode.parentNode; if(fullSection) { fullSection.style.visibility = "hidden"; } // Navmenu let scrollerItems = document.querySelector("#scroller-items"); let links = scrollerItems.querySelectorAll("a"); for(let link of links) { if(link.href.includes("suggestions")) { let svgpath = link.querySelector("path"); svgpath.setAttribute("d", "M2,9 L17,9 L17,11 L2,11z"); let newHref = "https://medium.com/me/following"; let cloneP = link.querySelector("span").cloneNode(true); let newLink = document.createElement("a"); newLink.href = newHref; newLink.target = "_blank"; newLink.appendChild(cloneP); link.parentNode.appendChild(newLink); link.parentNode.removeChild(link); continue; } let tag = link.href.match(/tag\=(.*)\&/); if(tag) { let newHref = link.href.replace(/\&.*/, ""); let cloneP = link.querySelector("button").cloneNode(true); let newLink = document.createElement("a"); newLink.href = newHref; newLink.appendChild(cloneP); link.parentNode.appendChild(newLink); link.parentNode.removeChild(link); } else { let queryString = link.href.match(/\?(.*)/); if(queryString) { let queryPart = queryString[1]; if(!queryPart.includes("feed=")) { let newHref = link.href.replace(/\?.*/, ""); let cloneP = link.querySelector("button").cloneNode(true); let newLink = document.createElement("a"); newLink.href = newHref; newLink.appendChild(cloneP); link.parentNode.appendChild(newLink); link.parentNode.removeChild(link); } } } } let destNode = scrollerItems.parentNode.parentNode.parentNode.children[0]; destNode.style.height = "160px"; let children = scrollerItems.children; for(let child of children) { let newChild = child.cloneNode(true); newChild.style.display = "inline-block"; destNode.appendChild(newChild); } for(let i=children.length-1; i>=0; i--) { let child = children[i]; child.parentNode.removeChild(child); } for(let i=scrollerItems.parentNode.parentNode.children.length-1; i>=0; i--) { let child = scrollerItems.parentNode.parentNode.children[i]; child.parentNode.removeChild(child); } // top HOME link let topHomeLink = document.querySelector("[class='n o ay']").querySelector("a"); let cloneContent = topHomeLink.querySelector("svg").cloneNode(true); let newLink = document.createElement("a"); newLink.href = "https://medium.com"; newLink.appendChild(cloneContent); topHomeLink.parentNode.prepend(newLink); topHomeLink.parentNode.removeChild(topHomeLink); }, 2000); // FETCH articles let nextPaging = { limit: 25}; let lastPageFound = false; let i=0; while(!lastPageFound) { if(progressElement) { progressElement.innerText = `Fetching ${i+1} ...`; } console.log("Fetching round", i+1); let r###lt = await fetchFeed(nextPaging, tag); allItems = [...allItems, ...r###lt.items]; console.log("Fetched", r###lt.originalR###ltCount, "r###lts"); if(r###lt.originalR###ltCount < 25) { lastPageFound = true; } nextPaging = r###lt.nextPaging; i++; } if(progressElement) { await makeOutputPossible(10); progressElement.innerText = `Sorting...`; await makeOutputPossible(10); } allItems.sort((a, b) => { if(a.post.latestPublishedAt > b.post.latestPublishedAt) { return -1; } if(a.post.latestPublishedAt < b.post.latestPublishedAt) { return 1; } return 0; }); console.log("All items after 15 rounds:", allItems); let articles = document.querySelectorAll("article"); let maxheightparent = articles[0].parentNode.parentNode.parentNode.parentNode; let outerparent = maxheightparent.parentNode; maxheightparent.style.maxHeight = "unset"; if(progressElement) { await makeOutputPossible(10); progressElement.innerText = `Creating articles...`; await makeOutputPossible(10); } for(let i=outerparent.children.length-2; i>0; i--) { outerparent.removeChild(outerparent.children[i]); } for(let i=1; i<allItems.length; i++) { let articleClone = articles[0].cloneNode(true); articles[0].parentNode.appendChild(articleClone); } articles = document.querySelectorAll("article"); console.log("After cloning there are now", articles.length, "articles on the page"); if(progressElement) { await makeOutputPossible(10); progressElement.innerText = `Filling up articles...`; await makeOutputPossible(10); } // replacing existing articles for(let i=0; i<articles.length; i++) { console.log("Changing article", i+1); let block = articles[i].querySelector("div").querySelector("div").querySelector("div").querySelector("div").querySelector("div").querySelector("div"); let authorSection = block.children[0].children[0].children[1].children[0].children[0]; let authorElement; if(authorSection) { authorElement = authorSection.querySelector("p"); } else { // AUTHOR is in a block with "IMG In SECTION by AUTHOR" authorElement = block.children[0].children[0].children[4].children[0].children[0].querySelector("p"); } let authorExtra = authorElement.parentNode.parentNode.parentNode.parentNode; if(authorExtra.children.length > 2) { authorExtra.children[0].parentNode.removeChild(authorExtra.children[0]); authorExtra.children[0].parentNode.removeChild(authorExtra.children[0]); authorExtra.children[0].parentNode.removeChild(authorExtra.children[0]); } let thedateSpans = block.children[1].children[0].children[1].children[0].children[0].children[0].children[0].querySelectorAll("span"); let thedateSpan; let ago = false; console.log("Found spans:", thedateSpans.length); if(thedateSpans.length) { thedateSpan = thedateSpans[0]; } else { thedateSpan = block.children[1].children[0].children[1].children[0].children[0].children[0].children[0]; console.log("Identified AGO date element:", thedateSpan.childNodes); ago = true; } let childrenCount = thedateSpan.parentNode.children.length; if(childrenCount === 3) { // Paywall symbol thedateSpan.parentNode.removeChild(thedateSpan.parentNode.children[0]); } let thedateElement = thedateSpan.childNodes[0]; if(ago) { thedateElement = thedateSpan.childNodes[1]; } console.log("Found date element:", thedateElement); if(!ago) { let dateExtra = thedateSpan.parentNode.parentNode.children[1]; if(dateExtra) { dateExtra.parentNode.removeChild(dateExtra); } } else { let dateExtra = thedateSpan.querySelector("div"); if(dateExtra) { dateExtra.parentNode.removeChild(dateExtra); } } let dateExtra = thedateSpan.parentNode.children[1]; if(dateExtra) { dateExtra.parentNode.removeChild(dateExtra); } let article = block.children[1].querySelector("div").querySelector("div"); let imageElement = article.parentNode.parentNode.children[1]?.querySelectorAll("img")[1]; //console.log(imageElement); let miniImage = authorElement.parentNode.parentNode.parentNode.parentNode.parentNode.children[0].children[0]; miniImage.parentNode.removeChild(miniImage); // let bottomLine = article.parentNode.children[1]; // bottomLine.removeChild(bottomLine.children[0]); let titleElement = article.querySelector("h2"); let paragraphElement = article.querySelector("h3"); let link = document.createElement("a"); link.target = "_blank"; let newParagraph = paragraphElement.cloneNode(true); let newTitle = titleElement.cloneNode(true); paragraphElement.parentNode.removeChild(paragraphElement); titleElement.parentNode.removeChild(titleElement); if(newTitle) { newTitle.innerText = allItems[i].post.title; } if(newParagraph) { newParagraph.innerText = allItems[i].post.extendedPreviewContent.subtitle; } link.href = allItems[i].post.mediumUrl; if(authorElement) { authorElement.innerText = allItems[i].post.creator.name; let authorlink = authorElement.parentNode; authorlink.href = "/@" + allItems[i].post.creator.username; authorlink.target = "_blank"; authorlink.rel = ""; } if(thedateElement) { thedateElement.textContent = (new Date(allItems[i].post.latestPublishedAt)).toLocaleString(); } if(imageElement && allItems[i].post.previewImage?.id) { let imageElementClone = imageElement.cloneNode(true); imageElementClone.src = `https://miro.medium.com/v2/resize:fill:112:112/${allItems[i].post.previewImage.id}`; // let imageParent = imageElement.parentNode.parentNode.parentNode; // let newImageLink = document.createElement("a"); // newImageLink.href = allItems[i].post.mediumUrl; // newImageLink.appendChild(imageElementClone); // imageParent.appendChild(newImageLink); imageElement.parentNode.appendChild(imageElementClone); imageElement.parentNode.removeChild(imageElement); } link.appendChild(newTitle); link.appendChild(newParagraph); article.appendChild(link); } if(progressElement) { progressElement.style.display = "none"; } if(fullSection) { fullSection.style.visibility = "visible"; } })();