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
       ---
       user.dcgi
       ---
            1 #!/bin/sh
            2 
            3 . ../common/config.sh
            4 
            5 COMMENTS_CGI="${CGI_BASEDIR}/instagram/comments.cgi"
            6 CGI="${CGI_BASEDIR}/instagram/user.dcgi"
            7 
            8 
            9 case "$2" in
           10 */*/*)
           11         # user, id and end_cursor are provided (next pages) (`data')
           12         IFS=/ set -- "$2"
           13         set -- $*
           14         user="$1"
           15         id="$2"
           16         end_cursor="$3"
           17         ;;
           18 *)
           19         # only user is provided (first (AKA profile) page) (`profile')
           20         user="$2"
           21         ;;
           22 esac
           23 
           24 
           25 profile_header='
           26 .entry_data.ProfilePage[] | .graphql.user |
           27         "t",
           28         "t@" + .username + " - " + .full_name,
           29         "t",
           30         if .biography != "" then
           31                 "t" + .biography,
           32                 "t"
           33         else
           34                 empty
           35         end,
           36         "tFollowed by: " + ( .edge_followed_by.count | tostring ),
           37         "tFollows:     " + ( .edge_follow.count | tostring ),
           38         "t",
           39 '
           40 
           41 data_header='
           42 .data.user |
           43         "t",
           44         "t@" + "'"${user}"'",
           45         "t",
           46 '
           47 
           48 profile_footer='
           49 ,
           50 if .entry_data.ProfilePage[].graphql.user.edge_owner_to_timeline_media.page_info.has_next_page then
           51   "[1|>> Next page|'"${CGI}?${user}/"'" +
           52     .entry_data.ProfilePage[].graphql.user.id + "/" +
           53     .entry_data.ProfilePage[].graphql.user.edge_owner_to_timeline_media.page_info.end_cursor +
           54     "|server|port]"
           55 else
           56   empty
           57 end
           58 '
           59 
           60 data_footer='
           61 ,
           62 if .data.user.edge_owner_to_timeline_media.page_info.has_next_page then
           63   "[1|>> Next page|'"${CGI}?${user}/${id}/"'" +
           64      .data.user.edge_owner_to_timeline_media.page_info.end_cursor +
           65     "|server|port]"
           66 else
           67   empty
           68 end
           69 '
           70 
           71 
           72 if [ "${end_cursor}" ]; then
           73         header="${data_header}"
           74         footer="${data_footer}"
           75         variables='{"id":"'"${id}"'","first":12,"after":"'"${end_cursor}"'"}'
           76         url="https://www.instagram.com/graphql/query/?query_hash=bd0d6d184eefd4d0ce7036c11ae58ed9&variables=${variables}"
           77 
           78         #
           79         # XXX: This was described in:
           80         # XXX:  <https://stackoverflow.com/questions/49786980/>
           81         #
           82         gis=$(printf "%s" "${variables}" | md5 -q)
           83 
           84         fetch_cmd() {
           85                 curl -H "X-Instagram-GIS: ${gis}" -Lgs -- "${url}"
           86         }
           87 else
           88         header="${profile_header}"
           89         footer="${profile_footer}"
           90         url="https://www.instagram.com/${user}/" 
           91         fetch_cmd() {
           92                 curl -Lgs -- "${url}" |
           93                 sed -ne 's/;<\/script>$//' \
           94                     -e '/_sharedData =/s/^.*_sharedData = //p'
           95         }
           96 fi
           97 
           98 fetch_cmd |
           99 jq -r '
          100 (
          101 '"${header}"'
          102     ( .edge_owner_to_timeline_media.edges[] | .node |
          103         (( "[h|[+] " + ( .taken_at_timestamp | strftime("%F %H:%M") ) + "|" +
          104             "URL:" + .display_url + "|server|port]" ),
          105             ( .edge_media_to_caption.edges[] | "t" + .node.text )),
          106         "tLikes:    " + ( .edge_media_preview_like.count | tostring ),
          107         "[0|Comments: " + ( .edge_media_to_comment.count | tostring ) + "|" +
          108             "'"${COMMENTS_CGI}"'?" + .shortcode + "|server|port]",
          109         "t" )
          110 )
          111 '"${footer}"'
          112 '