Add a instagram DCGI for tags (completely based on user.dcgi) - gophercgis - Collection of gopher CGI/DCGI for geomyidae
 (HTM) hg clone https://bitbucket.org/iamleot/gophercgis
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) changeset 2707ddb96f71a429799251acdfc7ce1800e5aecd
 (DIR) parent 7d60365d6ec75e398efdf4f7b3dc044994e3cb20
 (HTM) Author: Leonardo Taccari <iamleot@gmail.com>
       Date:   Sat, 23 Mar 2019 21:00:47 
       
       Add a instagram DCGI for tags (completely based on user.dcgi)
       
       Diffstat:
        instagram/tags.dcgi |  105 ++++++++++++++++++++++++++++++++++++++++++++++++++++
        1 files changed, 105 insertions(+), 0 deletions(-)
       ---
       diff -r 7d60365d6ec7 -r 2707ddb96f71 instagram/tags.dcgi
       --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
       +++ b/instagram/tags.dcgi       Sat Mar 23 21:00:47 2019 +0100
       @@ -0,0 +1,105 @@
       +#!/bin/sh
       +
       +. ../common/config.sh
       +
       +COMMENTS_CGI="${CGI_BASEDIR}/instagram/comments.cgi"
       +CGI="${CGI_BASEDIR}/instagram/tags.dcgi"
       +
       +
       +case "$2" in
       +*/*/*/*)
       +       # tag, id, rhx_gis and end_cursor are provided (next pages) (`data')
       +       IFS=/ set -- "$2"
       +       set -- $*
       +       tag="$1"
       +       id="$2"
       +       rhx_gis="$3"
       +       end_cursor="$4"
       +       ;;
       +*)
       +       # only tag is provided (first page) (`profile')
       +       tag="$2"
       +       ;;
       +esac
       +
       +
       +profile_header='
       +.entry_data.TagPage[] | .graphql.hashtag |
       +       "t",
       +       "t" + .name,
       +       "t",
       +'
       +
       +data_header='
       +.data.hashtag |
       +       "t",
       +       "t" + "'"${tag}"'",
       +       "t",
       +'
       +
       +profile_footer='
       +,
       +if .entry_data.TagPage[].graphql.hashtag.edge_hashtag_to_media.page_info.has_next_page then
       +  "[1|>> Next page|'"${CGI}?${tag}/"'" +
       +    .entry_data.TagPage[].graphql.hashtag.id + "/" +
       +    .rhx_gis + "/" +
       +    .entry_data.TagPage[].graphql.hashtag.edge_hashtag_to_media.page_info.end_cursor +
       +    "|server|port]"
       +else
       +  empty
       +end
       +'
       +
       +data_footer='
       +,
       +if .data.hashtag.edge_hashtag_to_media.page_info.has_next_page then
       +  "[1|>> Next page|'"${CGI}?${tag}/${id}/${rhx_gis}/"'" +
       +     .data.hashtag.edge_hashtag_to_media.page_info.end_cursor +
       +    "|server|port]"
       +else
       +  empty
       +end
       +'
       +
       +
       +if [ "${rhx_gis}" ] && [ "${end_cursor}" ]; then
       +       header="${data_header}"
       +       footer="${data_footer}"
       +       variables='{"tag_name":"'"${tag}"'","first":12,"after":"'"${end_cursor}"'"}'
       +       url="https://www.instagram.com/graphql/query/?query_hash=f92f56d47dc7a55b606908374b43a314&variables=${variables}"
       +
       +       #
       +       # XXX: This was described in:
       +       # XXX:  <https://stackoverflow.com/questions/49786980/>
       +       #
       +       gis=$(printf "%s" "${rhx_gis}:${variables}" | md5 -q)
       +
       +       fetch_cmd() {
       +               curl -H "X-Instagram-GIS: ${gis}" -Lgs -- "${url}"
       +       }
       +else
       +       header="${profile_header}"
       +       footer="${profile_footer}"
       +       url="https://www.instagram.com/explore/tags/${tag}/" 
       +       fetch_cmd() {
       +               curl -Lgs -- "${url}" |
       +               sed -ne 's/;<\/script>$//' \
       +                   -e '/_sharedData =/s/^.*_sharedData = //p'
       +       }
       +fi
       +
       +fetch_cmd |
       +jq -r '
       +(
       +'"${header}"'
       +    ( .edge_hashtag_to_media.edges[] | .node |
       +        (( "[h|[+] " + ( .taken_at_timestamp | strftime("%F %H:%M") ) + "|" +
       +           "URL:" + .display_url + "|server|port]" ),
       +            ( .edge_media_to_caption.edges[] | "t" + .node.text )),
       +        "tLikes:    " + ( .edge_media_preview_like.count | tostring ),
       +        "[0|Comments: " + ( .edge_media_to_comment.count | tostring ) + "|" +
       +           "'"${COMMENTS_CGI}"'?" + .shortcode + "|server|port]",
       +        "t" )
       +)
       +'"${footer}"'
       +'