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 '