Вот же, возможно у вас не выполнен вход в инстаграм аккаунт в браузере, и данный паблик закрытый, чтобы получить всю инфу нужно в браузере войти в инсту и подписаться на него. чтобы не запариваться с этим, я прикрепил блокнот со всеми данными, которые я могу получить от туда.
На том файле что вы вчера вчера скинули, я сидел разбирался с ним, чтобы понять как PQ читает Json файлы, и пришел к выводу, что данные там упорядочены в кластеры. мне как раз нужно вытащить их
То что нужно. Делаю по вашему примеру свой файл. Данные я получаю из запроса, без блокнота. У меня возникли сложности, где ошибка? Здесь роль источника выполняет custom2 все что выше вспомогательные данные
Код
let
Таблица_ID = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
Таблица_end_cursor = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
info = let
Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
Typed = Table.TransformColumnTypes(Source ,{"Столбец1", type text}),
Source2 = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
Typed2 = Table.TransformColumnTypes(Source2 ,{"Столбец1", type text}),
Custom1 = Table.FromColumns({Typed[Столбец1],Typed2[Столбец1]}),
Custom2 = Table.AddColumn(Custom1, "a", each Json.Document(Web.Contents("https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variables={""id"":"""&[Column1]&""",""first"":12,""after"":"""&[Column2]&"""}"))),
data1 = Source[data],
user = data1[user],
edge_owner_to_timeline_media = user[edge_owner_to_timeline_media],
edges = edge_owner_to_timeline_media[edges],
#"Converted to Table" = Table.FromList(edges, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Expanded {0}" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"node"}, {"node"}),
#"Expanded {0}1" = Table.ExpandRecordColumn(#"Expanded {0}", "node", {"id", "__typename", "edge_media_to_caption", "shortcode", "edge_media_to_comment", "comments_disabled", "taken_at_timestamp", "dimensions", "display_url", "edge_media_preview_like", "owner", "thumbnail_src", "thumbnail_resources", "is_video", "video_view_count"}, {"id", "__typename", "edge_media_to_caption", "shortcode", "edge_media_to_comment", "comments_disabled", "taken_at_timestamp", "dimensions", "display_url", "edge_media_preview_like", "owner", "thumbnail_src", "thumbnail_resources", "is_video", "video_view_count"})
in
#"Expanded {0}1"
in
info
Обратите внимание, куда ссылается строка 15 кода: она обращается к строке 7. Но там нет столбца [data]. Его пока вообще нигде нет.
Все, что начинается с 15 строки, должно разбирать один JSON. А вы, судя по всему, запросили JSONов по количеству строк в таблицах на листе. Значит, вам надо обрабатывать таким образом каждый ответ.
Попробуйте вот такой вариант (не проверял, ибо)
Код
let
Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
Typed = Table.TransformColumnTypes(Source ,{"Столбец1", type text}),
Source2 = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
Typed2 = Table.TransformColumnTypes(Source2 ,{"Столбец1", type text}),
Custom1 = Table.FromColumns({Typed[Столбец1],Typed2[Столбец1]}),
Custom2 = Table.AddColumn(Custom1, "a", each Json.Document(Web.Contents("https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variables={""id"":"""&[Column1]&""",""first"":12,""after"":"""&[Column2]&"""}"))),
//это функция разброра одного ответа:
OneJson = (Response)=>
let
data1 = Response[data],
user = data1[user],
edge_owner_to_timeline_media = user[edge_owner_to_timeline_media],
edges = edge_owner_to_timeline_media[edges],
#"Converted to Table" = Table.FromList(edges, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
#"Expanded {0}" = Table.ExpandRecordColumn(#"Converted to Table", "Column1", {"node"}, {"node"}),
#"Expanded {0}1" = Table.ExpandRecordColumn(#"Expanded {0}", "node", {"id", "__typename", "edge_media_to_caption", "shortcode", "edge_media_to_comment", "comments_disabled", "taken_at_timestamp", "dimensions", "display_url", "edge_media_preview_like", "owner", "thumbnail_src", "thumbnail_resources", "is_video", "video_view_count"}, {"id", "__typename", "edge_media_to_caption", "shortcode", "edge_media_to_comment", "comments_disabled", "taken_at_timestamp", "dimensions", "display_url", "edge_media_preview_like", "owner", "thumbnail_src", "thumbnail_resources", "is_video", "video_view_count"})
in
#"Expanded {0}1",
// это столбец, в котором функция применяется к ответам:
Result = Table.AddColumn(Custom2, "Result", each OneJson([a]), type table)
in
Result
let
Source = let
a = (a) =>
List.Transform(
Excel.CurrentWorkbook(){[Name = a]}[Content][Столбец1],
Text.From
)
in
Table.FromColumns({a("Таблица1"), a("Таблица2")}),
Custom1 = Table.AddColumn(
Source,
"a",
each let
json = Json.Document(Web.Contents(
"https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variabl...; &
[Column1]& """,""first"":12,""after"":""" & [Column2] & """}"
)),
tbl = Table.FromRecords(
List.Transform(json[data][user][edge_owner_to_timeline_media][edges], each [node]?),
null,
2
),
transform = Table.ReplaceValue(tbl, null, null,
(a, b, c) => let
a = if a is record
then Record.ToList(a){0}
else a,
b = if a is list
then if a{0}[node]? <> null
then a{0}[node][text]
else Table.FromRecords(a)
else a
in
b,
{"edge_media_to_caption", "edge_media_to_comment", "edge_media_preview_like", "owner", "thumbnail_resources"}
),
expand = Table.ExpandRecordColumn(transform, "dimensions", {"height", "width"}, {"dimensions.height", "dimensions.width"}),
expand1 = Table.ExpandTableColumn(expand, "thumbnail_resources",
{"src", "config_width", "config_height"},
{"thumbnail_resources.src", "thumbnail_resources.config_width", "thumbnail_resources.config_height"}
)
in
if Table.RowCount(tbl) > 0 then expand1 else tbl
),
Custom2 = Table.Combine(
Table.ReplaceValue( Custom1, each [Column1], each [Column2],
(a, b, c) => Table.AddColumn(Table.AddColumn(a, "ID", each b), "after", each c),
{"a"}
)[a]
)
in
Custom2
1. Можно реализовать полученные данные для одного пользователя, в одну строку? (то есть 50 публикаций в одну строку, в примере на Листе1 как нужно, на Листе2 как сейчас есть) 2. Как реализоваться выбор данных при условии? Допустим если мы разбираем первый кластер и он GraphImage то берем одни данные, если это GrahpVideo то другие и тд? Я накидал пример, но не знаю куда это вставлять 3. Есть два вида GraphVideo, у одного есть product_type у другого нету, как сделать чтобы различал два типа?
Выбор данных при условии:
Код
if typename = "GraphVideo" (product_type) then
( "typename" = "GraphVideo"
"id",
"shortcode",
"edge_media_to_caption":{"edges":[{"node":{"text":""}}]},
"edge_media_to_comment":{"count":},
"comments_disabled",
"taken_at_timestamp",
"edge_media_preview_like":{"count":}
"location",
"thumbnail_src",
"product_type",
"title",
"video_duration",
"video_view_count" )
if typename = "GraphImage" then
( "typename" = "GraphVideo",
"id",
"shortcode",
"accessibility_caption",
"edge_media_to_caption",
"edge_media_to_comment",
"comments_disabled",
"taken_at_timestamp",
"edge_media_preview_like",
"location",
"thumbnail_src" )
if typename = "GraphVideo" then
( "__typename",
"id",
"shortcode",
"edge_media_to_caption",
"edge_media_to_comment",
"comments_disabled",
"taken_at_timestamp",
"edge_media_preview_like",
"location",
"thumbnail_src",
"video_view_count" )
if typename = "GraphSidecar" then
( "__typename",
"id",
"shortcode",
"edge_media_to_caption",
"edge_media_to_comment",
"comments_disabled",
"taken_at_timestamp",
"edge_media_preview_like",
"thumbnail_src" )
// Запрос1
let
Source = let
a = (a) =>
List.Transform(
Excel.CurrentWorkbook(){[Name = a]}[Content][Столбец1],
Text.From
)
in
Table.FromColumns({a("Таблица1"), a("Таблица2")}),
Custom1 = Table.AddColumn(
Source,
"a",
each let
json = Json.Document(Web.Contents(
"https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variables={""id"":"""&[Column1]&""",""first"":12,""after"":"""&[Column2]&"""}"
)),
tbl = Table.FromRecords(
List.Transform(json[data][user][edge_owner_to_timeline_media][edges], each [node]?),
null,
2
),
transform = Table.ReplaceValue(tbl, null, null,
(a, b, c) => let
a = if a is record
then Record.ToList(a){0}
else a,
b = if a is list
then if a{0}[node]? <> null
then a{0}[node][text]
else Table.FromRecords(a)
else a
in
b,
{"edge_media_to_caption", "edge_media_to_comment", "edge_media_preview_like", "owner", "thumbnail_resources"}
),
expand = Table.Buffer(Table.ExpandRecordColumn(transform, "dimensions", {"height", "width"}, {"dimensions.height", "dimensions.width"})),
grouped = Table.Group(expand,"__typename",{"a",each Table.AddIndexColumn(_,"i")})[a]
in
if Table.RowCount(tbl) > 0 then Table.Combine(grouped) else #table({},{})
),
Custom2 = Table.Combine(
Table.ReplaceValue( Custom1, each [Column1], each [Column2],
(a, b, c) => Table.AddColumn(Table.AddColumn(a, "ID", each b), "after", each c),
{"a"}
)[a]
),
Typed = Table.TransformColumnTypes(Custom2,{{"i", Int64.Type}}),
Unpivot = Table.UnpivotOtherColumns(Typed, {"ID", "after", "__typename","i"}, "Атрибут", "Значение")
in
Unpivot
Есть пару нюансов 1. Можно сделать данные в одну строку для одного аккаунта? Это очень нужно... желаемый результат на Листе1 2. Подскажите пожалуйста, почему нет значений в для Id 1901233123 GraphVideo - video_view_count, прикрепляю скрин.
let
Source = let
a = (a) =>
List.Transform(
Excel.CurrentWorkbook(){[Name = a]}[Content][Столбец1],
Text.From
)
in
Table.FromColumns({a("Таблица1"), a("Таблица2")}),
Custom1 = Table.AddColumn(
Source,
"a",
each let
json = Json.Document(Web.Contents(
"https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variables={""id"":"""&[Column1]&""",""first"":12,""after"":"""&[Column2]&"""}"
)),
tbl = Table.Combine(
List.Transform(json[data][user][edge_owner_to_timeline_media][edges], each Table.FromRecords({[node]?}))
),
transform = Table.ReplaceValue(tbl, null, null,
(a, b, c) => let
a = if a is record
then Record.ToList(a){0}
else a,
b = if a is list
then if a{0}[node]? <> null
then a{0}[node][text]
else Table.FromRecords(a)
else a
in
b,
{"edge_media_to_caption", "edge_media_to_comment", "edge_media_preview_like", "owner", "thumbnail_resources"}
),
expand = Table.ExpandRecordColumn(transform, "dimensions", {"height", "width"}, {"dimensions.height", "dimensions.width"}),
grouped = Table.Group(expand,"__typename",{"a",each Table.AddIndexColumn(_,"i")})[a]
in
if Table.RowCount(tbl) > 0 then Table.Combine(grouped) else tbl
),
Custom2 = Table.Combine(
Table.ReplaceValue( Custom1, each [Column1], each [Column2],
(a, b, c) => Table.AddColumn(Table.AddColumn(a, "ID", each b), "after", each c),
{"a"}
)[a]
),
Typed = Table.TransformColumnTypes(Custom2,{{"i", Int64.Type}}),
Unpivot = Table.UnpivotOtherColumns(Typed, {"ID", "after", "__typename","i"}, "Атрибут", "Значение")
in
Unpivot
Запрос с объединением в одну запись
Код
let
Source = let
a = (a) =>
List.Transform(
Excel.CurrentWorkbook(){[Name = a]}[Content][Столбец1],
Text.From
)
in
Table.FromColumns({a("Таблица1"), a("Таблица2")}),
Custom1 = Table.AddColumn(
Source,
"a",
each let
json = Json.Document(Web.Contents(
"https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variables={""id"":"""&[Column1]&""",""first"":12,""after"":"""&[Column2]&"""}"
)),
tbl = Table.Combine(
List.Transform(json[data][user][edge_owner_to_timeline_media][edges], each Table.FromRecords({[node]?}))
),
transform = Table.ReplaceValue(tbl, null, null,
(a, b, c) => let
a = if a is record
then Record.ToList(a){0}
else a,
b = if a is list
then if a{0}[node]? <> null
then a{0}[node][text]
else Table.FromRecords(a)
else a
in
b,
{"edge_media_to_caption", "edge_media_to_comment", "edge_media_preview_like", "owner", "thumbnail_resources"}
),
expand = Table.ExpandRecordColumn(transform, "dimensions", {"height", "width"}, {"dimensions.height", "dimensions.width"}),
columns = List.Buffer(Table.ColumnNames(expand)),
indexed = Table.ToRecords(Table.AddIndexColumn(expand,"i")),
records = List.Transform(indexed,(r)=>Record.RenameFields(Record.RemoveFields(r,"i"),List.Zip({columns,List.Transform(columns, each Text.From(r[i])&"|"&_)})))
in
if Table.RowCount(tbl) > 0 then Table.FromRecords({Record.Combine(records)}) else tbl
),
Custom2 = Table.Combine(
Table.ReplaceValue( Custom1, each [Column1], each [Column2],
(a, b, c) => Table.AddColumn(Table.AddColumn(a, "ID владельца", each b), "after", each c),
{"a"}
)[a]
),
Demote = Table.DemoteHeaders(Custom2),
Transp = Table.Transpose(Demote),
Split = Table.SplitColumn(Transp, "Column1", Splitter.SplitTextByDelimiter("|", QuoteStyle.Csv), 2),
Replace = Table.ReplaceValue(Split,"id","ID публикации",Replacer.ReplaceValue,{"Column1.2"}),
Result = Table.Transpose(Replace)
in
Result